From a946eb07be91dbc045abaf5cf5ee5ecf4b2fb474 Mon Sep 17 00:00:00 2001 From: marko-kraemer Date: Sun, 4 Jan 2026 01:19:00 -0500 Subject: [PATCH 001/229] - TTFT optimisations backend - Deactivate Memory feature - packages/shared/ for mobile & frontend - mv /frontend to /apps/mobile - migrate to pnpm --- .../plans/shared_package_refactoring.plan.md | 435 + .gitignore | 3 + {frontend => apps/frontend}/.dockerignore | 0 {frontend => apps/frontend}/.env.example | 0 {frontend => apps/frontend}/.gitignore | 0 {frontend => apps/frontend}/.npmrc | 0 {frontend => apps/frontend}/.prettierignore | 0 {frontend => apps/frontend}/.prettierrc | 0 {frontend => apps/frontend}/Dockerfile | 0 {frontend => apps/frontend}/README.md | 0 {frontend => apps/frontend}/components.json | 0 {frontend => apps/frontend}/eslint.config.mjs | 0 .../frontend}/instrumentation-client.ts | 0 {frontend => apps/frontend}/next | 0 {frontend => apps/frontend}/next.config.ts | 3 + {frontend => apps/frontend}/package-lock.json | 0 {frontend => apps/frontend}/package.json | 13 + .../frontend}/postcss.config.mjs | 0 .../frontend}/public/Logomark-Black.png | Bin .../frontend}/public/Logomark.svg | 0 {frontend => apps/frontend}/public/banner.png | Bin .../frontend}/public/favicon-light.png | Bin .../frontend}/public/favicon.png | Bin .../fonts/roobert/RoobertItalicsVF.woff2 | Bin .../fonts/roobert/RoobertMonoItalicsVF.woff2 | Bin .../fonts/roobert/RoobertMonoUprightsVF.woff2 | Bin .../fonts/roobert/RoobertUprightsVF.woff2 | Bin .../frontend}/public/grain-texture.png | Bin .../frontend}/public/images/canvas/create.png | Bin .../frontend}/public/images/canvas/edit.png | Bin .../public/images/canvas/remove-bg.png | Bin .../public/images/canvas/upscale.png | Bin .../image-styles/abstract_organic-min.png | Bin .../images/image-styles/anime_forest-min.png | Bin .../image-styles/comic_book_robot-min.png | Bin .../digital_art_cyberpunk-min.png | Bin .../image-styles/geometric_crystal-min.png | Bin .../image-styles/impressionist_garden-min.png | Bin .../image-styles/isometric_bedroom-min.png | Bin .../image-styles/minimalist_coffee-min.png | Bin .../image-styles/neon_jellyfish-min.png | Bin .../image-styles/oil_painting_villa-min.png | Bin .../image-styles/pastel_landscape-min.png | Bin .../image-styles/photorealistic_eagle-min.png | Bin .../image-styles/surreal_islands-min.png | Bin .../images/image-styles/vintage_diner-min.png | Bin .../image-styles/watercolor_garden-min.png | Bin .../public/images/landing-showcase/data.png | Bin .../public/images/landing-showcase/docs.png | Bin .../public/images/landing-showcase/images.png | Bin .../images/landing-showcase/research.png | Bin .../public/images/landing-showcase/slides.png | Bin .../public/images/models/Anthropic.svg | 0 .../frontend}/public/images/models/Gemini.svg | 0 .../frontend}/public/images/models/Grok.svg | 0 .../public/images/models/Moonshot.svg | 0 .../frontend}/public/images/models/OAI.svg | 0 .../presentation-templates/architect-min.png | Bin .../black_and_white_clean-min.png | Bin .../presentation-templates/colorful-min.png | Bin .../competitor_analysis_blue-min.png | Bin .../elevator_pitch-min.png | Bin .../presentation-templates/gamer_gray-min.png | Bin .../presentation-templates/green-min.png | Bin .../presentation-templates/hipster-min.png | Bin .../presentation-templates/minimalist-min.png | Bin .../minimalist_2-min.png | Bin .../numbers_clean-min.png | Bin .../numbers_colorful-min.png | Bin .../presentation-templates/portfolio-min.png | Bin .../premium_black-min.png | Bin .../premium_green-min.png | Bin .../professor_gray-min.png | Bin .../presentation-templates/startup-min.png | Bin .../presentation-templates/textbook-min.png | Bin .../public/images/video-styles/abstract.png | Bin .../public/images/video-styles/animation.png | Bin .../public/images/video-styles/cinematic.png | Bin .../public/images/video-styles/nature.png | Bin .../public/images/video-styles/person.png | Bin .../public/images/video-styles/product.png | Bin .../public/kortix-brandmark-effect-full.svg | 0 .../public/kortix-brandmark-effect.svg | 0 .../frontend}/public/kortix-symbol.svg | 0 .../frontend}/public/logo_black.png | Bin .../frontend}/public/logomark-white.svg | 0 .../frontend}/public/manifest.json | 0 .../frontend}/public/plan-icons/basic.svg | 0 .../frontend}/public/plan-icons/plus.svg | 0 .../frontend}/public/plan-icons/pro.svg | 0 .../frontend}/public/plan-icons/ultra.svg | 0 {frontend => apps/frontend}/public/robots.txt | 0 .../public/share-page/og-fallback.png | Bin .../public/showcase/data/dashboard.png | Bin .../frontend}/public/showcase/image/logo.png | Bin .../public/showcase/image/mockup-board.png | Bin .../public/showcase/presentation/browser.png | Bin .../public/showcase/presentation/slide1.png | Bin .../public/showcase/presentation/slide2.png | Bin .../frontend}/public/wordmark.svg | 0 .../app/(dashboard)/admin/analytics/page.tsx | 0 .../app/(dashboard)/admin/billing/page.tsx | 0 .../app/(dashboard)/admin/feedback/page.tsx | 0 .../(dashboard)/admin/notifications/page.tsx | 0 .../(dashboard)/agents/[threadId]/layout.tsx | 0 .../(dashboard)/agents/[threadId]/page.tsx | 0 .../agents/[threadId]/redirect-page.tsx | 0 .../agents/config/[agentId]/page.tsx | 0 .../[agentId]/screens/instructions-screen.tsx | 0 .../[agentId]/screens/integrations-screen.tsx | 0 .../[agentId]/screens/knowledge-screen.tsx | 0 .../config/[agentId]/screens/tools-screen.tsx | 0 .../[agentId]/screens/triggers-screen.tsx | 0 .../[agentId]/screens/workflows-screen.tsx | 0 .../src/app/(dashboard)/agents/layout.tsx | 0 .../src/app/(dashboard)/agents/page.tsx | 0 .../(dashboard)/credits-explained/page.tsx | 0 .../src/app/(dashboard)/dashboard/page.tsx | 0 .../src/app/(dashboard)/knowledge/page.tsx | 44 + .../frontend}/src/app/(dashboard)/layout.tsx | 0 .../app/(dashboard)/onboarding-demo/page.tsx | 0 .../[projectId]/thread/[threadId]/layout.tsx | 0 .../[projectId]/thread/[threadId]/page.tsx | 0 .../(dashboard)/settings/api-keys/layout.tsx | 0 .../(dashboard)/settings/api-keys/page.tsx | 0 .../settings/credentials/layout.tsx | 0 .../(dashboard)/settings/credentials/page.tsx | 0 .../(dashboard)/thread/[threadId]/page.tsx | 0 .../src/app/(dashboard)/triggers/page.tsx | 0 .../frontend}/src/app/(home)/berlin/page.tsx | 1 - .../src/app/(home)/enterprise/page.tsx | 0 .../frontend}/src/app/(home)/layout.tsx | 0 .../frontend}/src/app/(home)/milano/page.tsx | 1 - .../frontend}/src/app/(home)/page.tsx | 0 .../frontend}/src/app/(home)/status/page.tsx | 0 .../frontend}/src/app/(home)/support/page.tsx | 0 .../frontend}/src/app/activate-trial/page.tsx | 0 .../frontend}/src/app/agents-101/layout.tsx | 0 .../frontend}/src/app/agents-101/page.tsx | 0 .../frontend}/src/app/api/edge-flags/route.ts | 0 .../integrations/[provider]/callback/route.ts | 0 .../src/app/api/og/template/route.tsx | 0 .../src/app/api/share-page/og-image/route.tsx | 0 .../api/triggers/[triggerId]/webhook/route.ts | 0 .../frontend}/src/app/auth/actions.ts | 0 .../frontend}/src/app/auth/callback/route.ts | 0 .../src/app/auth/github-popup/page.tsx | 0 .../frontend}/src/app/auth/page.tsx | 0 .../frontend}/src/app/auth/password/page.tsx | 0 .../src/app/auth/phone-verification/page.tsx | 0 .../src/app/auth/reset-password/page.tsx | 0 .../frontend}/src/app/checkout/page.tsx | 0 .../frontend}/src/app/favicon.ico | Bin .../frontend}/src/app/fonts/roobert-mono.ts | 0 .../frontend}/src/app/fonts/roobert.ts | 0 .../frontend}/src/app/global-error.tsx | 0 .../frontend}/src/app/globals.css | 1 + .../frontend}/src/app/help/credits/page.tsx | 0 .../frontend}/src/app/help/layout.tsx | 0 .../frontend}/src/app/help/page.tsx | 0 .../frontend}/src/app/layout.tsx | 0 .../frontend}/src/app/legal/page.tsx | 0 .../frontend}/src/app/monitoring/route.ts | 0 .../frontend}/src/app/not-found.tsx | 0 .../src/app/react-query-provider.tsx | 0 .../frontend}/src/app/setting-up/page.tsx | 0 .../_components/SharePageWrapper.tsx | 0 .../src/app/share/[threadId]/layout.tsx | 0 .../src/app/share/[threadId]/page.tsx | 0 .../frontend}/src/app/sitemap.ts | 0 .../frontend}/src/app/subscription/page.tsx | 0 .../frontend}/src/app/suna/page.tsx | 0 .../src/app/templates/[shareId]/layout.tsx | 0 .../src/app/templates/[shareId]/page.tsx | 0 .../src/assets/animations/loading-black.json | 0 .../src/assets/animations/loading-white.json | 0 .../frontend}/src/components/AuthProvider.tsx | 0 .../frontend}/src/components/GithubSignIn.tsx | 0 .../frontend}/src/components/GoogleSignIn.tsx | 0 .../components/admin/admin-feedback-table.tsx | 0 .../admin/admin-user-details-dialog.tsx | 0 .../src/components/admin/admin-user-table.tsx | 0 .../components/agents/AgentVersionManager.tsx | 0 .../agents/agent-configuration-dialog.tsx | 0 .../agents/agent-count-limit-dialog.tsx | 0 .../agents/agent-creation-modal.tsx | 0 .../agents/agent-mcp-configuration.tsx | 0 .../src/components/agents/agent-selector.tsx | 0 .../agents/agent-version-switcher.tsx | 0 .../src/components/agents/agents-grid.tsx | 0 .../agents/composio/composio-app-card.tsx | 0 .../composio/composio-connections-section.tsx | 0 .../agents/composio/composio-connector.tsx | 0 .../composio-credential-profile-selector.tsx | 0 .../composio/composio-profile-selector.tsx | 0 .../agents/composio/composio-registry.tsx | 0 .../composio/composio-tools-manager.tsx | 0 .../composio/composio-tools-selector.tsx | 0 .../agents/config/agent-editor-dialog.tsx | 0 .../config/agent-icon-editor-dialog.tsx | 0 .../components/agents/config/icon-picker.tsx | 0 .../src/components/agents/config/index.ts | 0 .../agents/config/model-selector.tsx | 0 .../agents/config/version-alert.tsx | 0 .../agents/create-version-button.tsx | 0 .../agents/custom-agents-page/header.tsx | 0 .../agents/custom-agents-page/index.ts | 0 .../custom-agents-page/loading-skeleton.tsx | 0 .../marketplace-section-header.tsx | 0 .../custom-agents-page/marketplace-tab.tsx | 0 .../custom-agents-page/my-agents-tab.tsx | 0 .../custom-agents-page/my-templates-tab.tsx | 0 .../custom-agents-page/publish-dialog.tsx | 0 .../agents/custom-agents-page/search-bar.tsx | 0 .../custom-agents-page/tabs-navigation.tsx | 0 .../agents/docs-agent/advanced-toolbar.tsx | 0 .../agents/docs-agent/custom-highlight.ts | 0 .../components/agents/docs-agent/editor.tsx | 0 .../editor/controls/color-picker.tsx | 0 .../editor/controls/font-selector.tsx | 0 .../editor/controls/highlight-picker.tsx | 0 .../editor/controls/image-dialog.tsx | 0 .../editor/controls/link-dialog.tsx | 0 .../editor/controls/table-dropdown.tsx | 0 .../docs-agent/extensions/page-break.ts | 0 .../components/agents/docs-agent/ruler.tsx | 0 .../agents/docs-agent/simple-toolbar.tsx | 0 .../src/components/agents/empty-state.tsx | 0 .../installation/custom-server-step.tsx | 0 .../streamlined-install-dialog.tsx | 0 .../streamlined-profile-connector.tsx | 0 .../installation/trigger-config-step.tsx | 0 .../installation/trigger-variables-step.tsx | 0 .../components/agents/installation/types.ts | 0 .../agents/integrations-registry.tsx | 0 .../components/agents/json-import-dialog.tsx | 0 .../agents/knowledge-base/agent-kb-tree.tsx | 0 .../src/components/agents/loading-state.tsx | 0 .../marketplace-agent-preview-dialog.tsx | 0 .../agents/mcp/configured-mcp-list.tsx | 0 .../agents/mcp/custom-mcp-dialog.tsx | 0 .../agents/mcp/mcp-configuration-new.tsx | 0 .../components/agents/mcp/mcp-server-card.tsx | 0 .../components/agents/mcp/tools-loader.tsx | 0 .../components/agents/mcp/tools-manager.tsx | 0 .../src/components/agents/mcp/types.ts | 0 .../components/agents/new-agent-dialog.tsx | 0 .../src/components/agents/pagination.tsx | 0 .../src/components/agents/results-info.tsx | 0 .../tools/granular-tool-configuration.tsx | 0 .../components/agents/tools/tool-groups.ts | 0 .../triggers/agent-triggers-configuration.tsx | 0 .../triggers/configured-triggers-list.tsx | 0 .../triggers/event-based-trigger-dialog.tsx | 0 .../triggers/one-click-integrations.tsx | 0 .../triggers/providers/event-config.tsx | 0 .../triggers/providers/schedule-config.tsx | 0 .../providers/simplified-schedule-config.tsx | 0 .../agents/triggers/trigger-browse-dialog.tsx | 0 .../src/components/agents/triggers/types.ts | 0 .../src/components/agents/triggers/utils.tsx | 0 .../agents/upcoming-runs-dropdown.tsx | 0 .../agents/version-inline-editor.tsx | 0 .../analytics/auth-event-tracker.tsx | 0 .../analytics/route-change-tracker.tsx | 0 .../announcements/announcement-dialog.tsx | 0 .../components/memories-announcement.tsx | 0 .../src/components/announcements/index.ts | 0 .../announcements/kortix-app-banners.tsx | 0 .../announcements/mobile-app-interstitial.tsx | 0 .../src/components/announcements/registry.ts | 5 +- .../announcements/technical-issue-banner.tsx | 0 .../auth/background-aal-checker.tsx | 0 .../src/components/auth/example-showcase.tsx | 0 .../phone-verification/otp-verification.tsx | 0 .../auth/phone-verification/phone-input.tsx | 0 .../phone-verification-page.tsx | 0 .../src/components/auth/release-badge.tsx | 0 .../components/billing/credit-purchase.tsx | 0 .../billing/credit-transactions.tsx | 0 .../src/components/billing/credit-usage.tsx | 0 .../components/billing/credits-display.tsx | 0 .../billing/downgrade-confirmation-dialog.tsx | 0 .../frontend}/src/components/billing/index.ts | 0 .../src/components/billing/plan-utils.ts | 0 .../src/components/billing/pricing/index.ts | 0 .../billing/pricing/plan-selection-modal.tsx | 0 .../billing/pricing/pricing-section.tsx | 0 .../billing/scheduled-downgrade-card.tsx | 0 .../subscription-cancellation-card.tsx | 0 .../src/components/billing/thread-usage.tsx | 0 .../src/components/billing/tier-badge.tsx | 0 .../billing/upgrade-celebration.tsx | 0 .../src/components/cookie-consent.tsx | 0 .../dashboard/ai-worker-templates.tsx | 0 .../dashboard/custom-agents-section.tsx | 0 .../dashboard/dashboard-content.tsx | 4 - .../components/dashboard/examples/index.tsx | 0 .../components/dashboard/layout-content.tsx | 0 .../dashboard/maintenance-banner.tsx | 0 .../dashboard/maintenance-notice.tsx | 0 .../components/dashboard/suna-modes-panel.tsx | 0 .../components/dashboard/trial-management.tsx | 0 .../dashboard/usage-limits-popover.tsx | 0 .../src/components/debug/presence-debug.tsx | 0 .../env-manager/local-env-manager.tsx | 0 .../components/file-editors/code-editor.tsx | 0 .../src/components/file-editors/index.tsx | 0 .../file-editors/markdown-editor.tsx | 0 .../file-editors/markdown-toolbar.tsx | 0 .../src/components/file-editors/utils.ts | 0 .../components/file-layouts/FileCarousel.tsx | 0 .../src/components/file-layouts/FileGrid.tsx | 0 .../file-previews/DocumentPreview.tsx | 0 .../src/components/file-previews/FileCard.tsx | 0 .../components/file-previews/ImagePreview.tsx | 0 .../components/file-previews/PdfPreview.tsx | 0 .../file-previews/SpreadsheetPreview.tsx | 0 .../file-renderers/JsonRenderer.tsx | 0 .../file-renderers/binary-renderer.tsx | 0 .../file-renderers/canvas-renderer.tsx | 0 .../file-renderers/csv-renderer.tsx | 0 .../file-renderers/html-renderer.tsx | 0 .../file-renderers/image-renderer.tsx | 0 .../src/components/file-renderers/index.tsx | 0 .../file-renderers/pdf-renderer.tsx | 0 .../file-renderers/pptx-renderer.tsx | 0 .../file-renderers/video-renderer.tsx | 0 .../file-renderers/xlsx-renderer.tsx | 0 .../src/components/help/help-search-modal.tsx | 0 .../src/components/help/help-sidebar.tsx | 0 .../home/dashboard-promo-banner.tsx | 0 .../src/components/home/footer-section.tsx | 0 .../src/components/home/hero-section.tsx | 4 - .../frontend}/src/components/home/icons.tsx | 0 .../src/components/home/locale-switcher.tsx | 0 .../src/components/home/nav-menu.tsx | 0 .../frontend}/src/components/home/navbar.tsx | 0 .../src/components/home/promo-banner.tsx | 0 .../src/components/home/showcase-section.tsx | 0 .../src/components/home/simple-footer.tsx | 0 .../src/components/home/theme-provider.tsx | 0 .../src/components/home/theme-toggle.tsx | 0 .../src/components/home/wordmark-footer.tsx | 0 .../src/components/i18n-provider.tsx | 0 .../knowledge-base/edit-summary-modal.tsx | 0 .../kb-delete-confirm-dialog.tsx | 0 .../knowledge-base/kb-file-preview-modal.tsx | 0 .../knowledge-base/knowledge-base-header.tsx | 0 .../knowledge-base/knowledge-base-manager.tsx | 0 .../knowledge-base/knowledge-base-page.tsx | 0 .../knowledge-base/shared-kb-tree.tsx | 0 .../knowledge-base/unified-kb-entry-modal.tsx | 0 .../src/components/layout/app-providers.tsx | 0 .../maintenance/maintenance-page.tsx | 0 .../src/components/markdown/index.tsx | 0 .../components/markdown/unified-markdown.tsx | 0 .../src/components/memory/MemoryCard.tsx | 0 .../src/components/memory/MemoryList.tsx | 0 .../src/components/memory/MemorySettings.tsx | 41 + .../notifications/notification-center.tsx | 0 .../notifications/notification-dropdown.tsx | 0 .../notifications/notification-settings.tsx | 0 .../src/components/onboarding/README.md | 0 .../agent-config/agent-configuration.tsx | 0 .../agent-config/configuration-utils.ts | 0 .../agent-config/field-renderer.tsx | 0 .../multi-agent-configuration.tsx | 0 .../src/components/onboarding/index.ts | 0 .../onboarding/new-onboarding-page.tsx | 0 .../onboarding/onboarding-config.tsx | 0 .../onboarding/onboarding-provider.tsx | 0 .../components/onboarding/shared/context.ts | 0 .../src/components/onboarding/shared/data.ts | 0 .../onboarding/shared/icon-renderer.tsx | 0 .../onboarding/shared/progress-indicator.tsx | 0 .../onboarding/shared/step-wrapper.tsx | 0 .../src/components/onboarding/shared/types.ts | 0 .../onboarding/steps/ceo-intro-step.tsx | 0 .../onboarding/steps/completion-step.tsx | 0 .../onboarding/steps/smart-context-step.tsx | 0 .../onboarding/steps/team-invitation-step.tsx | 0 .../onboarding/steps/user-type-step.tsx | 0 .../steps/workforce-selection-step.tsx | 0 .../src/components/posthog-identify.tsx | 0 .../src/components/presence-provider.tsx | 0 .../src/components/referrals/index.ts | 0 .../referrals/referral-code-dialog.tsx | 0 .../referrals/referral-code-section.tsx | 0 .../components/referrals/referral-dialog.tsx | 0 .../referrals/referral-email-invitation.tsx | 0 .../referrals/referral-stats-cards.tsx | 0 .../components/referrals/referrals-tab.tsx | 0 .../settings/knowledge-base-settings.tsx | 42 + .../components/settings/language-switcher.tsx | 0 .../settings/user-settings-modal.tsx | 8 +- .../src/components/shared/prompt-examples.tsx | 0 .../frontend}/src/components/sidebar/cta.tsx | 0 .../src/components/sidebar/date-picker.tsx | 0 .../sidebar/kortix-enterprise-modal.tsx | 0 .../src/components/sidebar/kortix-logo.tsx | 0 .../components/sidebar/nav-agents-view.tsx | 0 .../src/components/sidebar/nav-agents.tsx | 0 .../components/sidebar/nav-global-config.tsx | 2 +- .../src/components/sidebar/nav-main.tsx | 0 .../src/components/sidebar/nav-projects.tsx | 132 + .../src/components/sidebar/nav-tasks.tsx | 359 + .../components/sidebar/nav-trigger-runs.tsx | 0 .../sidebar/nav-user-with-teams.tsx | 0 .../src/components/sidebar/search-search.tsx | 0 .../src/components/sidebar/share-modal.tsx | 0 .../src/components/sidebar/sidebar-left.tsx | 0 .../src/components/sidebar/thread-icon.tsx | 0 .../sidebar/thread-search-modal.tsx | 0 .../src/components/team-switcher.tsx | 0 .../src/components/theme-provider.tsx | 0 .../thread/ContextUsageIndicator.tsx | 0 .../thread/DeleteConfirmationDialog.tsx | 0 .../thread/HealthCheckedVncIframe.tsx | 0 .../src/components/thread/ThreadComponent.tsx | 0 .../thread/agent-run-limit-banner.tsx | 0 .../thread/agent-run-limit-dialog.tsx | 0 .../thread/chat-input/chat-input.tsx | 17 +- .../thread/chat-input/chat-snack.tsx | 0 .../thread/chat-input/custom-model-dialog.tsx | 0 .../thread/chat-input/file-upload-handler.tsx | 0 .../chat-input/floating-tool-preview.tsx | 0 .../thread/chat-input/unified-config-menu.tsx | 0 .../thread/chat-input/upgrade-preview.tsx | 0 .../thread/chat-input/voice-recorder.tsx | 0 .../thread/content/ApifyApprovalInline.tsx | 0 .../thread/content/MediaGenerationInline.tsx | 0 .../thread/content/PlaybackControls.tsx | 0 .../content/PlaybackFloatingControls.tsx | 0 .../thread/content/ShowToolStream.tsx | 0 .../thread/content/SimplePlaybackControls.tsx | 0 .../thread/content/StreamingText.tsx | 8 +- .../thread/content/ThinkingCollapsible.tsx | 0 .../thread/content/ThreadContent.tsx | 40 +- .../thread/content/ThreadSkeleton.tsx | 0 .../thread/content/agent-avatar.tsx | 0 .../thread/content/composio-url-detector.tsx | 0 .../src/components/thread/content/loader.tsx | 0 .../thread/content/usePlaybackControls.tsx | 0 .../file-attachment/AttachmentGroup.tsx | 0 .../thread/file-attachment/index.tsx | 0 .../src/components/thread/file-browser.tsx | 0 .../src/components/thread/iframe-preview.tsx | 0 .../kortix-computer/FileBrowserView.tsx | 0 .../thread/kortix-computer/FileViewerView.tsx | 0 .../thread/kortix-computer/KortixComputer.tsx | 3 +- .../kortix-computer/KortixComputerHeader.tsx | 0 .../thread/kortix-computer/VersionBanner.tsx | 0 .../kortix-computer/components/AppWindow.tsx | 0 .../kortix-computer/components/Desktop.tsx | 0 .../components/DesktopContextMenu.tsx | 0 .../components/DesktopIcons.tsx | 0 .../kortix-computer/components/Dock.tsx | 0 .../kortix-computer/components/EmptyState.tsx | 0 .../components/EnhancedFileBrowser.tsx | 0 .../components/FileContextMenu.tsx | 0 .../components/FileInfoContent.tsx | 0 .../kortix-computer/components/Icons.tsx | 0 .../components/LoadingState.tsx | 0 .../components/NavigationControls.tsx | 0 .../components/PanelHeader.tsx | 0 .../components/QuickLaunch.tsx | 0 .../components/SSHTerminal.tsx | 0 .../components/SandboxInfoCard.tsx | 0 .../components/SpreadsheetApp.tsx | 0 .../components/SystemInfoContent.tsx | 0 .../kortix-computer/components/Terminal.tsx | 0 .../components/ToolbarButtons.tsx | 0 .../kortix-computer/components/ViewToggle.tsx | 0 .../thread/kortix-computer/index.ts | 0 .../src/components/thread/layout/index.ts | 0 .../thread/layout/thread-layout.tsx | 0 .../src/components/thread/thread-error.tsx | 0 .../components/thread/thread-site-header.tsx | 0 .../thread/tool-views/BrowserToolView.tsx | 0 .../thread/tool-views/CompleteToolView.tsx | 0 .../thread/tool-views/GenericToolView.tsx | 0 .../thread/tool-views/KbToolView.tsx | 0 .../thread/tool-views/UploadFileToolView.tsx | 0 .../thread/tool-views/WebCrawlToolView.tsx | 0 .../apify-tool/ApifyApprovalCard.tsx | 0 .../thread/tool-views/apify-tool/ToolView.tsx | 0 .../thread/tool-views/apify-tool/_utils.ts | 0 .../tool-views/canvas-tool/CanvasToolView.tsx | 0 .../thread/tool-views/canvas-tool/_utils.ts | 0 .../check-profile-connection/_utils.ts | 0 .../check-profile-connection.tsx | 0 .../CheckCommandOutputToolView.tsx | 0 .../command-tool/CommandToolView.tsx | 0 .../command-tool/ListCommandsToolView.tsx | 0 .../command-tool/TerminateCommandToolView.tsx | 0 .../thread/tool-views/command-tool/_utils.ts | 0 .../CompanySearchToolView.tsx | 0 .../tool-views/company-search-tool/_utils.ts | 0 .../configure-agent-integration/_utils.ts | 0 .../configure-agent-integration.tsx | 0 .../configure-profile-for-agent/_utils.ts | 0 .../configure-profile-for-agent.tsx | 0 .../connect-credential-profile/_utils.ts | 0 .../connect-credential-profile.tsx | 0 .../create-agent-scheduled-trigger/_utils.ts | 0 .../create-agent-scheduled-trigger.tsx | 0 .../_utils.ts | 0 .../create-credential-profile-for-agent.tsx | 0 .../create-credential-profile/_utils.ts | 0 .../create-credential-profile.tsx | 0 .../tool-views/create-event-trigger/_utils.ts | 0 .../create-event-trigger.tsx | 0 .../tool-views/create-new-agent/_utils.ts | 0 .../create-new-agent/create-new-agent.tsx | 0 .../designer-tool/DesignerToolView.tsx | 0 .../thread/tool-views/designer-tool/_utils.ts | 0 .../discover-mcp-tools-for-agent/_utils.ts | 0 .../discover-mcp-tools-for-agent.tsx | 0 .../discover-user-mcp-servers/_utils.ts | 0 .../discover-user-mcp-servers.tsx | 0 .../DocumentParserToolView.tsx | 0 .../tool-views/document-parser-tool/_utils.ts | 0 .../ExpandMessageToolView.tsx | 0 .../tool-views/expand-message-tool/_utils.ts | 0 .../expose-port-tool/ExposePortToolView.tsx | 0 .../tool-views/expose-port-tool/_utils.ts | 0 .../file-operation/FileEditToolView.tsx | 0 .../file-operation/FileOperationToolView.tsx | 0 .../tool-views/file-operation/_utils.ts | 0 .../file-reader-tool/FileReaderToolView.tsx | 0 .../tool-views/file-reader-tool/_utils.ts | 0 .../tool-views/get-app-details/_utils.ts | 0 .../get-app-details/get-app-details.tsx | 0 .../get-credential-profiles/_utils.ts | 0 .../get-credential-profiles.tsx | 0 .../get-current-agent-config/_utils.ts | 0 .../get-current-agent-config.tsx | 0 .../ImageEditGenerateToolView.tsx | 0 .../image-edit-generate-tool/_utils.ts | 0 .../list-app-event-triggers/_utils.ts | 0 .../list-app-event-triggers.tsx | 0 .../tool-views/mcp-content-renderer.tsx | 0 .../thread/tool-views/mcp-format-detector.ts | 0 .../PeopleSearchToolView.tsx | 0 .../tool-views/people-search-tool/_utils.ts | 0 .../DeletePresentationToolView.tsx | 0 .../DeleteSlideToolView.tsx | 0 .../presentation-tools/ExportToolView.tsx | 0 .../FullScreenPresentationViewer.tsx | 0 .../ListPresentationTemplatesToolView.tsx | 0 .../ListPresentationsToolView.tsx | 0 .../PresentationSlideCard.tsx | 0 .../PresentationSlidePreview.tsx | 0 .../presentation-tools/PresentationViewer.tsx | 0 .../RealityDefenderToolView.tsx | 0 .../reality-defender-tool/_utils.ts | 0 .../search-mcp-servers-for-agent/_utils.ts | 0 .../search-mcp-servers-for-agent.tsx | 0 .../tool-views/search-mcp-servers/_utils.ts | 0 .../search-mcp-servers/search-mcp-servers.tsx | 0 .../see-image-tool/SeeImageToolView.tsx | 0 .../tool-views/see-image-tool/_utils.ts | 0 .../thread/tool-views/shared/AppIcon.tsx | 0 .../tool-views/shared/FileDownloadButton.tsx | 0 .../thread/tool-views/shared/ImageLoader.tsx | 0 .../thread/tool-views/shared/JsonViewer.tsx | 0 .../thread/tool-views/shared/LoadingState.tsx | 0 .../tool-views/shared/SmartJsonViewer.tsx | 0 .../shared/TaskCompletedFeedback.tsx | 0 .../sheets-tools/luckysheet-viewer.tsx | 0 .../sheets-tools/sheets-tool-view.tsx | 0 .../spreadsheet/SpreadsheetLoader.tsx | 0 .../spreadsheet/SpreadsheetSimulation.tsx | 0 .../spreadsheet/SpreadsheetToolview.tsx | 0 .../spreadsheet/SpreadsheetViewer.tsx | 0 .../spreadsheet/SyncStatusIndicator.tsx | 0 .../thread/tool-views/spreadsheet/_utils.ts | 0 .../spreadsheet/kortix-spreadsheet-styles.css | 0 .../spreadsheet/useSpreadsheetSync.ts | 0 .../tool-views/task-list/TaskListToolView.tsx | 0 .../thread/tool-views/task-list/_utils.ts | 0 .../thread/tool-views/tool-result-parser.ts | 0 .../src/components/thread/tool-views/types.ts | 0 .../thread/tool-views/update-agent/_utils.ts | 0 .../tool-views/update-agent/update-agent.tsx | 0 .../src/components/thread/tool-views/utils.ts | 0 .../tool-views/utils/presentation-utils.ts | 0 .../vapi-call/CallStatusToolView.tsx | 0 .../tool-views/vapi-call/EndCallToolView.tsx | 0 .../vapi-call/ListCallsToolView.tsx | 0 .../tool-views/vapi-call/MakeCallToolView.tsx | 0 .../vapi-call/MonitorCallToolView.tsx | 0 .../WaitForCallCompletionToolView.tsx | 0 .../thread/tool-views/vapi-call/_utils.ts | 0 .../tool-views/wait-tool/WaitToolView.tsx | 0 .../web-dev/GetProjectStructureView.tsx | 0 .../web-scrape-tool/WebScrapeToolView.tsx | 0 .../tool-views/web-scrape-tool/_utils.ts | 0 .../web-search-tool/WebSearchToolView.tsx | 11 +- .../tool-views/web-search-tool/_utils.ts | 0 .../tool-views/wrapper/ToolViewRegistry.tsx | 0 .../tool-views/wrapper/ToolViewWrapper.tsx | 0 .../thread/tool-views/wrapper/index.ts | 0 .../thread/tool-views/xml-parser.ts | 0 .../frontend}/src/components/thread/types.ts | 0 apps/frontend/src/components/thread/utils.ts | 150 + .../simplified-trigger-detail-panel.tsx | 0 .../triggers/trigger-creation-dialog.tsx | 0 .../triggers/triggers-page-header.tsx | 0 .../src/components/triggers/triggers-page.tsx | 0 .../frontend}/src/components/ui/accordion.tsx | 0 .../src/components/ui/alert-dialog.tsx | 0 .../frontend}/src/components/ui/alert.tsx | 0 .../src/components/ui/animated-bg.tsx | 0 .../src/components/ui/animated-shiny-text.tsx | 0 .../frontend}/src/components/ui/avatar.tsx | 0 .../frontend}/src/components/ui/badge.tsx | 0 .../src/components/ui/border-beam.tsx | 0 .../src/components/ui/breadcrumb.tsx | 0 .../frontend}/src/components/ui/button.tsx | 0 .../frontend}/src/components/ui/calendar.tsx | 0 .../frontend}/src/components/ui/card.tsx | 0 .../frontend}/src/components/ui/checkbox.tsx | 0 .../src/components/ui/code-block.tsx | 0 .../src/components/ui/collapsible.tsx | 0 .../frontend}/src/components/ui/command.tsx | 0 .../src/components/ui/context-menu.tsx | 0 .../frontend}/src/components/ui/csv-table.tsx | 0 .../src/components/ui/data-table.tsx | 0 .../src/components/ui/date-range-picker.tsx | 0 .../frontend}/src/components/ui/dialog.tsx | 0 .../frontend}/src/components/ui/drawer.tsx | 0 .../src/components/ui/dropdown-menu.tsx | 0 .../src/components/ui/dynamic-greeting.tsx | 0 .../src/components/ui/editable-markdown.tsx | 0 .../frontend}/src/components/ui/editable.tsx | 0 .../ui/expandable-markdown-editor.tsx | 0 .../src/components/ui/fancy-tabs.tsx | 0 .../src/components/ui/flickering-grid.tsx | 0 .../frontend}/src/components/ui/form.tsx | 0 .../src/components/ui/grain-icon.tsx | 0 .../src/components/ui/grain-text.tsx | 0 .../src/components/ui/icons/slack.tsx | 0 .../frontend}/src/components/ui/input.tsx | 0 .../frontend}/src/components/ui/kbd.tsx | 0 .../src/components/ui/kortix-loader.tsx | 0 .../frontend}/src/components/ui/label.tsx | 0 .../src/components/ui/mermaid-renderer.tsx | 0 .../src/components/ui/page-header.tsx | 0 .../src/components/ui/phone-input.tsx | 0 .../src/components/ui/pixel-art-editor.tsx | 0 .../src/components/ui/pixel-avatar.tsx | 0 .../frontend}/src/components/ui/popover.tsx | 0 .../frontend}/src/components/ui/portal.tsx | 0 .../frontend}/src/components/ui/progress.tsx | 0 .../src/components/ui/radio-group.tsx | 0 .../frontend}/src/components/ui/resizable.tsx | 0 .../frontend}/src/components/ui/ripple.tsx | 0 .../src/components/ui/scroll-area.tsx | 0 .../frontend}/src/components/ui/select.tsx | 0 .../frontend}/src/components/ui/separator.tsx | 0 .../ui/shadcn-io/code-block/index.tsx | 0 .../ui/shadcn-io/code-block/server.tsx | 0 .../frontend}/src/components/ui/sheet.tsx | 0 .../src/components/ui/shiny-text.tsx | 0 .../frontend}/src/components/ui/sidebar.tsx | 0 .../frontend}/src/components/ui/skeleton.tsx | 0 .../frontend}/src/components/ui/slider.tsx | 0 .../frontend}/src/components/ui/sonner.tsx | 0 .../src/components/ui/spotlight-card.tsx | 0 .../src/components/ui/status-overlay.tsx | 0 .../src/components/ui/submit-button.tsx | 0 .../frontend}/src/components/ui/switch.tsx | 0 .../frontend}/src/components/ui/table.tsx | 0 .../frontend}/src/components/ui/tabs.tsx | 0 .../frontend}/src/components/ui/tag-input.tsx | 0 .../frontend}/src/components/ui/textarea.tsx | 0 .../frontend}/src/components/ui/toggle.tsx | 0 .../frontend}/src/components/ui/tooltip.tsx | 0 .../src/components/ui/unified-agent-card.tsx | 0 .../src/components/ui/upgrade-dialog.tsx | 0 .../frontend}/src/hooks/account/index.ts | 0 .../src/hooks/account/use-account-deletion.ts | 0 .../src/hooks/account/use-account-setup.ts | 0 .../src/hooks/account/use-accounts.ts | 0 .../frontend}/src/hooks/admin/index.ts | 0 .../src/hooks/admin/use-admin-analytics.ts | 0 .../src/hooks/admin/use-admin-feedback.ts | 0 .../src/hooks/admin/use-admin-role.ts | 0 .../src/hooks/admin/use-admin-users.ts | 0 .../hooks/admin/use-notification-workflow.ts | 0 .../frontend}/src/hooks/agents/index.ts | 0 .../frontend}/src/hooks/agents/keys.ts | 0 .../hooks/agents/use-agent-export-import.ts | 0 .../hooks/agents/use-agent-icon-generation.ts | 0 .../src/hooks/agents/use-agent-tools.ts | 0 .../hooks/agents/use-agent-upcoming-runs.ts | 0 .../hooks/agents/use-agent-version-data.ts | 0 .../src/hooks/agents/use-agent-versions.ts | 0 .../frontend}/src/hooks/agents/use-agents.ts | 0 .../src/hooks/agents/use-custom-mcp-tools.ts | 0 .../src/hooks/agents/use-json-import.ts | 0 .../src/hooks/agents/use-model-selection.ts | 0 .../src/hooks/agents/use-update-agent-mcps.ts | 0 .../frontend}/src/hooks/agents/utils.ts | 0 .../src/hooks/apify/use-apify-approvals.ts | 0 .../frontend}/src/hooks/auth/index.ts | 0 .../src/hooks/auth/phone-verification.ts | 0 .../frontend}/src/hooks/billing/index.ts | 0 .../src/hooks/billing/use-account-state.ts | 0 .../src/hooks/billing/use-admin-billing.ts | 0 .../src/hooks/billing/use-billing-modal.ts | 0 .../src/hooks/billing/use-credit-usage.ts | 0 .../hooks/billing/use-download-restriction.ts | 0 .../src/hooks/billing/use-thread-billing.ts | 0 .../src/hooks/billing/use-thread-usage.ts | 0 .../hooks/billing/use-tier-configurations.ts | 0 .../src/hooks/billing/use-transactions.ts | 0 .../frontend}/src/hooks/composio/keys.ts | 0 .../hooks/composio/use-composio-mutations.ts | 0 .../hooks/composio/use-composio-profiles.ts | 0 .../hooks/composio/use-composio-triggers.ts | 0 .../src/hooks/composio/use-composio.ts | 0 .../frontend}/src/hooks/composio/utils.ts | 0 .../frontend}/src/hooks/dashboard/keys.ts | 0 .../src/hooks/dashboard/use-initiate-agent.ts | 0 .../frontend}/src/hooks/dashboard/utils.ts | 0 .../frontend}/src/hooks/edge-flags/index.ts | 0 .../frontend}/src/hooks/files/index.ts | 0 .../frontend}/src/hooks/files/keys.ts | 0 .../src/hooks/files/use-cached-file.ts | 0 .../src/hooks/files/use-external-image.ts | 0 .../src/hooks/files/use-file-content.ts | 0 .../src/hooks/files/use-file-mutations.ts | 0 .../src/hooks/files/use-file-queries.ts | 0 .../src/hooks/files/use-image-content.ts | 0 .../files/use-presentation-viewer-modal.ts | 0 .../src/hooks/files/use-sandbox-details.ts | 0 .../src/hooks/files/use-sandbox-mutations.ts | 0 .../src/hooks/files/useVncPreloader.ts | 0 .../frontend}/src/hooks/index.ts | 0 .../frontend}/src/hooks/integrations/index.ts | 0 .../hooks/integrations/useVapiCallRealtime.ts | 0 .../src/hooks/knowledge-base/keys.ts | 0 .../src/hooks/knowledge-base/use-folders.ts | 0 .../use-knowledge-base-queries.ts | 0 .../src/hooks/mcp/use-credential-profiles.ts | 0 .../src/hooks/mcp/use-mcp-servers.ts | 0 .../frontend}/src/hooks/memory/use-memory.ts | 0 .../frontend}/src/hooks/messages/index.ts | 0 .../src/hooks/messages/tool-tracking.ts | 0 .../src/hooks/messages/useAgentStream.ts | 413 +- .../src/hooks/messages/useMessages.ts | 0 .../hooks/messages/usePlaybackController.tsx | 0 .../src/hooks/messages/useSmoothText.ts | 134 + .../src/hooks/messages/useThreadToolCalls.ts | 0 .../utils/assistant-message-renderer.tsx | 57 +- .../src/hooks/messages/utils/index.ts | 20 +- .../hooks/messages/utils/tool-call-utils.ts | 2 +- .../src/hooks/messages/utils/types.ts | 0 .../frontend}/src/hooks/onboarding/index.ts | 0 .../src/hooks/onboarding/use-onboarding.ts | 0 .../src/hooks/referrals/use-referrals.ts | 0 .../src/hooks/secure-mcp/use-secure-mcp.ts | 0 .../src/hooks/sidebar/use-sidebar.ts | 0 apps/frontend/src/hooks/streaming/types.ts | 0 .../src/hooks/streaming/use-agent-stream.ts | 63 + .../hooks/streaming/use-stream-connection.ts | 101 + .../hooks/streaming/use-stream-messages.ts | 127 + .../src/hooks/streaming/use-stream-state.ts | 69 + .../frontend}/src/hooks/threads/index.ts | 0 .../frontend}/src/hooks/threads/keys.ts | 0 .../frontend}/src/hooks/threads/page/index.ts | 0 .../src/hooks/threads/page/use-thread-data.ts | 0 .../page/use-thread-keyboard-shortcuts.ts | 0 .../src/hooks/threads/use-agent-run.ts | 0 .../threads/use-optimistic-agent-start.ts | 4 +- .../src/hooks/threads/use-project.ts | 0 .../hooks/threads/use-thread-agent-status.ts | 0 .../src/hooks/threads/use-thread-mutations.ts | 0 .../src/hooks/threads/use-threads.ts | 0 .../src/hooks/threads/useProjectRealtime.ts | 0 .../frontend}/src/hooks/threads/utils.ts | 0 .../src/hooks/tools/use-tools-metadata.ts | 0 .../hooks/transcription/use-transcription.ts | 0 .../frontend}/src/hooks/triggers/index.ts | 0 .../src/hooks/triggers/use-agent-triggers.ts | 0 .../src/hooks/triggers/use-all-triggers.ts | 0 .../hooks/triggers/use-oauth-integrations.ts | 0 .../hooks/triggers/use-trigger-executions.ts | 0 .../hooks/triggers/use-trigger-providers.ts | 0 .../frontend}/src/hooks/usage/use-health.ts | 0 .../frontend}/src/hooks/use-file-data.ts | 0 .../frontend}/src/hooks/use-language.ts | 0 .../frontend}/src/hooks/use-presence.ts | 0 .../frontend}/src/hooks/use-user-currency.ts | 0 .../frontend}/src/hooks/utils/index.ts | 0 .../src/hooks/utils/use-github-stars.ts | 0 .../src/hooks/utils/use-holiday-promo.ts | 0 .../utils/use-leading-debounced-callback.ts | 0 .../src/hooks/utils/use-media-query.ts | 0 .../frontend}/src/hooks/utils/use-mobile.ts | 0 .../frontend}/src/hooks/utils/use-promo.ts | 0 .../hooks/utils/use-suna-modes-persistence.ts | 0 .../frontend}/src/i18n/config.ts | 0 .../frontend}/src/i18n/request.ts | 0 .../frontend}/src/lib/analytics/gtm.ts | 0 .../frontend}/src/lib/api-client.ts | 0 .../frontend}/src/lib/api/agents.ts | 0 .../frontend}/src/lib/api/api-keys.ts | 0 .../frontend}/src/lib/api/billing.ts | 0 .../frontend}/src/lib/api/errors.ts | 0 .../frontend}/src/lib/api/health.ts | 0 .../frontend}/src/lib/api/memory.ts | 0 .../frontend}/src/lib/api/notifications.ts | 0 .../src/lib/api/phone-verification.ts | 0 .../frontend}/src/lib/api/referrals.ts | 0 .../frontend}/src/lib/api/sandbox.ts | 0 .../frontend}/src/lib/api/streaming.ts | 0 .../frontend}/src/lib/api/threads.ts | 0 .../frontend}/src/lib/api/transcription.ts | 0 .../frontend}/src/lib/api/usage.ts | 0 {frontend => apps/frontend}/src/lib/config.ts | 0 .../src/lib/constants/upload-limits.ts | 0 .../frontend}/src/lib/edge-flags.ts | 0 .../frontend}/src/lib/empty-module.ts | 0 .../frontend}/src/lib/error-handler.ts | 0 .../frontend}/src/lib/feature-flags.ts | 0 apps/frontend/src/lib/icons/tool-icons.ts | 85 + .../frontend}/src/lib/mermaid-utils.ts | 0 .../src/lib/model-provider-icons.tsx | 0 .../frontend}/src/lib/polyfills.ts | 0 .../frontend}/src/lib/pricing-config.ts | 0 .../frontend}/src/lib/site-config.ts | 0 .../frontend}/src/lib/site-metadata.ts | 0 .../frontend}/src/lib/supabase/client.ts | 0 .../src/lib/supabase/handle-edge-error.ts | 0 .../frontend}/src/lib/supabase/mfa.ts | 0 .../frontend}/src/lib/supabase/server.ts | 0 {frontend => apps/frontend}/src/lib/utils.ts | 0 .../src/lib/utils/clear-local-storage.ts | 0 .../src/lib/utils/credit-formatter.ts | 0 .../frontend}/src/lib/utils/currency.ts | 0 .../src/lib/utils/date-formatting.ts | 0 .../src/lib/utils/dirty-string-parser.ts | 0 .../src/lib/utils/document-export.ts | 0 .../frontend}/src/lib/utils/file-types.ts | 0 .../frontend}/src/lib/utils/file-utils.ts | 0 .../src/lib/utils/geo-detection-server.ts | 0 .../frontend}/src/lib/utils/geo-detection.ts | 0 .../src/lib/utils/google-docs-utils.ts | 0 .../frontend}/src/lib/utils/icon-utils.ts | 0 .../frontend}/src/lib/utils/is-electron.ts | 0 .../src/lib/utils/is-mobile-device.ts | 0 .../frontend}/src/lib/utils/tool-parser.ts | 0 .../frontend}/src/lib/utils/unicode.ts | 0 .../frontend}/src/lib/utils/url-autolink.ts | 0 .../frontend}/src/lib/utils/url.ts | 0 .../frontend}/src/lib/validation.ts | 0 {frontend => apps/frontend}/src/middleware.ts | 0 .../src/stores/agent-selection-store.ts | 0 .../src/stores/agent-version-store.ts | 0 .../src/stores/announcement-store.ts | 0 .../frontend}/src/stores/auth-tracking.ts | 0 .../src/stores/context-usage-store.ts | 0 .../src/stores/delete-operation-store.ts | 0 .../src/stores/kortix-computer-store.ts | 0 .../src/stores/message-queue-store.ts | 0 .../frontend}/src/stores/model-store.ts | 0 .../src/stores/optimistic-files-store.ts | 0 .../src/stores/presentation-viewer-store.tsx | 0 .../src/stores/pricing-modal-store.ts | 0 .../frontend}/src/stores/referral-dialog.ts | 0 .../frontend}/src/stores/spreadsheet-store.ts | 0 .../src/stores/subscription-store.tsx | 0 .../frontend}/src/stores/suna-modes-store.ts | 0 .../frontend}/src/stores/tool-stream-store.ts | 0 .../src/stores/use-document-modal-store.ts | 0 .../frontend}/src/stores/use-editor-store.ts | 0 .../src/stores/welcome-banner-store.ts | 0 .../frontend}/translations/de.json | 0 .../frontend}/translations/en.json | 0 .../frontend}/translations/es.json | 0 .../frontend}/translations/fr.json | 0 .../frontend}/translations/it.json | 0 .../frontend}/translations/ja.json | 0 .../frontend}/translations/pt.json | 0 .../frontend}/translations/zh.json | 0 {frontend => apps/frontend}/tsconfig.json | 3 +- {frontend => apps/frontend}/vercel.json | 0 apps/mobile/api/types.ts | 78 +- .../components/chat/StreamingToolCard.tsx | 3 +- apps/mobile/components/chat/ThreadContent.tsx | 236 +- .../chat/assistant-message-renderer.tsx | 63 +- .../DeepSearchLoadingState.tsx | 255 + .../web-search-tool/WebSearchToolView.tsx | 68 +- .../chat/tool-views/web-search-tool/_utils.ts | 45 + apps/mobile/components/ui/button.tsx | 47 +- apps/mobile/hooks/useAgentStream.ts | 446 +- .../ios/Kortix.xcodeproj/project.pbxproj | 42 +- apps/mobile/ios/Podfile.lock | 688 +- apps/mobile/lib/icons/tool-icons.ts | 85 + apps/mobile/lib/utils/index.ts | 8 +- apps/mobile/lib/utils/message-grouping.ts | 141 - apps/mobile/lib/utils/tool-call-utils.ts | 256 +- apps/mobile/lib/utils/tool-data-extractor.ts | 2 +- apps/mobile/lib/utils/tool-display.ts | 433 - apps/mobile/package.json | 1 + apps/mobile/tsconfig.json | 10 +- backend/README.md | 4 +- backend/core/agentpress/thread_manager.py | 22 + backend/core/agents/runs.py | 122 +- backend/core/ai_models/models.py | 1 + backend/core/ai_models/registry.py | 25 +- .../billing/subscriptions/handlers/tier.py | 23 +- .../repositories/credit_account.py | 10 + backend/core/cache/runtime_cache.py | 218 + backend/core/knowledge_base/api.py | 65 +- backend/core/memory/api.py | 49 + backend/core/run/prompt_manager.py | 96 +- backend/core/services/llm.py | 42 +- backend/core/services/redis.py | 35 + backend/core/threads/init.py | 182 +- backend/core/utils/config.py | 5 + backend/core/utils/limits_checker.py | 13 +- backend/core/worker/handlers.py | 63 +- backend/core/worker/helpers.py | 11 + .../src/app/(dashboard)/knowledge/page.tsx | 5 - .../src/components/memory/MemorySettings.tsx | 282 - .../thread/chat-input/memory-toggle.tsx | 97 - frontend/src/components/thread/utils.ts | 703 - .../hooks/messages/utils/streaming-utils.ts | 248 - package.json | 10 + packages/shared/README.md | 179 + packages/shared/node_modules/.bin/tsc | 17 + packages/shared/node_modules/.bin/tsserver | 17 + packages/shared/node_modules/typescript | 1 + packages/shared/package.json | 21 + packages/shared/src/index.ts | 26 + packages/shared/src/streaming/index.ts | 9 + .../shared/src/streaming/message-handler.ts | 151 + .../shared/src/streaming/text-ordering.ts | 56 + .../shared/src/streaming/tool-accumulator.ts | 191 + .../shared/src/streaming/utils.ts | 22 +- .../shared/src/tools/content-preprocessor.ts | 138 + packages/shared/src/tools/display-names.ts | 246 + packages/shared/src/tools/formatter.ts | 171 + packages/shared/src/tools/icon-keys.ts | 237 + packages/shared/src/tools/index.ts | 11 + .../shared/src/tools/parser.ts | 181 +- packages/shared/src/tools/tool-call-utils.ts | 217 + packages/shared/src/types/index.ts | 8 + packages/shared/src/types/messages.ts | 155 + packages/shared/src/types/streaming.ts | 43 + packages/shared/src/utils/grouping.ts | 234 + packages/shared/src/utils/index.ts | 8 + packages/shared/src/utils/json.ts | 92 + packages/shared/src/utils/normalizers.ts | 60 + packages/shared/tsconfig.json | 21 + pnpm-lock.yaml | 23621 ++++++++++++++++ pnpm-workspace.yaml | 4 + setup.py | 14 +- start.py | 4 +- 964 files changed, 29734 insertions(+), 4064 deletions(-) create mode 100644 .cursor/plans/shared_package_refactoring.plan.md rename {frontend => apps/frontend}/.dockerignore (100%) rename {frontend => apps/frontend}/.env.example (100%) rename {frontend => apps/frontend}/.gitignore (100%) rename {frontend => apps/frontend}/.npmrc (100%) rename {frontend => apps/frontend}/.prettierignore (100%) rename {frontend => apps/frontend}/.prettierrc (100%) rename {frontend => apps/frontend}/Dockerfile (100%) rename {frontend => apps/frontend}/README.md (100%) rename {frontend => apps/frontend}/components.json (100%) rename {frontend => apps/frontend}/eslint.config.mjs (100%) rename {frontend => apps/frontend}/instrumentation-client.ts (100%) rename {frontend => apps/frontend}/next (100%) rename {frontend => apps/frontend}/next.config.ts (97%) rename {frontend => apps/frontend}/package-lock.json (100%) rename {frontend => apps/frontend}/package.json (93%) rename {frontend => apps/frontend}/postcss.config.mjs (100%) rename {frontend => apps/frontend}/public/Logomark-Black.png (100%) rename {frontend => apps/frontend}/public/Logomark.svg (100%) rename {frontend => apps/frontend}/public/banner.png (100%) rename {frontend => apps/frontend}/public/favicon-light.png (100%) rename {frontend => apps/frontend}/public/favicon.png (100%) rename {frontend => apps/frontend}/public/fonts/roobert/RoobertItalicsVF.woff2 (100%) rename {frontend => apps/frontend}/public/fonts/roobert/RoobertMonoItalicsVF.woff2 (100%) rename {frontend => apps/frontend}/public/fonts/roobert/RoobertMonoUprightsVF.woff2 (100%) rename {frontend => apps/frontend}/public/fonts/roobert/RoobertUprightsVF.woff2 (100%) rename {frontend => apps/frontend}/public/grain-texture.png (100%) rename {frontend => apps/frontend}/public/images/canvas/create.png (100%) rename {frontend => apps/frontend}/public/images/canvas/edit.png (100%) rename {frontend => apps/frontend}/public/images/canvas/remove-bg.png (100%) rename {frontend => apps/frontend}/public/images/canvas/upscale.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/abstract_organic-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/anime_forest-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/comic_book_robot-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/digital_art_cyberpunk-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/geometric_crystal-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/impressionist_garden-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/isometric_bedroom-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/minimalist_coffee-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/neon_jellyfish-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/oil_painting_villa-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/pastel_landscape-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/photorealistic_eagle-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/surreal_islands-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/vintage_diner-min.png (100%) rename {frontend => apps/frontend}/public/images/image-styles/watercolor_garden-min.png (100%) rename {frontend => apps/frontend}/public/images/landing-showcase/data.png (100%) rename {frontend => apps/frontend}/public/images/landing-showcase/docs.png (100%) rename {frontend => apps/frontend}/public/images/landing-showcase/images.png (100%) rename {frontend => apps/frontend}/public/images/landing-showcase/research.png (100%) rename {frontend => apps/frontend}/public/images/landing-showcase/slides.png (100%) rename {frontend => apps/frontend}/public/images/models/Anthropic.svg (100%) rename {frontend => apps/frontend}/public/images/models/Gemini.svg (100%) rename {frontend => apps/frontend}/public/images/models/Grok.svg (100%) rename {frontend => apps/frontend}/public/images/models/Moonshot.svg (100%) rename {frontend => apps/frontend}/public/images/models/OAI.svg (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/architect-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/black_and_white_clean-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/colorful-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/competitor_analysis_blue-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/elevator_pitch-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/gamer_gray-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/green-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/hipster-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/minimalist-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/minimalist_2-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/numbers_clean-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/numbers_colorful-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/portfolio-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/premium_black-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/premium_green-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/professor_gray-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/startup-min.png (100%) rename {frontend => apps/frontend}/public/images/presentation-templates/textbook-min.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/abstract.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/animation.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/cinematic.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/nature.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/person.png (100%) rename {frontend => apps/frontend}/public/images/video-styles/product.png (100%) rename {frontend => apps/frontend}/public/kortix-brandmark-effect-full.svg (100%) rename {frontend => apps/frontend}/public/kortix-brandmark-effect.svg (100%) rename {frontend => apps/frontend}/public/kortix-symbol.svg (100%) rename {frontend => apps/frontend}/public/logo_black.png (100%) rename {frontend => apps/frontend}/public/logomark-white.svg (100%) rename {frontend => apps/frontend}/public/manifest.json (100%) rename {frontend => apps/frontend}/public/plan-icons/basic.svg (100%) rename {frontend => apps/frontend}/public/plan-icons/plus.svg (100%) rename {frontend => apps/frontend}/public/plan-icons/pro.svg (100%) rename {frontend => apps/frontend}/public/plan-icons/ultra.svg (100%) rename {frontend => apps/frontend}/public/robots.txt (100%) rename {frontend => apps/frontend}/public/share-page/og-fallback.png (100%) rename {frontend => apps/frontend}/public/showcase/data/dashboard.png (100%) rename {frontend => apps/frontend}/public/showcase/image/logo.png (100%) rename {frontend => apps/frontend}/public/showcase/image/mockup-board.png (100%) rename {frontend => apps/frontend}/public/showcase/presentation/browser.png (100%) rename {frontend => apps/frontend}/public/showcase/presentation/slide1.png (100%) rename {frontend => apps/frontend}/public/showcase/presentation/slide2.png (100%) rename {frontend => apps/frontend}/public/wordmark.svg (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/admin/analytics/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/admin/billing/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/admin/feedback/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/admin/notifications/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/[threadId]/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/[threadId]/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/[threadId]/redirect-page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/knowledge-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/agents/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/credits-explained/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/dashboard/page.tsx (100%) create mode 100644 apps/frontend/src/app/(dashboard)/knowledge/page.tsx rename {frontend => apps/frontend}/src/app/(dashboard)/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/onboarding-demo/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/settings/api-keys/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/settings/api-keys/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/settings/credentials/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/settings/credentials/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/thread/[threadId]/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(dashboard)/triggers/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(home)/berlin/page.tsx (99%) rename {frontend => apps/frontend}/src/app/(home)/enterprise/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(home)/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/(home)/milano/page.tsx (99%) rename {frontend => apps/frontend}/src/app/(home)/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(home)/status/page.tsx (100%) rename {frontend => apps/frontend}/src/app/(home)/support/page.tsx (100%) rename {frontend => apps/frontend}/src/app/activate-trial/page.tsx (100%) rename {frontend => apps/frontend}/src/app/agents-101/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/agents-101/page.tsx (100%) rename {frontend => apps/frontend}/src/app/api/edge-flags/route.ts (100%) rename {frontend => apps/frontend}/src/app/api/integrations/[provider]/callback/route.ts (100%) rename {frontend => apps/frontend}/src/app/api/og/template/route.tsx (100%) rename {frontend => apps/frontend}/src/app/api/share-page/og-image/route.tsx (100%) rename {frontend => apps/frontend}/src/app/api/triggers/[triggerId]/webhook/route.ts (100%) rename {frontend => apps/frontend}/src/app/auth/actions.ts (100%) rename {frontend => apps/frontend}/src/app/auth/callback/route.ts (100%) rename {frontend => apps/frontend}/src/app/auth/github-popup/page.tsx (100%) rename {frontend => apps/frontend}/src/app/auth/page.tsx (100%) rename {frontend => apps/frontend}/src/app/auth/password/page.tsx (100%) rename {frontend => apps/frontend}/src/app/auth/phone-verification/page.tsx (100%) rename {frontend => apps/frontend}/src/app/auth/reset-password/page.tsx (100%) rename {frontend => apps/frontend}/src/app/checkout/page.tsx (100%) rename {frontend => apps/frontend}/src/app/favicon.ico (100%) rename {frontend => apps/frontend}/src/app/fonts/roobert-mono.ts (100%) rename {frontend => apps/frontend}/src/app/fonts/roobert.ts (100%) rename {frontend => apps/frontend}/src/app/global-error.tsx (100%) rename {frontend => apps/frontend}/src/app/globals.css (99%) rename {frontend => apps/frontend}/src/app/help/credits/page.tsx (100%) rename {frontend => apps/frontend}/src/app/help/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/help/page.tsx (100%) rename {frontend => apps/frontend}/src/app/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/legal/page.tsx (100%) rename {frontend => apps/frontend}/src/app/monitoring/route.ts (100%) rename {frontend => apps/frontend}/src/app/not-found.tsx (100%) rename {frontend => apps/frontend}/src/app/react-query-provider.tsx (100%) rename {frontend => apps/frontend}/src/app/setting-up/page.tsx (100%) rename {frontend => apps/frontend}/src/app/share/[threadId]/_components/SharePageWrapper.tsx (100%) rename {frontend => apps/frontend}/src/app/share/[threadId]/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/share/[threadId]/page.tsx (100%) rename {frontend => apps/frontend}/src/app/sitemap.ts (100%) rename {frontend => apps/frontend}/src/app/subscription/page.tsx (100%) rename {frontend => apps/frontend}/src/app/suna/page.tsx (100%) rename {frontend => apps/frontend}/src/app/templates/[shareId]/layout.tsx (100%) rename {frontend => apps/frontend}/src/app/templates/[shareId]/page.tsx (100%) rename {frontend => apps/frontend}/src/assets/animations/loading-black.json (100%) rename {frontend => apps/frontend}/src/assets/animations/loading-white.json (100%) rename {frontend => apps/frontend}/src/components/AuthProvider.tsx (100%) rename {frontend => apps/frontend}/src/components/GithubSignIn.tsx (100%) rename {frontend => apps/frontend}/src/components/GoogleSignIn.tsx (100%) rename {frontend => apps/frontend}/src/components/admin/admin-feedback-table.tsx (100%) rename {frontend => apps/frontend}/src/components/admin/admin-user-details-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/admin/admin-user-table.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/AgentVersionManager.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-configuration-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-count-limit-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-creation-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-mcp-configuration.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agent-version-switcher.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/agents-grid.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-app-card.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-connections-section.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-connector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-credential-profile-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-profile-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-registry.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-tools-manager.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/composio/composio-tools-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/config/agent-editor-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/config/agent-icon-editor-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/config/icon-picker.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/config/index.ts (100%) rename {frontend => apps/frontend}/src/components/agents/config/model-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/config/version-alert.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/create-version-button.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/header.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/index.ts (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/loading-skeleton.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/marketplace-section-header.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/marketplace-tab.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/my-agents-tab.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/my-templates-tab.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/publish-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/search-bar.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/custom-agents-page/tabs-navigation.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/advanced-toolbar.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/custom-highlight.ts (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/color-picker.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/font-selector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/highlight-picker.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/image-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/link-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/editor/controls/table-dropdown.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/extensions/page-break.ts (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/ruler.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/docs-agent/simple-toolbar.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/empty-state.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/custom-server-step.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/streamlined-install-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/streamlined-profile-connector.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/trigger-config-step.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/trigger-variables-step.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/installation/types.ts (100%) rename {frontend => apps/frontend}/src/components/agents/integrations-registry.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/json-import-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/knowledge-base/agent-kb-tree.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/loading-state.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/marketplace-agent-preview-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/configured-mcp-list.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/custom-mcp-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/mcp-configuration-new.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/mcp-server-card.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/tools-loader.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/tools-manager.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/mcp/types.ts (100%) rename {frontend => apps/frontend}/src/components/agents/new-agent-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/pagination.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/results-info.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/tools/granular-tool-configuration.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/tools/tool-groups.ts (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/agent-triggers-configuration.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/configured-triggers-list.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/event-based-trigger-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/one-click-integrations.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/providers/event-config.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/providers/schedule-config.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/providers/simplified-schedule-config.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/trigger-browse-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/types.ts (100%) rename {frontend => apps/frontend}/src/components/agents/triggers/utils.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/upcoming-runs-dropdown.tsx (100%) rename {frontend => apps/frontend}/src/components/agents/version-inline-editor.tsx (100%) rename {frontend => apps/frontend}/src/components/analytics/auth-event-tracker.tsx (100%) rename {frontend => apps/frontend}/src/components/analytics/route-change-tracker.tsx (100%) rename {frontend => apps/frontend}/src/components/announcements/announcement-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/announcements/components/memories-announcement.tsx (100%) rename {frontend => apps/frontend}/src/components/announcements/index.ts (100%) rename {frontend => apps/frontend}/src/components/announcements/kortix-app-banners.tsx (100%) rename {frontend => apps/frontend}/src/components/announcements/mobile-app-interstitial.tsx (100%) rename {frontend => apps/frontend}/src/components/announcements/registry.ts (71%) rename {frontend => apps/frontend}/src/components/announcements/technical-issue-banner.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/background-aal-checker.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/example-showcase.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/phone-verification/otp-verification.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/phone-verification/phone-input.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/phone-verification/phone-verification-page.tsx (100%) rename {frontend => apps/frontend}/src/components/auth/release-badge.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/credit-purchase.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/credit-transactions.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/credit-usage.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/credits-display.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/downgrade-confirmation-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/index.ts (100%) rename {frontend => apps/frontend}/src/components/billing/plan-utils.ts (100%) rename {frontend => apps/frontend}/src/components/billing/pricing/index.ts (100%) rename {frontend => apps/frontend}/src/components/billing/pricing/plan-selection-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/pricing/pricing-section.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/scheduled-downgrade-card.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/subscription-cancellation-card.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/thread-usage.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/tier-badge.tsx (100%) rename {frontend => apps/frontend}/src/components/billing/upgrade-celebration.tsx (100%) rename {frontend => apps/frontend}/src/components/cookie-consent.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/ai-worker-templates.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/custom-agents-section.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/dashboard-content.tsx (99%) rename {frontend => apps/frontend}/src/components/dashboard/examples/index.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/layout-content.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/maintenance-banner.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/maintenance-notice.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/suna-modes-panel.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/trial-management.tsx (100%) rename {frontend => apps/frontend}/src/components/dashboard/usage-limits-popover.tsx (100%) rename {frontend => apps/frontend}/src/components/debug/presence-debug.tsx (100%) rename {frontend => apps/frontend}/src/components/env-manager/local-env-manager.tsx (100%) rename {frontend => apps/frontend}/src/components/file-editors/code-editor.tsx (100%) rename {frontend => apps/frontend}/src/components/file-editors/index.tsx (100%) rename {frontend => apps/frontend}/src/components/file-editors/markdown-editor.tsx (100%) rename {frontend => apps/frontend}/src/components/file-editors/markdown-toolbar.tsx (100%) rename {frontend => apps/frontend}/src/components/file-editors/utils.ts (100%) rename {frontend => apps/frontend}/src/components/file-layouts/FileCarousel.tsx (100%) rename {frontend => apps/frontend}/src/components/file-layouts/FileGrid.tsx (100%) rename {frontend => apps/frontend}/src/components/file-previews/DocumentPreview.tsx (100%) rename {frontend => apps/frontend}/src/components/file-previews/FileCard.tsx (100%) rename {frontend => apps/frontend}/src/components/file-previews/ImagePreview.tsx (100%) rename {frontend => apps/frontend}/src/components/file-previews/PdfPreview.tsx (100%) rename {frontend => apps/frontend}/src/components/file-previews/SpreadsheetPreview.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/JsonRenderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/binary-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/canvas-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/csv-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/html-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/image-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/index.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/pdf-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/pptx-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/video-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/file-renderers/xlsx-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/help/help-search-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/help/help-sidebar.tsx (100%) rename {frontend => apps/frontend}/src/components/home/dashboard-promo-banner.tsx (100%) rename {frontend => apps/frontend}/src/components/home/footer-section.tsx (100%) rename {frontend => apps/frontend}/src/components/home/hero-section.tsx (98%) rename {frontend => apps/frontend}/src/components/home/icons.tsx (100%) rename {frontend => apps/frontend}/src/components/home/locale-switcher.tsx (100%) rename {frontend => apps/frontend}/src/components/home/nav-menu.tsx (100%) rename {frontend => apps/frontend}/src/components/home/navbar.tsx (100%) rename {frontend => apps/frontend}/src/components/home/promo-banner.tsx (100%) rename {frontend => apps/frontend}/src/components/home/showcase-section.tsx (100%) rename {frontend => apps/frontend}/src/components/home/simple-footer.tsx (100%) rename {frontend => apps/frontend}/src/components/home/theme-provider.tsx (100%) rename {frontend => apps/frontend}/src/components/home/theme-toggle.tsx (100%) rename {frontend => apps/frontend}/src/components/home/wordmark-footer.tsx (100%) rename {frontend => apps/frontend}/src/components/i18n-provider.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/edit-summary-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/kb-delete-confirm-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/kb-file-preview-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/knowledge-base-header.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/knowledge-base-manager.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/knowledge-base-page.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/shared-kb-tree.tsx (100%) rename {frontend => apps/frontend}/src/components/knowledge-base/unified-kb-entry-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/layout/app-providers.tsx (100%) rename {frontend => apps/frontend}/src/components/maintenance/maintenance-page.tsx (100%) rename {frontend => apps/frontend}/src/components/markdown/index.tsx (100%) rename {frontend => apps/frontend}/src/components/markdown/unified-markdown.tsx (100%) rename {frontend => apps/frontend}/src/components/memory/MemoryCard.tsx (100%) rename {frontend => apps/frontend}/src/components/memory/MemoryList.tsx (100%) create mode 100644 apps/frontend/src/components/memory/MemorySettings.tsx rename {frontend => apps/frontend}/src/components/notifications/notification-center.tsx (100%) rename {frontend => apps/frontend}/src/components/notifications/notification-dropdown.tsx (100%) rename {frontend => apps/frontend}/src/components/notifications/notification-settings.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/README.md (100%) rename {frontend => apps/frontend}/src/components/onboarding/agent-config/agent-configuration.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/agent-config/configuration-utils.ts (100%) rename {frontend => apps/frontend}/src/components/onboarding/agent-config/field-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/agent-config/multi-agent-configuration.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/index.ts (100%) rename {frontend => apps/frontend}/src/components/onboarding/new-onboarding-page.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/onboarding-config.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/onboarding-provider.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/context.ts (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/data.ts (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/icon-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/progress-indicator.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/step-wrapper.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/shared/types.ts (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/ceo-intro-step.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/completion-step.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/smart-context-step.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/team-invitation-step.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/user-type-step.tsx (100%) rename {frontend => apps/frontend}/src/components/onboarding/steps/workforce-selection-step.tsx (100%) rename {frontend => apps/frontend}/src/components/posthog-identify.tsx (100%) rename {frontend => apps/frontend}/src/components/presence-provider.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/index.ts (100%) rename {frontend => apps/frontend}/src/components/referrals/referral-code-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/referral-code-section.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/referral-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/referral-email-invitation.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/referral-stats-cards.tsx (100%) rename {frontend => apps/frontend}/src/components/referrals/referrals-tab.tsx (100%) create mode 100644 apps/frontend/src/components/settings/knowledge-base-settings.tsx rename {frontend => apps/frontend}/src/components/settings/language-switcher.tsx (100%) rename {frontend => apps/frontend}/src/components/settings/user-settings-modal.tsx (99%) rename {frontend => apps/frontend}/src/components/shared/prompt-examples.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/cta.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/date-picker.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/kortix-enterprise-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/kortix-logo.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/nav-agents-view.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/nav-agents.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/nav-global-config.tsx (99%) rename {frontend => apps/frontend}/src/components/sidebar/nav-main.tsx (100%) create mode 100644 apps/frontend/src/components/sidebar/nav-projects.tsx create mode 100644 apps/frontend/src/components/sidebar/nav-tasks.tsx rename {frontend => apps/frontend}/src/components/sidebar/nav-trigger-runs.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/nav-user-with-teams.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/search-search.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/share-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/sidebar-left.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/thread-icon.tsx (100%) rename {frontend => apps/frontend}/src/components/sidebar/thread-search-modal.tsx (100%) rename {frontend => apps/frontend}/src/components/team-switcher.tsx (100%) rename {frontend => apps/frontend}/src/components/theme-provider.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/ContextUsageIndicator.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/DeleteConfirmationDialog.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/HealthCheckedVncIframe.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/ThreadComponent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/agent-run-limit-banner.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/agent-run-limit-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/chat-input.tsx (98%) rename {frontend => apps/frontend}/src/components/thread/chat-input/chat-snack.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/custom-model-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/file-upload-handler.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/floating-tool-preview.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/unified-config-menu.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/upgrade-preview.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/chat-input/voice-recorder.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/ApifyApprovalInline.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/MediaGenerationInline.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/PlaybackControls.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/PlaybackFloatingControls.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/ShowToolStream.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/SimplePlaybackControls.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/StreamingText.tsx (54%) rename {frontend => apps/frontend}/src/components/thread/content/ThinkingCollapsible.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/ThreadContent.tsx (97%) rename {frontend => apps/frontend}/src/components/thread/content/ThreadSkeleton.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/agent-avatar.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/composio-url-detector.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/loader.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/content/usePlaybackControls.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/file-attachment/AttachmentGroup.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/file-attachment/index.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/file-browser.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/iframe-preview.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/FileBrowserView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/FileViewerView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/KortixComputer.tsx (99%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/KortixComputerHeader.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/VersionBanner.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/AppWindow.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/Desktop.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/DesktopContextMenu.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/DesktopIcons.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/Dock.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/EmptyState.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/FileContextMenu.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/FileInfoContent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/Icons.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/LoadingState.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/NavigationControls.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/PanelHeader.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/QuickLaunch.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/SSHTerminal.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/SandboxInfoCard.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/SystemInfoContent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/Terminal.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/ToolbarButtons.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/components/ViewToggle.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/kortix-computer/index.ts (100%) rename {frontend => apps/frontend}/src/components/thread/layout/index.ts (100%) rename {frontend => apps/frontend}/src/components/thread/layout/thread-layout.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/thread-error.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/thread-site-header.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/BrowserToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/CompleteToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/GenericToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/KbToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/UploadFileToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/WebCrawlToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/apify-tool/ToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/apify-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/canvas-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/check-profile-connection/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/command-tool/CommandToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/command-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/company-search-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/configure-agent-integration/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/configure-profile-for-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/configure-profile-for-agent/configure-profile-for-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/connect-credential-profile/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/connect-credential-profile/connect-credential-profile.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-agent-scheduled-trigger/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-agent-scheduled-trigger/create-agent-scheduled-trigger.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-credential-profile-for-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-credential-profile-for-agent/create-credential-profile-for-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-credential-profile/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-credential-profile/create-credential-profile.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-event-trigger/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-event-trigger/create-event-trigger.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-new-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/designer-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/discover-mcp-tools-for-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/discover-mcp-tools-for-agent/discover-mcp-tools-for-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/discover-user-mcp-servers/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/discover-user-mcp-servers/discover-user-mcp-servers.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/document-parser-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/expand-message-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/expose-port-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/file-operation/FileEditToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/file-operation/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/file-reader-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-app-details/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-app-details/get-app-details.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-credential-profiles/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-credential-profiles/get-credential-profiles.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-current-agent-config/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/get-current-agent-config/get-current-agent-config.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/image-edit-generate-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/list-app-event-triggers/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/mcp-content-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/mcp-format-detector.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/people-search-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/PresentationSlideCard.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/presentation-tools/PresentationViewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/reality-defender-tool/RealityDefenderToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/reality-defender-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/search-mcp-servers-for-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/search-mcp-servers-for-agent/search-mcp-servers-for-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/search-mcp-servers/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/search-mcp-servers/search-mcp-servers.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/see-image-tool/SeeImageToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/see-image-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/AppIcon.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/FileDownloadButton.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/ImageLoader.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/JsonViewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/LoadingState.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/SmartJsonViewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/shared/TaskCompletedFeedback.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/sheets-tools/luckysheet-viewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/sheets-tools/sheets-tool-view.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/SpreadsheetLoader.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/SpreadsheetSimulation.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/SpreadsheetToolview.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/SpreadsheetViewer.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/SyncStatusIndicator.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/kortix-spreadsheet-styles.css (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/spreadsheet/useSpreadsheetSync.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/task-list/TaskListToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/task-list/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/tool-result-parser.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/types.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/update-agent/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/update-agent/update-agent.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/utils/presentation-utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/CallStatusToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/EndCallToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/ListCallsToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/MakeCallToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/MonitorCallToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/WaitForCallCompletionToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/vapi-call/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/wait-tool/WaitToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/web-dev/GetProjectStructureView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/web-scrape-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx (98%) rename {frontend => apps/frontend}/src/components/thread/tool-views/web-search-tool/_utils.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/wrapper/ToolViewRegistry.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/wrapper/ToolViewWrapper.tsx (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/wrapper/index.ts (100%) rename {frontend => apps/frontend}/src/components/thread/tool-views/xml-parser.ts (100%) rename {frontend => apps/frontend}/src/components/thread/types.ts (100%) create mode 100644 apps/frontend/src/components/thread/utils.ts rename {frontend => apps/frontend}/src/components/triggers/simplified-trigger-detail-panel.tsx (100%) rename {frontend => apps/frontend}/src/components/triggers/trigger-creation-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/triggers/triggers-page-header.tsx (100%) rename {frontend => apps/frontend}/src/components/triggers/triggers-page.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/accordion.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/alert-dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/alert.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/animated-bg.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/animated-shiny-text.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/avatar.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/badge.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/border-beam.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/breadcrumb.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/button.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/calendar.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/card.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/checkbox.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/code-block.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/collapsible.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/command.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/context-menu.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/csv-table.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/data-table.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/date-range-picker.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/dialog.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/drawer.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/dropdown-menu.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/dynamic-greeting.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/editable-markdown.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/editable.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/expandable-markdown-editor.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/fancy-tabs.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/flickering-grid.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/form.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/grain-icon.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/grain-text.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/icons/slack.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/input.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/kbd.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/kortix-loader.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/label.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/mermaid-renderer.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/page-header.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/phone-input.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/pixel-art-editor.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/pixel-avatar.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/popover.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/portal.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/progress.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/radio-group.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/resizable.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/ripple.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/scroll-area.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/select.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/separator.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/shadcn-io/code-block/index.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/shadcn-io/code-block/server.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/sheet.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/shiny-text.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/sidebar.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/skeleton.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/slider.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/sonner.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/spotlight-card.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/status-overlay.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/submit-button.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/switch.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/table.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/tabs.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/tag-input.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/textarea.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/toggle.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/tooltip.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/unified-agent-card.tsx (100%) rename {frontend => apps/frontend}/src/components/ui/upgrade-dialog.tsx (100%) rename {frontend => apps/frontend}/src/hooks/account/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/account/use-account-deletion.ts (100%) rename {frontend => apps/frontend}/src/hooks/account/use-account-setup.ts (100%) rename {frontend => apps/frontend}/src/hooks/account/use-accounts.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/use-admin-analytics.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/use-admin-feedback.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/use-admin-role.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/use-admin-users.ts (100%) rename {frontend => apps/frontend}/src/hooks/admin/use-notification-workflow.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-export-import.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-icon-generation.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-tools.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-upcoming-runs.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-version-data.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agent-versions.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-agents.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-custom-mcp-tools.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-json-import.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-model-selection.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/use-update-agent-mcps.ts (100%) rename {frontend => apps/frontend}/src/hooks/agents/utils.ts (100%) rename {frontend => apps/frontend}/src/hooks/apify/use-apify-approvals.ts (100%) rename {frontend => apps/frontend}/src/hooks/auth/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/auth/phone-verification.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-account-state.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-admin-billing.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-billing-modal.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-credit-usage.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-download-restriction.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-thread-billing.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-thread-usage.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-tier-configurations.ts (100%) rename {frontend => apps/frontend}/src/hooks/billing/use-transactions.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/use-composio-mutations.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/use-composio-profiles.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/use-composio-triggers.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/use-composio.ts (100%) rename {frontend => apps/frontend}/src/hooks/composio/utils.ts (100%) rename {frontend => apps/frontend}/src/hooks/dashboard/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/dashboard/use-initiate-agent.ts (100%) rename {frontend => apps/frontend}/src/hooks/dashboard/utils.ts (100%) rename {frontend => apps/frontend}/src/hooks/edge-flags/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-cached-file.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-external-image.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-file-content.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-file-mutations.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-file-queries.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-image-content.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-presentation-viewer-modal.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-sandbox-details.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/use-sandbox-mutations.ts (100%) rename {frontend => apps/frontend}/src/hooks/files/useVncPreloader.ts (100%) rename {frontend => apps/frontend}/src/hooks/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/integrations/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/integrations/useVapiCallRealtime.ts (100%) rename {frontend => apps/frontend}/src/hooks/knowledge-base/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/knowledge-base/use-folders.ts (100%) rename {frontend => apps/frontend}/src/hooks/knowledge-base/use-knowledge-base-queries.ts (100%) rename {frontend => apps/frontend}/src/hooks/mcp/use-credential-profiles.ts (100%) rename {frontend => apps/frontend}/src/hooks/mcp/use-mcp-servers.ts (100%) rename {frontend => apps/frontend}/src/hooks/memory/use-memory.ts (100%) rename {frontend => apps/frontend}/src/hooks/messages/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/messages/tool-tracking.ts (100%) rename {frontend => apps/frontend}/src/hooks/messages/useAgentStream.ts (71%) rename {frontend => apps/frontend}/src/hooks/messages/useMessages.ts (100%) rename {frontend => apps/frontend}/src/hooks/messages/usePlaybackController.tsx (100%) create mode 100644 apps/frontend/src/hooks/messages/useSmoothText.ts rename {frontend => apps/frontend}/src/hooks/messages/useThreadToolCalls.ts (100%) rename {frontend => apps/frontend}/src/hooks/messages/utils/assistant-message-renderer.tsx (88%) rename {frontend => apps/frontend}/src/hooks/messages/utils/index.ts (79%) rename {frontend => apps/frontend}/src/hooks/messages/utils/tool-call-utils.ts (99%) rename {frontend => apps/frontend}/src/hooks/messages/utils/types.ts (100%) rename {frontend => apps/frontend}/src/hooks/onboarding/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/onboarding/use-onboarding.ts (100%) rename {frontend => apps/frontend}/src/hooks/referrals/use-referrals.ts (100%) rename {frontend => apps/frontend}/src/hooks/secure-mcp/use-secure-mcp.ts (100%) rename {frontend => apps/frontend}/src/hooks/sidebar/use-sidebar.ts (100%) create mode 100644 apps/frontend/src/hooks/streaming/types.ts create mode 100644 apps/frontend/src/hooks/streaming/use-agent-stream.ts create mode 100644 apps/frontend/src/hooks/streaming/use-stream-connection.ts create mode 100644 apps/frontend/src/hooks/streaming/use-stream-messages.ts create mode 100644 apps/frontend/src/hooks/streaming/use-stream-state.ts rename {frontend => apps/frontend}/src/hooks/threads/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/keys.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/page/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/page/use-thread-data.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/page/use-thread-keyboard-shortcuts.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/use-agent-run.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/use-optimistic-agent-start.ts (99%) rename {frontend => apps/frontend}/src/hooks/threads/use-project.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/use-thread-agent-status.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/use-thread-mutations.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/use-threads.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/useProjectRealtime.ts (100%) rename {frontend => apps/frontend}/src/hooks/threads/utils.ts (100%) rename {frontend => apps/frontend}/src/hooks/tools/use-tools-metadata.ts (100%) rename {frontend => apps/frontend}/src/hooks/transcription/use-transcription.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/use-agent-triggers.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/use-all-triggers.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/use-oauth-integrations.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/use-trigger-executions.ts (100%) rename {frontend => apps/frontend}/src/hooks/triggers/use-trigger-providers.ts (100%) rename {frontend => apps/frontend}/src/hooks/usage/use-health.ts (100%) rename {frontend => apps/frontend}/src/hooks/use-file-data.ts (100%) rename {frontend => apps/frontend}/src/hooks/use-language.ts (100%) rename {frontend => apps/frontend}/src/hooks/use-presence.ts (100%) rename {frontend => apps/frontend}/src/hooks/use-user-currency.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/index.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-github-stars.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-holiday-promo.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-leading-debounced-callback.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-media-query.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-mobile.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-promo.ts (100%) rename {frontend => apps/frontend}/src/hooks/utils/use-suna-modes-persistence.ts (100%) rename {frontend => apps/frontend}/src/i18n/config.ts (100%) rename {frontend => apps/frontend}/src/i18n/request.ts (100%) rename {frontend => apps/frontend}/src/lib/analytics/gtm.ts (100%) rename {frontend => apps/frontend}/src/lib/api-client.ts (100%) rename {frontend => apps/frontend}/src/lib/api/agents.ts (100%) rename {frontend => apps/frontend}/src/lib/api/api-keys.ts (100%) rename {frontend => apps/frontend}/src/lib/api/billing.ts (100%) rename {frontend => apps/frontend}/src/lib/api/errors.ts (100%) rename {frontend => apps/frontend}/src/lib/api/health.ts (100%) rename {frontend => apps/frontend}/src/lib/api/memory.ts (100%) rename {frontend => apps/frontend}/src/lib/api/notifications.ts (100%) rename {frontend => apps/frontend}/src/lib/api/phone-verification.ts (100%) rename {frontend => apps/frontend}/src/lib/api/referrals.ts (100%) rename {frontend => apps/frontend}/src/lib/api/sandbox.ts (100%) rename {frontend => apps/frontend}/src/lib/api/streaming.ts (100%) rename {frontend => apps/frontend}/src/lib/api/threads.ts (100%) rename {frontend => apps/frontend}/src/lib/api/transcription.ts (100%) rename {frontend => apps/frontend}/src/lib/api/usage.ts (100%) rename {frontend => apps/frontend}/src/lib/config.ts (100%) rename {frontend => apps/frontend}/src/lib/constants/upload-limits.ts (100%) rename {frontend => apps/frontend}/src/lib/edge-flags.ts (100%) rename {frontend => apps/frontend}/src/lib/empty-module.ts (100%) rename {frontend => apps/frontend}/src/lib/error-handler.ts (100%) rename {frontend => apps/frontend}/src/lib/feature-flags.ts (100%) create mode 100644 apps/frontend/src/lib/icons/tool-icons.ts rename {frontend => apps/frontend}/src/lib/mermaid-utils.ts (100%) rename {frontend => apps/frontend}/src/lib/model-provider-icons.tsx (100%) rename {frontend => apps/frontend}/src/lib/polyfills.ts (100%) rename {frontend => apps/frontend}/src/lib/pricing-config.ts (100%) rename {frontend => apps/frontend}/src/lib/site-config.ts (100%) rename {frontend => apps/frontend}/src/lib/site-metadata.ts (100%) rename {frontend => apps/frontend}/src/lib/supabase/client.ts (100%) rename {frontend => apps/frontend}/src/lib/supabase/handle-edge-error.ts (100%) rename {frontend => apps/frontend}/src/lib/supabase/mfa.ts (100%) rename {frontend => apps/frontend}/src/lib/supabase/server.ts (100%) rename {frontend => apps/frontend}/src/lib/utils.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/clear-local-storage.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/credit-formatter.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/currency.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/date-formatting.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/dirty-string-parser.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/document-export.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/file-types.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/file-utils.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/geo-detection-server.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/geo-detection.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/google-docs-utils.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/icon-utils.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/is-electron.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/is-mobile-device.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/tool-parser.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/unicode.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/url-autolink.ts (100%) rename {frontend => apps/frontend}/src/lib/utils/url.ts (100%) rename {frontend => apps/frontend}/src/lib/validation.ts (100%) rename {frontend => apps/frontend}/src/middleware.ts (100%) rename {frontend => apps/frontend}/src/stores/agent-selection-store.ts (100%) rename {frontend => apps/frontend}/src/stores/agent-version-store.ts (100%) rename {frontend => apps/frontend}/src/stores/announcement-store.ts (100%) rename {frontend => apps/frontend}/src/stores/auth-tracking.ts (100%) rename {frontend => apps/frontend}/src/stores/context-usage-store.ts (100%) rename {frontend => apps/frontend}/src/stores/delete-operation-store.ts (100%) rename {frontend => apps/frontend}/src/stores/kortix-computer-store.ts (100%) rename {frontend => apps/frontend}/src/stores/message-queue-store.ts (100%) rename {frontend => apps/frontend}/src/stores/model-store.ts (100%) rename {frontend => apps/frontend}/src/stores/optimistic-files-store.ts (100%) rename {frontend => apps/frontend}/src/stores/presentation-viewer-store.tsx (100%) rename {frontend => apps/frontend}/src/stores/pricing-modal-store.ts (100%) rename {frontend => apps/frontend}/src/stores/referral-dialog.ts (100%) rename {frontend => apps/frontend}/src/stores/spreadsheet-store.ts (100%) rename {frontend => apps/frontend}/src/stores/subscription-store.tsx (100%) rename {frontend => apps/frontend}/src/stores/suna-modes-store.ts (100%) rename {frontend => apps/frontend}/src/stores/tool-stream-store.ts (100%) rename {frontend => apps/frontend}/src/stores/use-document-modal-store.ts (100%) rename {frontend => apps/frontend}/src/stores/use-editor-store.ts (100%) rename {frontend => apps/frontend}/src/stores/welcome-banner-store.ts (100%) rename {frontend => apps/frontend}/translations/de.json (100%) rename {frontend => apps/frontend}/translations/en.json (100%) rename {frontend => apps/frontend}/translations/es.json (100%) rename {frontend => apps/frontend}/translations/fr.json (100%) rename {frontend => apps/frontend}/translations/it.json (100%) rename {frontend => apps/frontend}/translations/ja.json (100%) rename {frontend => apps/frontend}/translations/pt.json (100%) rename {frontend => apps/frontend}/translations/zh.json (100%) rename {frontend => apps/frontend}/tsconfig.json (91%) rename {frontend => apps/frontend}/vercel.json (100%) create mode 100644 apps/mobile/components/chat/tool-views/web-search-tool/DeepSearchLoadingState.tsx create mode 100644 apps/mobile/lib/icons/tool-icons.ts delete mode 100644 apps/mobile/lib/utils/message-grouping.ts delete mode 100644 apps/mobile/lib/utils/tool-display.ts delete mode 100644 frontend/src/app/(dashboard)/knowledge/page.tsx delete mode 100644 frontend/src/components/memory/MemorySettings.tsx delete mode 100644 frontend/src/components/thread/chat-input/memory-toggle.tsx delete mode 100644 frontend/src/components/thread/utils.ts delete mode 100644 frontend/src/hooks/messages/utils/streaming-utils.ts create mode 100644 package.json create mode 100644 packages/shared/README.md create mode 100755 packages/shared/node_modules/.bin/tsc create mode 100755 packages/shared/node_modules/.bin/tsserver create mode 120000 packages/shared/node_modules/typescript create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/streaming/index.ts create mode 100644 packages/shared/src/streaming/message-handler.ts create mode 100644 packages/shared/src/streaming/text-ordering.ts create mode 100644 packages/shared/src/streaming/tool-accumulator.ts rename apps/mobile/lib/utils/streaming-utils.ts => packages/shared/src/streaming/utils.ts (93%) create mode 100644 packages/shared/src/tools/content-preprocessor.ts create mode 100644 packages/shared/src/tools/display-names.ts create mode 100644 packages/shared/src/tools/formatter.ts create mode 100644 packages/shared/src/tools/icon-keys.ts create mode 100644 packages/shared/src/tools/index.ts rename apps/mobile/lib/utils/tool-parser.ts => packages/shared/src/tools/parser.ts (58%) create mode 100644 packages/shared/src/tools/tool-call-utils.ts create mode 100644 packages/shared/src/types/index.ts create mode 100644 packages/shared/src/types/messages.ts create mode 100644 packages/shared/src/types/streaming.ts create mode 100644 packages/shared/src/utils/grouping.ts create mode 100644 packages/shared/src/utils/index.ts create mode 100644 packages/shared/src/utils/json.ts create mode 100644 packages/shared/src/utils/normalizers.ts create mode 100644 packages/shared/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.cursor/plans/shared_package_refactoring.plan.md b/.cursor/plans/shared_package_refactoring.plan.md new file mode 100644 index 0000000000..857289efb9 --- /dev/null +++ b/.cursor/plans/shared_package_refactoring.plan.md @@ -0,0 +1,435 @@ +# Shared Package Refactoring Plan + +## Overview + +Create a shared TypeScript package at `packages/shared` that contains all platform-agnostic code used by both frontend (Next.js) and mobile (React Native). This eliminates ~40% of duplicated code. + +## Current Duplication Analysis + +| Code | Frontend Location | Mobile Location | Status | + +|------|------------------|-----------------|--------| + +| `streaming-utils.ts` | `frontend/src/hooks/messages/utils/` | `apps/mobile/lib/utils/` | 100% identical | + +| `safeJsonParse` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/message-grouping.ts` | 95% identical | + +| `TOOL_DISPLAY_NAMES` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 95% identical | + +| `getUserFriendlyToolName` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 95% identical | + +| `formatMCPToolName` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 100% identical | + +| `groupMessages` | inline in ThreadContent | `apps/mobile/lib/utils/message-grouping.ts` | 90% identical | + +| Types (`UnifiedMessage`, etc.) | `frontend/src/components/thread/types.ts` | `apps/mobile/api/types.ts` | 95% identical |--- + +## Phase 1: Create Shared Package Structure + +### 1.1 Create Package Directory + +```javascript +packages/ +└── shared/ + ├── package.json + ├── tsconfig.json + ├── src/ + │ ├── index.ts + │ ├── types/ + │ │ ├── index.ts + │ │ ├── messages.ts # UnifiedMessage, ParsedContent, ParsedMetadata + │ │ ├── streaming.ts # StreamingToolCall, StreamingMetadata + │ │ └── agents.ts # Agent, Project, Thread (shared subset) + │ ├── streaming/ + │ │ ├── index.ts + │ │ └── utils.ts # All streaming utility functions + │ ├── tools/ + │ │ ├── index.ts + │ │ ├── display-names.ts # TOOL_DISPLAY_NAMES map + │ │ ├── icon-keys.ts # Tool -> icon name mapping (strings, not components) + │ │ └── formatter.ts # getUserFriendlyToolName, formatMCPToolName + │ └── utils/ + │ ├── index.ts + │ ├── json.ts # safeJsonParse + │ └── grouping.ts # groupMessages + └── README.md +``` + + + +### 1.2 Package Configuration + +**`packages/shared/package.json`**: + +```json +{ + "name": "@agentpress/shared", + "version": "1.0.0", + "private": true, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./types": { + "import": "./dist/types/index.mjs", + "require": "./dist/types/index.js", + "types": "./dist/types/index.d.ts" + }, + "./streaming": { + "import": "./dist/streaming/index.mjs", + "require": "./dist/streaming/index.js", + "types": "./dist/streaming/index.d.ts" + }, + "./tools": { + "import": "./dist/tools/index.mjs", + "require": "./dist/tools/index.js", + "types": "./dist/tools/index.d.ts" + }, + "./utils": { + "import": "./dist/utils/index.mjs", + "require": "./dist/utils/index.js", + "types": "./dist/utils/index.d.ts" + } + }, + "scripts": { + "build": "tsup src/index.ts --format cjs,esm --dts", + "dev": "tsup src/index.ts --format cjs,esm --dts --watch" + }, + "devDependencies": { + "tsup": "^8.0.0", + "typescript": "^5.0.0" + } +} +``` + +--- + +## Phase 2: Migrate Shared Code + +### 2.1 Types (`packages/shared/src/types/messages.ts`) + +Single source of truth for message types: + +```typescript +// Core message type matching backend schema +export interface UnifiedMessage { + message_id: string | null; + thread_id: string; + type: 'user' | 'assistant' | 'tool' | 'system' | 'status' | 'browser_state' | 'image_context' | 'llm_response_end' | 'llm_response_start'; + is_llm_message: boolean; + content: string; + metadata: string; + created_at: string; + updated_at: string; + agent_id?: string; + sequence?: number; + sandbox_id?: string; + agents?: { name: string }; +} + +export interface ParsedContent { + role?: 'user' | 'assistant' | 'tool' | 'system'; + content?: any; + tool_calls?: any[]; + tool_call_id?: string; + name?: string; + status_type?: string; + [key: string]: any; +} + +export interface ParsedMetadata { + stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; + thread_run_id?: string; + tool_calls?: Array<{ + tool_call_id: string; + function_name: string; + arguments: Record | string; + source: 'native' | 'xml'; + }>; + text_content?: string; + function_name?: string; + result?: { success: boolean; output: any; error?: string | null }; + return_format?: 'native' | 'xml'; + tool_call_id?: string; + assistant_message_id?: string; + [key: string]: any; +} +``` + + + +### 2.2 Streaming Utils (`packages/shared/src/streaming/utils.ts`) + +Move the entire `streaming-utils.ts` file (identical in both codebases): + +- `extractTextFromPartialJson` +- `extractTextFromStreamingAskComplete` +- `isAskOrCompleteTool` +- `getAskCompleteToolType` +- `extractTextFromArguments` +- `findAskOrCompleteTool` +- `extractStreamingAskCompleteContent` +- `shouldSkipStreamingRender` + +### 2.3 Tool Metadata (`packages/shared/src/tools/`) + +**`display-names.ts`** - Merge both TOOL_DISPLAY_NAMES maps: + +```typescript +export const TOOL_DISPLAY_NAMES: Map = new Map([ + // ... combined list +]); +``` + +**`icon-keys.ts`** - Platform-agnostic icon mapping (strings, not components): + +```typescript +export type ToolIconKey = + | 'globe' | 'file-edit' | 'file-search' | 'file-plus' + | 'file-text' | 'file-x' | 'terminal' | 'search' + | 'table' | 'code' | 'phone' | 'presentation' | 'wrench'; + +export function getToolIconKey(toolName: string): ToolIconKey { + switch (toolName?.toLowerCase()) { + case 'browser-navigate-to': + case 'web-search': + return 'globe'; + case 'create-file': + case 'edit-file': + return 'file-edit'; + // ... rest of mappings + default: + return 'wrench'; + } +} +``` + +**`formatter.ts`** - Tool name formatting: + +```typescript +export function getUserFriendlyToolName(toolName: string): string { ... } +export function formatMCPToolName(serverName: string, toolName: string): string { ... } +``` + + + +### 2.4 Utils (`packages/shared/src/utils/`) + +**`json.ts`**: + +```typescript +export function safeJsonParse( + jsonString: string | Record | undefined | null, + defaultValue: T +): T { ... } +``` + +**`grouping.ts`**: + +```typescript +export interface MessageGroup { + type: 'user' | 'assistant_group'; + messages: UnifiedMessage[]; + key: string; +} + +export function groupMessages(messages: UnifiedMessage[]): MessageGroup[] { ... } +``` + +--- + +## Phase 3: Update Consumers + +### 3.1 Frontend Updates + +**`frontend/package.json`** - Add workspace dependency: + +```json +{ + "dependencies": { + "@agentpress/shared": "workspace:*" + } +} +``` + +**Update imports** throughout frontend: + +```typescript +// Before +import { safeJsonParse, HIDE_STREAMING_XML_TAGS } from '@/components/thread/utils'; +import { extractTextFromPartialJson } from '@/hooks/messages/utils/streaming-utils'; + +// After +import { safeJsonParse } from '@agentpress/shared/utils'; +import { extractTextFromPartialJson } from '@agentpress/shared/streaming'; +import type { UnifiedMessage, ParsedMetadata } from '@agentpress/shared/types'; +``` + +**Keep platform-specific code**: + +- `getToolIcon` function (uses `lucide-react` components) +- `useSmoothText` hook (uses `requestAnimationFrame`) +- All React components + +### 3.2 Mobile Updates + +**`apps/mobile/package.json`** - Add workspace dependency: + +```json +{ + "dependencies": { + "@agentpress/shared": "workspace:*" + } +} +``` + +**Update imports** throughout mobile: + +```typescript +// Before +import { safeJsonParse } from '@/lib/utils/message-grouping'; +import { extractTextFromPartialJson } from '@/lib/utils/streaming-utils'; + +// After +import { safeJsonParse } from '@agentpress/shared/utils'; +import { extractTextFromPartialJson } from '@agentpress/shared/streaming'; +import type { UnifiedMessage, ParsedMetadata } from '@agentpress/shared/types'; +``` + +**Keep platform-specific code**: + +- `getToolIcon` function (uses `lucide-react-native` components) +- React Native components + +--- + +## Phase 4: Icon Mapping Strategy + +Since icons are platform-specific, use a mapping pattern:**Shared package** (`packages/shared/src/tools/icon-keys.ts`): + +```typescript +export const TOOL_ICON_KEYS = { + 'browser-navigate-to': 'globe', + 'web-search': 'globe', + 'create-file': 'file-edit', + // ... +} as const; + +export type ToolIconKey = typeof TOOL_ICON_KEYS[keyof typeof TOOL_ICON_KEYS]; +export function getToolIconKey(toolName: string): ToolIconKey; +``` + +**Frontend** (`frontend/src/components/thread/icon-resolver.ts`): + +```typescript +import { getToolIconKey, type ToolIconKey } from '@agentpress/shared/tools'; +import { Globe, FileEdit, Terminal, ... } from 'lucide-react'; + +const ICON_MAP: Record = { + 'globe': Globe, + 'file-edit': FileEdit, + 'terminal': Terminal, + // ... +}; + +export function getToolIcon(toolName: string): React.ElementType { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} +``` + +**Mobile** (`apps/mobile/lib/utils/icon-resolver.ts`): + +```typescript +import { getToolIconKey, type ToolIconKey } from '@agentpress/shared/tools'; +import { Globe, FileEdit, Terminal, ... } from 'lucide-react-native'; + +const ICON_MAP: Record = { + 'globe': Globe, + 'file-edit': FileEdit, + 'terminal': Terminal, + // ... +}; + +export function getToolIcon(toolName: string): LucideIcon { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} +``` + +--- + +## Phase 5: Workspace Configuration + +### 5.1 Root `package.json` + +```json +{ + "private": true, + "workspaces": [ + "frontend", + "apps/*", + "packages/*" + ] +} +``` + + + +### 5.2 TypeScript Configuration + +Each consumer needs to reference the shared package in their `tsconfig.json`:**Frontend** (`frontend/tsconfig.json`): + +```json +{ + "compilerOptions": { + "paths": { + "@agentpress/shared/*": ["../packages/shared/src/*"] + } + }, + "references": [ + { "path": "../packages/shared" } + ] +} +``` + +--- + +## Implementation Order + +1. **Week 1**: Create shared package structure with types and utils +2. **Week 2**: Migrate streaming-utils and tool metadata +3. **Week 3**: Update frontend to use shared package +4. **Week 4**: Update mobile to use shared package +5. **Week 5**: Delete duplicated files, cleanup + +--- + +## Files to Delete After Migration + +### Frontend + +- `frontend/src/hooks/messages/utils/streaming-utils.ts` (moved to shared) +- Parts of `frontend/src/components/thread/utils.ts` (keep icon component mapping) +- Parts of `frontend/src/components/thread/types.ts` (keep React-specific extensions) + +### Mobile + +- `apps/mobile/lib/utils/streaming-utils.ts` (moved to shared) +- `apps/mobile/lib/utils/message-grouping.ts` (moved to shared) +- Parts of `apps/mobile/lib/utils/tool-display.ts` (keep icon component mapping) +- Parts of `apps/mobile/api/types.ts` (keep API-specific extensions) + +--- + +## Benefits + +1. **Single source of truth** - Types and logic defined once +2. **Automatic sync** - Changes propagate to both platforms +3. **Reduced maintenance** - Fix bugs once, applied everywhere +4. **Better testing** - Test shared logic in isolation \ No newline at end of file diff --git a/.gitignore b/.gitignore index 12ed76d393..c588e6dfbb 100644 --- a/.gitignore +++ b/.gitignore @@ -212,6 +212,9 @@ dump.rdb # CodeWebChat state and logs (auto-added) .cwc/ +# Node.js dependencies +node_modules/ +**/node_modules/ # mobile specific apps/mobile/node_modules/ diff --git a/frontend/.dockerignore b/apps/frontend/.dockerignore similarity index 100% rename from frontend/.dockerignore rename to apps/frontend/.dockerignore diff --git a/frontend/.env.example b/apps/frontend/.env.example similarity index 100% rename from frontend/.env.example rename to apps/frontend/.env.example diff --git a/frontend/.gitignore b/apps/frontend/.gitignore similarity index 100% rename from frontend/.gitignore rename to apps/frontend/.gitignore diff --git a/frontend/.npmrc b/apps/frontend/.npmrc similarity index 100% rename from frontend/.npmrc rename to apps/frontend/.npmrc diff --git a/frontend/.prettierignore b/apps/frontend/.prettierignore similarity index 100% rename from frontend/.prettierignore rename to apps/frontend/.prettierignore diff --git a/frontend/.prettierrc b/apps/frontend/.prettierrc similarity index 100% rename from frontend/.prettierrc rename to apps/frontend/.prettierrc diff --git a/frontend/Dockerfile b/apps/frontend/Dockerfile similarity index 100% rename from frontend/Dockerfile rename to apps/frontend/Dockerfile diff --git a/frontend/README.md b/apps/frontend/README.md similarity index 100% rename from frontend/README.md rename to apps/frontend/README.md diff --git a/frontend/components.json b/apps/frontend/components.json similarity index 100% rename from frontend/components.json rename to apps/frontend/components.json diff --git a/frontend/eslint.config.mjs b/apps/frontend/eslint.config.mjs similarity index 100% rename from frontend/eslint.config.mjs rename to apps/frontend/eslint.config.mjs diff --git a/frontend/instrumentation-client.ts b/apps/frontend/instrumentation-client.ts similarity index 100% rename from frontend/instrumentation-client.ts rename to apps/frontend/instrumentation-client.ts diff --git a/frontend/next b/apps/frontend/next similarity index 100% rename from frontend/next rename to apps/frontend/next diff --git a/frontend/next.config.ts b/apps/frontend/next.config.ts similarity index 97% rename from frontend/next.config.ts rename to apps/frontend/next.config.ts index 55da7047e6..90d749084d 100644 --- a/frontend/next.config.ts +++ b/apps/frontend/next.config.ts @@ -35,6 +35,9 @@ const getBackendUrl = (): string => { const nextConfig = (): NextConfig => ({ output: (process.env.NEXT_OUTPUT as 'standalone') || undefined, + // Transpile shared package + transpilePackages: ['@agentpress/shared'], + // Set environment variables env: { NEXT_PUBLIC_BACKEND_URL: getBackendUrl(), diff --git a/frontend/package-lock.json b/apps/frontend/package-lock.json similarity index 100% rename from frontend/package-lock.json rename to apps/frontend/package-lock.json diff --git a/frontend/package.json b/apps/frontend/package.json similarity index 93% rename from frontend/package.json rename to apps/frontend/package.json index c4dad7092a..4a19d3ed79 100644 --- a/frontend/package.json +++ b/apps/frontend/package.json @@ -11,7 +11,9 @@ "format:check": "prettier --check ." }, "dependencies": { + "@agentpress/shared": "workspace:*", "@calcom/embed-react": "^1.5.2", + "@codemirror/commands": "^6.10.1", "@codemirror/view": "^6.38.1", "@cyntler/react-doc-viewer": "^1.17.1", "@dnd-kit/core": "^6.3.1", @@ -50,6 +52,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-use-controllable-state": "^1.2.2", + "@radix-ui/react-visually-hidden": "^1.2.4", "@react-pdf/renderer": "^4.3.0", "@shikijs/transformers": "^3.12.0", "@silevis/reactgrid": "^4.1.17", @@ -69,16 +72,22 @@ "@tanstack/react-query": "^5.75.2", "@tanstack/react-query-devtools": "^5.75.2", "@tanstack/react-table": "^8.21.3", + "@tiptap/core": "^3.14.0", + "@tiptap/extension-blockquote": "^3.14.0", "@tiptap/extension-bubble-menu": "^3.13.0", "@tiptap/extension-character-count": "^3.3.0", + "@tiptap/extension-code-block": "^3.14.0", "@tiptap/extension-code-block-lowlight": "^3.3.0", "@tiptap/extension-collaboration": "^3.3.0", "@tiptap/extension-color": "^3.3.0", "@tiptap/extension-details": "^3.3.0", + "@tiptap/extension-document": "^3.14.0", "@tiptap/extension-dropcursor": "^3.3.0", "@tiptap/extension-emoji": "^3.3.0", "@tiptap/extension-font-family": "^3.3.0", "@tiptap/extension-gapcursor": "^3.3.0", + "@tiptap/extension-hard-break": "^3.14.0", + "@tiptap/extension-heading": "^3.14.0", "@tiptap/extension-highlight": "^3.3.0", "@tiptap/extension-history": "^3.3.0", "@tiptap/extension-horizontal-rule": "^3.3.0", @@ -87,15 +96,19 @@ "@tiptap/extension-list": "^3.3.0", "@tiptap/extension-mathematics": "^3.3.0", "@tiptap/extension-mention": "^3.3.0", + "@tiptap/extension-paragraph": "^3.14.0", "@tiptap/extension-placeholder": "^3.3.0", + "@tiptap/extension-strike": "^3.14.0", "@tiptap/extension-subscript": "^3.3.0", "@tiptap/extension-superscript": "^3.3.0", "@tiptap/extension-table": "^3.3.0", "@tiptap/extension-task-item": "^3.3.0", "@tiptap/extension-task-list": "^3.3.0", + "@tiptap/extension-text": "^3.14.0", "@tiptap/extension-text-align": "^3.3.0", "@tiptap/extension-text-style": "^3.13.0", "@tiptap/extension-typography": "^3.3.0", + "@tiptap/extension-underline": "^3.14.0", "@tiptap/extension-youtube": "^3.3.0", "@tiptap/pm": "^3.3.0", "@tiptap/react": "^3.3.0", diff --git a/frontend/postcss.config.mjs b/apps/frontend/postcss.config.mjs similarity index 100% rename from frontend/postcss.config.mjs rename to apps/frontend/postcss.config.mjs diff --git a/frontend/public/Logomark-Black.png b/apps/frontend/public/Logomark-Black.png similarity index 100% rename from frontend/public/Logomark-Black.png rename to apps/frontend/public/Logomark-Black.png diff --git a/frontend/public/Logomark.svg b/apps/frontend/public/Logomark.svg similarity index 100% rename from frontend/public/Logomark.svg rename to apps/frontend/public/Logomark.svg diff --git a/frontend/public/banner.png b/apps/frontend/public/banner.png similarity index 100% rename from frontend/public/banner.png rename to apps/frontend/public/banner.png diff --git a/frontend/public/favicon-light.png b/apps/frontend/public/favicon-light.png similarity index 100% rename from frontend/public/favicon-light.png rename to apps/frontend/public/favicon-light.png diff --git a/frontend/public/favicon.png b/apps/frontend/public/favicon.png similarity index 100% rename from frontend/public/favicon.png rename to apps/frontend/public/favicon.png diff --git a/frontend/public/fonts/roobert/RoobertItalicsVF.woff2 b/apps/frontend/public/fonts/roobert/RoobertItalicsVF.woff2 similarity index 100% rename from frontend/public/fonts/roobert/RoobertItalicsVF.woff2 rename to apps/frontend/public/fonts/roobert/RoobertItalicsVF.woff2 diff --git a/frontend/public/fonts/roobert/RoobertMonoItalicsVF.woff2 b/apps/frontend/public/fonts/roobert/RoobertMonoItalicsVF.woff2 similarity index 100% rename from frontend/public/fonts/roobert/RoobertMonoItalicsVF.woff2 rename to apps/frontend/public/fonts/roobert/RoobertMonoItalicsVF.woff2 diff --git a/frontend/public/fonts/roobert/RoobertMonoUprightsVF.woff2 b/apps/frontend/public/fonts/roobert/RoobertMonoUprightsVF.woff2 similarity index 100% rename from frontend/public/fonts/roobert/RoobertMonoUprightsVF.woff2 rename to apps/frontend/public/fonts/roobert/RoobertMonoUprightsVF.woff2 diff --git a/frontend/public/fonts/roobert/RoobertUprightsVF.woff2 b/apps/frontend/public/fonts/roobert/RoobertUprightsVF.woff2 similarity index 100% rename from frontend/public/fonts/roobert/RoobertUprightsVF.woff2 rename to apps/frontend/public/fonts/roobert/RoobertUprightsVF.woff2 diff --git a/frontend/public/grain-texture.png b/apps/frontend/public/grain-texture.png similarity index 100% rename from frontend/public/grain-texture.png rename to apps/frontend/public/grain-texture.png diff --git a/frontend/public/images/canvas/create.png b/apps/frontend/public/images/canvas/create.png similarity index 100% rename from frontend/public/images/canvas/create.png rename to apps/frontend/public/images/canvas/create.png diff --git a/frontend/public/images/canvas/edit.png b/apps/frontend/public/images/canvas/edit.png similarity index 100% rename from frontend/public/images/canvas/edit.png rename to apps/frontend/public/images/canvas/edit.png diff --git a/frontend/public/images/canvas/remove-bg.png b/apps/frontend/public/images/canvas/remove-bg.png similarity index 100% rename from frontend/public/images/canvas/remove-bg.png rename to apps/frontend/public/images/canvas/remove-bg.png diff --git a/frontend/public/images/canvas/upscale.png b/apps/frontend/public/images/canvas/upscale.png similarity index 100% rename from frontend/public/images/canvas/upscale.png rename to apps/frontend/public/images/canvas/upscale.png diff --git a/frontend/public/images/image-styles/abstract_organic-min.png b/apps/frontend/public/images/image-styles/abstract_organic-min.png similarity index 100% rename from frontend/public/images/image-styles/abstract_organic-min.png rename to apps/frontend/public/images/image-styles/abstract_organic-min.png diff --git a/frontend/public/images/image-styles/anime_forest-min.png b/apps/frontend/public/images/image-styles/anime_forest-min.png similarity index 100% rename from frontend/public/images/image-styles/anime_forest-min.png rename to apps/frontend/public/images/image-styles/anime_forest-min.png diff --git a/frontend/public/images/image-styles/comic_book_robot-min.png b/apps/frontend/public/images/image-styles/comic_book_robot-min.png similarity index 100% rename from frontend/public/images/image-styles/comic_book_robot-min.png rename to apps/frontend/public/images/image-styles/comic_book_robot-min.png diff --git a/frontend/public/images/image-styles/digital_art_cyberpunk-min.png b/apps/frontend/public/images/image-styles/digital_art_cyberpunk-min.png similarity index 100% rename from frontend/public/images/image-styles/digital_art_cyberpunk-min.png rename to apps/frontend/public/images/image-styles/digital_art_cyberpunk-min.png diff --git a/frontend/public/images/image-styles/geometric_crystal-min.png b/apps/frontend/public/images/image-styles/geometric_crystal-min.png similarity index 100% rename from frontend/public/images/image-styles/geometric_crystal-min.png rename to apps/frontend/public/images/image-styles/geometric_crystal-min.png diff --git a/frontend/public/images/image-styles/impressionist_garden-min.png b/apps/frontend/public/images/image-styles/impressionist_garden-min.png similarity index 100% rename from frontend/public/images/image-styles/impressionist_garden-min.png rename to apps/frontend/public/images/image-styles/impressionist_garden-min.png diff --git a/frontend/public/images/image-styles/isometric_bedroom-min.png b/apps/frontend/public/images/image-styles/isometric_bedroom-min.png similarity index 100% rename from frontend/public/images/image-styles/isometric_bedroom-min.png rename to apps/frontend/public/images/image-styles/isometric_bedroom-min.png diff --git a/frontend/public/images/image-styles/minimalist_coffee-min.png b/apps/frontend/public/images/image-styles/minimalist_coffee-min.png similarity index 100% rename from frontend/public/images/image-styles/minimalist_coffee-min.png rename to apps/frontend/public/images/image-styles/minimalist_coffee-min.png diff --git a/frontend/public/images/image-styles/neon_jellyfish-min.png b/apps/frontend/public/images/image-styles/neon_jellyfish-min.png similarity index 100% rename from frontend/public/images/image-styles/neon_jellyfish-min.png rename to apps/frontend/public/images/image-styles/neon_jellyfish-min.png diff --git a/frontend/public/images/image-styles/oil_painting_villa-min.png b/apps/frontend/public/images/image-styles/oil_painting_villa-min.png similarity index 100% rename from frontend/public/images/image-styles/oil_painting_villa-min.png rename to apps/frontend/public/images/image-styles/oil_painting_villa-min.png diff --git a/frontend/public/images/image-styles/pastel_landscape-min.png b/apps/frontend/public/images/image-styles/pastel_landscape-min.png similarity index 100% rename from frontend/public/images/image-styles/pastel_landscape-min.png rename to apps/frontend/public/images/image-styles/pastel_landscape-min.png diff --git a/frontend/public/images/image-styles/photorealistic_eagle-min.png b/apps/frontend/public/images/image-styles/photorealistic_eagle-min.png similarity index 100% rename from frontend/public/images/image-styles/photorealistic_eagle-min.png rename to apps/frontend/public/images/image-styles/photorealistic_eagle-min.png diff --git a/frontend/public/images/image-styles/surreal_islands-min.png b/apps/frontend/public/images/image-styles/surreal_islands-min.png similarity index 100% rename from frontend/public/images/image-styles/surreal_islands-min.png rename to apps/frontend/public/images/image-styles/surreal_islands-min.png diff --git a/frontend/public/images/image-styles/vintage_diner-min.png b/apps/frontend/public/images/image-styles/vintage_diner-min.png similarity index 100% rename from frontend/public/images/image-styles/vintage_diner-min.png rename to apps/frontend/public/images/image-styles/vintage_diner-min.png diff --git a/frontend/public/images/image-styles/watercolor_garden-min.png b/apps/frontend/public/images/image-styles/watercolor_garden-min.png similarity index 100% rename from frontend/public/images/image-styles/watercolor_garden-min.png rename to apps/frontend/public/images/image-styles/watercolor_garden-min.png diff --git a/frontend/public/images/landing-showcase/data.png b/apps/frontend/public/images/landing-showcase/data.png similarity index 100% rename from frontend/public/images/landing-showcase/data.png rename to apps/frontend/public/images/landing-showcase/data.png diff --git a/frontend/public/images/landing-showcase/docs.png b/apps/frontend/public/images/landing-showcase/docs.png similarity index 100% rename from frontend/public/images/landing-showcase/docs.png rename to apps/frontend/public/images/landing-showcase/docs.png diff --git a/frontend/public/images/landing-showcase/images.png b/apps/frontend/public/images/landing-showcase/images.png similarity index 100% rename from frontend/public/images/landing-showcase/images.png rename to apps/frontend/public/images/landing-showcase/images.png diff --git a/frontend/public/images/landing-showcase/research.png b/apps/frontend/public/images/landing-showcase/research.png similarity index 100% rename from frontend/public/images/landing-showcase/research.png rename to apps/frontend/public/images/landing-showcase/research.png diff --git a/frontend/public/images/landing-showcase/slides.png b/apps/frontend/public/images/landing-showcase/slides.png similarity index 100% rename from frontend/public/images/landing-showcase/slides.png rename to apps/frontend/public/images/landing-showcase/slides.png diff --git a/frontend/public/images/models/Anthropic.svg b/apps/frontend/public/images/models/Anthropic.svg similarity index 100% rename from frontend/public/images/models/Anthropic.svg rename to apps/frontend/public/images/models/Anthropic.svg diff --git a/frontend/public/images/models/Gemini.svg b/apps/frontend/public/images/models/Gemini.svg similarity index 100% rename from frontend/public/images/models/Gemini.svg rename to apps/frontend/public/images/models/Gemini.svg diff --git a/frontend/public/images/models/Grok.svg b/apps/frontend/public/images/models/Grok.svg similarity index 100% rename from frontend/public/images/models/Grok.svg rename to apps/frontend/public/images/models/Grok.svg diff --git a/frontend/public/images/models/Moonshot.svg b/apps/frontend/public/images/models/Moonshot.svg similarity index 100% rename from frontend/public/images/models/Moonshot.svg rename to apps/frontend/public/images/models/Moonshot.svg diff --git a/frontend/public/images/models/OAI.svg b/apps/frontend/public/images/models/OAI.svg similarity index 100% rename from frontend/public/images/models/OAI.svg rename to apps/frontend/public/images/models/OAI.svg diff --git a/frontend/public/images/presentation-templates/architect-min.png b/apps/frontend/public/images/presentation-templates/architect-min.png similarity index 100% rename from frontend/public/images/presentation-templates/architect-min.png rename to apps/frontend/public/images/presentation-templates/architect-min.png diff --git a/frontend/public/images/presentation-templates/black_and_white_clean-min.png b/apps/frontend/public/images/presentation-templates/black_and_white_clean-min.png similarity index 100% rename from frontend/public/images/presentation-templates/black_and_white_clean-min.png rename to apps/frontend/public/images/presentation-templates/black_and_white_clean-min.png diff --git a/frontend/public/images/presentation-templates/colorful-min.png b/apps/frontend/public/images/presentation-templates/colorful-min.png similarity index 100% rename from frontend/public/images/presentation-templates/colorful-min.png rename to apps/frontend/public/images/presentation-templates/colorful-min.png diff --git a/frontend/public/images/presentation-templates/competitor_analysis_blue-min.png b/apps/frontend/public/images/presentation-templates/competitor_analysis_blue-min.png similarity index 100% rename from frontend/public/images/presentation-templates/competitor_analysis_blue-min.png rename to apps/frontend/public/images/presentation-templates/competitor_analysis_blue-min.png diff --git a/frontend/public/images/presentation-templates/elevator_pitch-min.png b/apps/frontend/public/images/presentation-templates/elevator_pitch-min.png similarity index 100% rename from frontend/public/images/presentation-templates/elevator_pitch-min.png rename to apps/frontend/public/images/presentation-templates/elevator_pitch-min.png diff --git a/frontend/public/images/presentation-templates/gamer_gray-min.png b/apps/frontend/public/images/presentation-templates/gamer_gray-min.png similarity index 100% rename from frontend/public/images/presentation-templates/gamer_gray-min.png rename to apps/frontend/public/images/presentation-templates/gamer_gray-min.png diff --git a/frontend/public/images/presentation-templates/green-min.png b/apps/frontend/public/images/presentation-templates/green-min.png similarity index 100% rename from frontend/public/images/presentation-templates/green-min.png rename to apps/frontend/public/images/presentation-templates/green-min.png diff --git a/frontend/public/images/presentation-templates/hipster-min.png b/apps/frontend/public/images/presentation-templates/hipster-min.png similarity index 100% rename from frontend/public/images/presentation-templates/hipster-min.png rename to apps/frontend/public/images/presentation-templates/hipster-min.png diff --git a/frontend/public/images/presentation-templates/minimalist-min.png b/apps/frontend/public/images/presentation-templates/minimalist-min.png similarity index 100% rename from frontend/public/images/presentation-templates/minimalist-min.png rename to apps/frontend/public/images/presentation-templates/minimalist-min.png diff --git a/frontend/public/images/presentation-templates/minimalist_2-min.png b/apps/frontend/public/images/presentation-templates/minimalist_2-min.png similarity index 100% rename from frontend/public/images/presentation-templates/minimalist_2-min.png rename to apps/frontend/public/images/presentation-templates/minimalist_2-min.png diff --git a/frontend/public/images/presentation-templates/numbers_clean-min.png b/apps/frontend/public/images/presentation-templates/numbers_clean-min.png similarity index 100% rename from frontend/public/images/presentation-templates/numbers_clean-min.png rename to apps/frontend/public/images/presentation-templates/numbers_clean-min.png diff --git a/frontend/public/images/presentation-templates/numbers_colorful-min.png b/apps/frontend/public/images/presentation-templates/numbers_colorful-min.png similarity index 100% rename from frontend/public/images/presentation-templates/numbers_colorful-min.png rename to apps/frontend/public/images/presentation-templates/numbers_colorful-min.png diff --git a/frontend/public/images/presentation-templates/portfolio-min.png b/apps/frontend/public/images/presentation-templates/portfolio-min.png similarity index 100% rename from frontend/public/images/presentation-templates/portfolio-min.png rename to apps/frontend/public/images/presentation-templates/portfolio-min.png diff --git a/frontend/public/images/presentation-templates/premium_black-min.png b/apps/frontend/public/images/presentation-templates/premium_black-min.png similarity index 100% rename from frontend/public/images/presentation-templates/premium_black-min.png rename to apps/frontend/public/images/presentation-templates/premium_black-min.png diff --git a/frontend/public/images/presentation-templates/premium_green-min.png b/apps/frontend/public/images/presentation-templates/premium_green-min.png similarity index 100% rename from frontend/public/images/presentation-templates/premium_green-min.png rename to apps/frontend/public/images/presentation-templates/premium_green-min.png diff --git a/frontend/public/images/presentation-templates/professor_gray-min.png b/apps/frontend/public/images/presentation-templates/professor_gray-min.png similarity index 100% rename from frontend/public/images/presentation-templates/professor_gray-min.png rename to apps/frontend/public/images/presentation-templates/professor_gray-min.png diff --git a/frontend/public/images/presentation-templates/startup-min.png b/apps/frontend/public/images/presentation-templates/startup-min.png similarity index 100% rename from frontend/public/images/presentation-templates/startup-min.png rename to apps/frontend/public/images/presentation-templates/startup-min.png diff --git a/frontend/public/images/presentation-templates/textbook-min.png b/apps/frontend/public/images/presentation-templates/textbook-min.png similarity index 100% rename from frontend/public/images/presentation-templates/textbook-min.png rename to apps/frontend/public/images/presentation-templates/textbook-min.png diff --git a/frontend/public/images/video-styles/abstract.png b/apps/frontend/public/images/video-styles/abstract.png similarity index 100% rename from frontend/public/images/video-styles/abstract.png rename to apps/frontend/public/images/video-styles/abstract.png diff --git a/frontend/public/images/video-styles/animation.png b/apps/frontend/public/images/video-styles/animation.png similarity index 100% rename from frontend/public/images/video-styles/animation.png rename to apps/frontend/public/images/video-styles/animation.png diff --git a/frontend/public/images/video-styles/cinematic.png b/apps/frontend/public/images/video-styles/cinematic.png similarity index 100% rename from frontend/public/images/video-styles/cinematic.png rename to apps/frontend/public/images/video-styles/cinematic.png diff --git a/frontend/public/images/video-styles/nature.png b/apps/frontend/public/images/video-styles/nature.png similarity index 100% rename from frontend/public/images/video-styles/nature.png rename to apps/frontend/public/images/video-styles/nature.png diff --git a/frontend/public/images/video-styles/person.png b/apps/frontend/public/images/video-styles/person.png similarity index 100% rename from frontend/public/images/video-styles/person.png rename to apps/frontend/public/images/video-styles/person.png diff --git a/frontend/public/images/video-styles/product.png b/apps/frontend/public/images/video-styles/product.png similarity index 100% rename from frontend/public/images/video-styles/product.png rename to apps/frontend/public/images/video-styles/product.png diff --git a/frontend/public/kortix-brandmark-effect-full.svg b/apps/frontend/public/kortix-brandmark-effect-full.svg similarity index 100% rename from frontend/public/kortix-brandmark-effect-full.svg rename to apps/frontend/public/kortix-brandmark-effect-full.svg diff --git a/frontend/public/kortix-brandmark-effect.svg b/apps/frontend/public/kortix-brandmark-effect.svg similarity index 100% rename from frontend/public/kortix-brandmark-effect.svg rename to apps/frontend/public/kortix-brandmark-effect.svg diff --git a/frontend/public/kortix-symbol.svg b/apps/frontend/public/kortix-symbol.svg similarity index 100% rename from frontend/public/kortix-symbol.svg rename to apps/frontend/public/kortix-symbol.svg diff --git a/frontend/public/logo_black.png b/apps/frontend/public/logo_black.png similarity index 100% rename from frontend/public/logo_black.png rename to apps/frontend/public/logo_black.png diff --git a/frontend/public/logomark-white.svg b/apps/frontend/public/logomark-white.svg similarity index 100% rename from frontend/public/logomark-white.svg rename to apps/frontend/public/logomark-white.svg diff --git a/frontend/public/manifest.json b/apps/frontend/public/manifest.json similarity index 100% rename from frontend/public/manifest.json rename to apps/frontend/public/manifest.json diff --git a/frontend/public/plan-icons/basic.svg b/apps/frontend/public/plan-icons/basic.svg similarity index 100% rename from frontend/public/plan-icons/basic.svg rename to apps/frontend/public/plan-icons/basic.svg diff --git a/frontend/public/plan-icons/plus.svg b/apps/frontend/public/plan-icons/plus.svg similarity index 100% rename from frontend/public/plan-icons/plus.svg rename to apps/frontend/public/plan-icons/plus.svg diff --git a/frontend/public/plan-icons/pro.svg b/apps/frontend/public/plan-icons/pro.svg similarity index 100% rename from frontend/public/plan-icons/pro.svg rename to apps/frontend/public/plan-icons/pro.svg diff --git a/frontend/public/plan-icons/ultra.svg b/apps/frontend/public/plan-icons/ultra.svg similarity index 100% rename from frontend/public/plan-icons/ultra.svg rename to apps/frontend/public/plan-icons/ultra.svg diff --git a/frontend/public/robots.txt b/apps/frontend/public/robots.txt similarity index 100% rename from frontend/public/robots.txt rename to apps/frontend/public/robots.txt diff --git a/frontend/public/share-page/og-fallback.png b/apps/frontend/public/share-page/og-fallback.png similarity index 100% rename from frontend/public/share-page/og-fallback.png rename to apps/frontend/public/share-page/og-fallback.png diff --git a/frontend/public/showcase/data/dashboard.png b/apps/frontend/public/showcase/data/dashboard.png similarity index 100% rename from frontend/public/showcase/data/dashboard.png rename to apps/frontend/public/showcase/data/dashboard.png diff --git a/frontend/public/showcase/image/logo.png b/apps/frontend/public/showcase/image/logo.png similarity index 100% rename from frontend/public/showcase/image/logo.png rename to apps/frontend/public/showcase/image/logo.png diff --git a/frontend/public/showcase/image/mockup-board.png b/apps/frontend/public/showcase/image/mockup-board.png similarity index 100% rename from frontend/public/showcase/image/mockup-board.png rename to apps/frontend/public/showcase/image/mockup-board.png diff --git a/frontend/public/showcase/presentation/browser.png b/apps/frontend/public/showcase/presentation/browser.png similarity index 100% rename from frontend/public/showcase/presentation/browser.png rename to apps/frontend/public/showcase/presentation/browser.png diff --git a/frontend/public/showcase/presentation/slide1.png b/apps/frontend/public/showcase/presentation/slide1.png similarity index 100% rename from frontend/public/showcase/presentation/slide1.png rename to apps/frontend/public/showcase/presentation/slide1.png diff --git a/frontend/public/showcase/presentation/slide2.png b/apps/frontend/public/showcase/presentation/slide2.png similarity index 100% rename from frontend/public/showcase/presentation/slide2.png rename to apps/frontend/public/showcase/presentation/slide2.png diff --git a/frontend/public/wordmark.svg b/apps/frontend/public/wordmark.svg similarity index 100% rename from frontend/public/wordmark.svg rename to apps/frontend/public/wordmark.svg diff --git a/frontend/src/app/(dashboard)/admin/analytics/page.tsx b/apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/admin/analytics/page.tsx rename to apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx diff --git a/frontend/src/app/(dashboard)/admin/billing/page.tsx b/apps/frontend/src/app/(dashboard)/admin/billing/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/admin/billing/page.tsx rename to apps/frontend/src/app/(dashboard)/admin/billing/page.tsx diff --git a/frontend/src/app/(dashboard)/admin/feedback/page.tsx b/apps/frontend/src/app/(dashboard)/admin/feedback/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/admin/feedback/page.tsx rename to apps/frontend/src/app/(dashboard)/admin/feedback/page.tsx diff --git a/frontend/src/app/(dashboard)/admin/notifications/page.tsx b/apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/admin/notifications/page.tsx rename to apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx diff --git a/frontend/src/app/(dashboard)/agents/[threadId]/layout.tsx b/apps/frontend/src/app/(dashboard)/agents/[threadId]/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/[threadId]/layout.tsx rename to apps/frontend/src/app/(dashboard)/agents/[threadId]/layout.tsx diff --git a/frontend/src/app/(dashboard)/agents/[threadId]/page.tsx b/apps/frontend/src/app/(dashboard)/agents/[threadId]/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/[threadId]/page.tsx rename to apps/frontend/src/app/(dashboard)/agents/[threadId]/page.tsx diff --git a/frontend/src/app/(dashboard)/agents/[threadId]/redirect-page.tsx b/apps/frontend/src/app/(dashboard)/agents/[threadId]/redirect-page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/[threadId]/redirect-page.tsx rename to apps/frontend/src/app/(dashboard)/agents/[threadId]/redirect-page.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/knowledge-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/knowledge-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/knowledge-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/knowledge-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx rename to apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx diff --git a/frontend/src/app/(dashboard)/agents/layout.tsx b/apps/frontend/src/app/(dashboard)/agents/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/layout.tsx rename to apps/frontend/src/app/(dashboard)/agents/layout.tsx diff --git a/frontend/src/app/(dashboard)/agents/page.tsx b/apps/frontend/src/app/(dashboard)/agents/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/agents/page.tsx rename to apps/frontend/src/app/(dashboard)/agents/page.tsx diff --git a/frontend/src/app/(dashboard)/credits-explained/page.tsx b/apps/frontend/src/app/(dashboard)/credits-explained/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/credits-explained/page.tsx rename to apps/frontend/src/app/(dashboard)/credits-explained/page.tsx diff --git a/frontend/src/app/(dashboard)/dashboard/page.tsx b/apps/frontend/src/app/(dashboard)/dashboard/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/dashboard/page.tsx rename to apps/frontend/src/app/(dashboard)/dashboard/page.tsx diff --git a/apps/frontend/src/app/(dashboard)/knowledge/page.tsx b/apps/frontend/src/app/(dashboard)/knowledge/page.tsx new file mode 100644 index 0000000000..556b9feff5 --- /dev/null +++ b/apps/frontend/src/app/(dashboard)/knowledge/page.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { FileText, Sparkles } from 'lucide-react'; +import { Alert, AlertDescription } from '@/components/ui/alert'; +import { useRouter } from 'next/navigation'; +import { Button } from '@/components/ui/button'; + +export default function KnowledgeRoute() { + const router = useRouter(); + + return ( +
+
+
+
+
+ +
+

Knowledge Base

+
+ + + + + Coming Soon +

+ Knowledge Base is currently under development. This feature will allow you to upload documents and files that your agents can reference to provide more accurate and context-aware responses. +

+
+
+ +
+ +
+
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/app/(dashboard)/layout.tsx b/apps/frontend/src/app/(dashboard)/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/layout.tsx rename to apps/frontend/src/app/(dashboard)/layout.tsx diff --git a/frontend/src/app/(dashboard)/onboarding-demo/page.tsx b/apps/frontend/src/app/(dashboard)/onboarding-demo/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/onboarding-demo/page.tsx rename to apps/frontend/src/app/(dashboard)/onboarding-demo/page.tsx diff --git a/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/layout.tsx b/apps/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/layout.tsx rename to apps/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/layout.tsx diff --git a/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/page.tsx b/apps/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/page.tsx rename to apps/frontend/src/app/(dashboard)/projects/[projectId]/thread/[threadId]/page.tsx diff --git a/frontend/src/app/(dashboard)/settings/api-keys/layout.tsx b/apps/frontend/src/app/(dashboard)/settings/api-keys/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/settings/api-keys/layout.tsx rename to apps/frontend/src/app/(dashboard)/settings/api-keys/layout.tsx diff --git a/frontend/src/app/(dashboard)/settings/api-keys/page.tsx b/apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/settings/api-keys/page.tsx rename to apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx diff --git a/frontend/src/app/(dashboard)/settings/credentials/layout.tsx b/apps/frontend/src/app/(dashboard)/settings/credentials/layout.tsx similarity index 100% rename from frontend/src/app/(dashboard)/settings/credentials/layout.tsx rename to apps/frontend/src/app/(dashboard)/settings/credentials/layout.tsx diff --git a/frontend/src/app/(dashboard)/settings/credentials/page.tsx b/apps/frontend/src/app/(dashboard)/settings/credentials/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/settings/credentials/page.tsx rename to apps/frontend/src/app/(dashboard)/settings/credentials/page.tsx diff --git a/frontend/src/app/(dashboard)/thread/[threadId]/page.tsx b/apps/frontend/src/app/(dashboard)/thread/[threadId]/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/thread/[threadId]/page.tsx rename to apps/frontend/src/app/(dashboard)/thread/[threadId]/page.tsx diff --git a/frontend/src/app/(dashboard)/triggers/page.tsx b/apps/frontend/src/app/(dashboard)/triggers/page.tsx similarity index 100% rename from frontend/src/app/(dashboard)/triggers/page.tsx rename to apps/frontend/src/app/(dashboard)/triggers/page.tsx diff --git a/frontend/src/app/(home)/berlin/page.tsx b/apps/frontend/src/app/(home)/berlin/page.tsx similarity index 99% rename from frontend/src/app/(home)/berlin/page.tsx rename to apps/frontend/src/app/(home)/berlin/page.tsx index 74151dbc7d..6e405b2aeb 100644 --- a/frontend/src/app/(home)/berlin/page.tsx +++ b/apps/frontend/src/app/(home)/berlin/page.tsx @@ -95,7 +95,6 @@ export default function BerlinPage() { files: pendingFiles, modelName: options?.model_name, agentId: selectedAgentId || undefined, - memoryEnabled: true, }); if (!result) { diff --git a/frontend/src/app/(home)/enterprise/page.tsx b/apps/frontend/src/app/(home)/enterprise/page.tsx similarity index 100% rename from frontend/src/app/(home)/enterprise/page.tsx rename to apps/frontend/src/app/(home)/enterprise/page.tsx diff --git a/frontend/src/app/(home)/layout.tsx b/apps/frontend/src/app/(home)/layout.tsx similarity index 100% rename from frontend/src/app/(home)/layout.tsx rename to apps/frontend/src/app/(home)/layout.tsx diff --git a/frontend/src/app/(home)/milano/page.tsx b/apps/frontend/src/app/(home)/milano/page.tsx similarity index 99% rename from frontend/src/app/(home)/milano/page.tsx rename to apps/frontend/src/app/(home)/milano/page.tsx index 9e0e91f7b3..4956926b54 100644 --- a/frontend/src/app/(home)/milano/page.tsx +++ b/apps/frontend/src/app/(home)/milano/page.tsx @@ -95,7 +95,6 @@ export default function MilanoPage() { files: pendingFiles, modelName: options?.model_name, agentId: selectedAgentId || undefined, - memoryEnabled: true, }); if (!result) { diff --git a/frontend/src/app/(home)/page.tsx b/apps/frontend/src/app/(home)/page.tsx similarity index 100% rename from frontend/src/app/(home)/page.tsx rename to apps/frontend/src/app/(home)/page.tsx diff --git a/frontend/src/app/(home)/status/page.tsx b/apps/frontend/src/app/(home)/status/page.tsx similarity index 100% rename from frontend/src/app/(home)/status/page.tsx rename to apps/frontend/src/app/(home)/status/page.tsx diff --git a/frontend/src/app/(home)/support/page.tsx b/apps/frontend/src/app/(home)/support/page.tsx similarity index 100% rename from frontend/src/app/(home)/support/page.tsx rename to apps/frontend/src/app/(home)/support/page.tsx diff --git a/frontend/src/app/activate-trial/page.tsx b/apps/frontend/src/app/activate-trial/page.tsx similarity index 100% rename from frontend/src/app/activate-trial/page.tsx rename to apps/frontend/src/app/activate-trial/page.tsx diff --git a/frontend/src/app/agents-101/layout.tsx b/apps/frontend/src/app/agents-101/layout.tsx similarity index 100% rename from frontend/src/app/agents-101/layout.tsx rename to apps/frontend/src/app/agents-101/layout.tsx diff --git a/frontend/src/app/agents-101/page.tsx b/apps/frontend/src/app/agents-101/page.tsx similarity index 100% rename from frontend/src/app/agents-101/page.tsx rename to apps/frontend/src/app/agents-101/page.tsx diff --git a/frontend/src/app/api/edge-flags/route.ts b/apps/frontend/src/app/api/edge-flags/route.ts similarity index 100% rename from frontend/src/app/api/edge-flags/route.ts rename to apps/frontend/src/app/api/edge-flags/route.ts diff --git a/frontend/src/app/api/integrations/[provider]/callback/route.ts b/apps/frontend/src/app/api/integrations/[provider]/callback/route.ts similarity index 100% rename from frontend/src/app/api/integrations/[provider]/callback/route.ts rename to apps/frontend/src/app/api/integrations/[provider]/callback/route.ts diff --git a/frontend/src/app/api/og/template/route.tsx b/apps/frontend/src/app/api/og/template/route.tsx similarity index 100% rename from frontend/src/app/api/og/template/route.tsx rename to apps/frontend/src/app/api/og/template/route.tsx diff --git a/frontend/src/app/api/share-page/og-image/route.tsx b/apps/frontend/src/app/api/share-page/og-image/route.tsx similarity index 100% rename from frontend/src/app/api/share-page/og-image/route.tsx rename to apps/frontend/src/app/api/share-page/og-image/route.tsx diff --git a/frontend/src/app/api/triggers/[triggerId]/webhook/route.ts b/apps/frontend/src/app/api/triggers/[triggerId]/webhook/route.ts similarity index 100% rename from frontend/src/app/api/triggers/[triggerId]/webhook/route.ts rename to apps/frontend/src/app/api/triggers/[triggerId]/webhook/route.ts diff --git a/frontend/src/app/auth/actions.ts b/apps/frontend/src/app/auth/actions.ts similarity index 100% rename from frontend/src/app/auth/actions.ts rename to apps/frontend/src/app/auth/actions.ts diff --git a/frontend/src/app/auth/callback/route.ts b/apps/frontend/src/app/auth/callback/route.ts similarity index 100% rename from frontend/src/app/auth/callback/route.ts rename to apps/frontend/src/app/auth/callback/route.ts diff --git a/frontend/src/app/auth/github-popup/page.tsx b/apps/frontend/src/app/auth/github-popup/page.tsx similarity index 100% rename from frontend/src/app/auth/github-popup/page.tsx rename to apps/frontend/src/app/auth/github-popup/page.tsx diff --git a/frontend/src/app/auth/page.tsx b/apps/frontend/src/app/auth/page.tsx similarity index 100% rename from frontend/src/app/auth/page.tsx rename to apps/frontend/src/app/auth/page.tsx diff --git a/frontend/src/app/auth/password/page.tsx b/apps/frontend/src/app/auth/password/page.tsx similarity index 100% rename from frontend/src/app/auth/password/page.tsx rename to apps/frontend/src/app/auth/password/page.tsx diff --git a/frontend/src/app/auth/phone-verification/page.tsx b/apps/frontend/src/app/auth/phone-verification/page.tsx similarity index 100% rename from frontend/src/app/auth/phone-verification/page.tsx rename to apps/frontend/src/app/auth/phone-verification/page.tsx diff --git a/frontend/src/app/auth/reset-password/page.tsx b/apps/frontend/src/app/auth/reset-password/page.tsx similarity index 100% rename from frontend/src/app/auth/reset-password/page.tsx rename to apps/frontend/src/app/auth/reset-password/page.tsx diff --git a/frontend/src/app/checkout/page.tsx b/apps/frontend/src/app/checkout/page.tsx similarity index 100% rename from frontend/src/app/checkout/page.tsx rename to apps/frontend/src/app/checkout/page.tsx diff --git a/frontend/src/app/favicon.ico b/apps/frontend/src/app/favicon.ico similarity index 100% rename from frontend/src/app/favicon.ico rename to apps/frontend/src/app/favicon.ico diff --git a/frontend/src/app/fonts/roobert-mono.ts b/apps/frontend/src/app/fonts/roobert-mono.ts similarity index 100% rename from frontend/src/app/fonts/roobert-mono.ts rename to apps/frontend/src/app/fonts/roobert-mono.ts diff --git a/frontend/src/app/fonts/roobert.ts b/apps/frontend/src/app/fonts/roobert.ts similarity index 100% rename from frontend/src/app/fonts/roobert.ts rename to apps/frontend/src/app/fonts/roobert.ts diff --git a/frontend/src/app/global-error.tsx b/apps/frontend/src/app/global-error.tsx similarity index 100% rename from frontend/src/app/global-error.tsx rename to apps/frontend/src/app/global-error.tsx diff --git a/frontend/src/app/globals.css b/apps/frontend/src/app/globals.css similarity index 99% rename from frontend/src/app/globals.css rename to apps/frontend/src/app/globals.css index 46f91bb158..9c85c910a3 100644 --- a/frontend/src/app/globals.css +++ b/apps/frontend/src/app/globals.css @@ -325,6 +325,7 @@ html { scroll-behavior: smooth; zoom: 100%; + font-size: 105%; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; diff --git a/frontend/src/app/help/credits/page.tsx b/apps/frontend/src/app/help/credits/page.tsx similarity index 100% rename from frontend/src/app/help/credits/page.tsx rename to apps/frontend/src/app/help/credits/page.tsx diff --git a/frontend/src/app/help/layout.tsx b/apps/frontend/src/app/help/layout.tsx similarity index 100% rename from frontend/src/app/help/layout.tsx rename to apps/frontend/src/app/help/layout.tsx diff --git a/frontend/src/app/help/page.tsx b/apps/frontend/src/app/help/page.tsx similarity index 100% rename from frontend/src/app/help/page.tsx rename to apps/frontend/src/app/help/page.tsx diff --git a/frontend/src/app/layout.tsx b/apps/frontend/src/app/layout.tsx similarity index 100% rename from frontend/src/app/layout.tsx rename to apps/frontend/src/app/layout.tsx diff --git a/frontend/src/app/legal/page.tsx b/apps/frontend/src/app/legal/page.tsx similarity index 100% rename from frontend/src/app/legal/page.tsx rename to apps/frontend/src/app/legal/page.tsx diff --git a/frontend/src/app/monitoring/route.ts b/apps/frontend/src/app/monitoring/route.ts similarity index 100% rename from frontend/src/app/monitoring/route.ts rename to apps/frontend/src/app/monitoring/route.ts diff --git a/frontend/src/app/not-found.tsx b/apps/frontend/src/app/not-found.tsx similarity index 100% rename from frontend/src/app/not-found.tsx rename to apps/frontend/src/app/not-found.tsx diff --git a/frontend/src/app/react-query-provider.tsx b/apps/frontend/src/app/react-query-provider.tsx similarity index 100% rename from frontend/src/app/react-query-provider.tsx rename to apps/frontend/src/app/react-query-provider.tsx diff --git a/frontend/src/app/setting-up/page.tsx b/apps/frontend/src/app/setting-up/page.tsx similarity index 100% rename from frontend/src/app/setting-up/page.tsx rename to apps/frontend/src/app/setting-up/page.tsx diff --git a/frontend/src/app/share/[threadId]/_components/SharePageWrapper.tsx b/apps/frontend/src/app/share/[threadId]/_components/SharePageWrapper.tsx similarity index 100% rename from frontend/src/app/share/[threadId]/_components/SharePageWrapper.tsx rename to apps/frontend/src/app/share/[threadId]/_components/SharePageWrapper.tsx diff --git a/frontend/src/app/share/[threadId]/layout.tsx b/apps/frontend/src/app/share/[threadId]/layout.tsx similarity index 100% rename from frontend/src/app/share/[threadId]/layout.tsx rename to apps/frontend/src/app/share/[threadId]/layout.tsx diff --git a/frontend/src/app/share/[threadId]/page.tsx b/apps/frontend/src/app/share/[threadId]/page.tsx similarity index 100% rename from frontend/src/app/share/[threadId]/page.tsx rename to apps/frontend/src/app/share/[threadId]/page.tsx diff --git a/frontend/src/app/sitemap.ts b/apps/frontend/src/app/sitemap.ts similarity index 100% rename from frontend/src/app/sitemap.ts rename to apps/frontend/src/app/sitemap.ts diff --git a/frontend/src/app/subscription/page.tsx b/apps/frontend/src/app/subscription/page.tsx similarity index 100% rename from frontend/src/app/subscription/page.tsx rename to apps/frontend/src/app/subscription/page.tsx diff --git a/frontend/src/app/suna/page.tsx b/apps/frontend/src/app/suna/page.tsx similarity index 100% rename from frontend/src/app/suna/page.tsx rename to apps/frontend/src/app/suna/page.tsx diff --git a/frontend/src/app/templates/[shareId]/layout.tsx b/apps/frontend/src/app/templates/[shareId]/layout.tsx similarity index 100% rename from frontend/src/app/templates/[shareId]/layout.tsx rename to apps/frontend/src/app/templates/[shareId]/layout.tsx diff --git a/frontend/src/app/templates/[shareId]/page.tsx b/apps/frontend/src/app/templates/[shareId]/page.tsx similarity index 100% rename from frontend/src/app/templates/[shareId]/page.tsx rename to apps/frontend/src/app/templates/[shareId]/page.tsx diff --git a/frontend/src/assets/animations/loading-black.json b/apps/frontend/src/assets/animations/loading-black.json similarity index 100% rename from frontend/src/assets/animations/loading-black.json rename to apps/frontend/src/assets/animations/loading-black.json diff --git a/frontend/src/assets/animations/loading-white.json b/apps/frontend/src/assets/animations/loading-white.json similarity index 100% rename from frontend/src/assets/animations/loading-white.json rename to apps/frontend/src/assets/animations/loading-white.json diff --git a/frontend/src/components/AuthProvider.tsx b/apps/frontend/src/components/AuthProvider.tsx similarity index 100% rename from frontend/src/components/AuthProvider.tsx rename to apps/frontend/src/components/AuthProvider.tsx diff --git a/frontend/src/components/GithubSignIn.tsx b/apps/frontend/src/components/GithubSignIn.tsx similarity index 100% rename from frontend/src/components/GithubSignIn.tsx rename to apps/frontend/src/components/GithubSignIn.tsx diff --git a/frontend/src/components/GoogleSignIn.tsx b/apps/frontend/src/components/GoogleSignIn.tsx similarity index 100% rename from frontend/src/components/GoogleSignIn.tsx rename to apps/frontend/src/components/GoogleSignIn.tsx diff --git a/frontend/src/components/admin/admin-feedback-table.tsx b/apps/frontend/src/components/admin/admin-feedback-table.tsx similarity index 100% rename from frontend/src/components/admin/admin-feedback-table.tsx rename to apps/frontend/src/components/admin/admin-feedback-table.tsx diff --git a/frontend/src/components/admin/admin-user-details-dialog.tsx b/apps/frontend/src/components/admin/admin-user-details-dialog.tsx similarity index 100% rename from frontend/src/components/admin/admin-user-details-dialog.tsx rename to apps/frontend/src/components/admin/admin-user-details-dialog.tsx diff --git a/frontend/src/components/admin/admin-user-table.tsx b/apps/frontend/src/components/admin/admin-user-table.tsx similarity index 100% rename from frontend/src/components/admin/admin-user-table.tsx rename to apps/frontend/src/components/admin/admin-user-table.tsx diff --git a/frontend/src/components/agents/AgentVersionManager.tsx b/apps/frontend/src/components/agents/AgentVersionManager.tsx similarity index 100% rename from frontend/src/components/agents/AgentVersionManager.tsx rename to apps/frontend/src/components/agents/AgentVersionManager.tsx diff --git a/frontend/src/components/agents/agent-configuration-dialog.tsx b/apps/frontend/src/components/agents/agent-configuration-dialog.tsx similarity index 100% rename from frontend/src/components/agents/agent-configuration-dialog.tsx rename to apps/frontend/src/components/agents/agent-configuration-dialog.tsx diff --git a/frontend/src/components/agents/agent-count-limit-dialog.tsx b/apps/frontend/src/components/agents/agent-count-limit-dialog.tsx similarity index 100% rename from frontend/src/components/agents/agent-count-limit-dialog.tsx rename to apps/frontend/src/components/agents/agent-count-limit-dialog.tsx diff --git a/frontend/src/components/agents/agent-creation-modal.tsx b/apps/frontend/src/components/agents/agent-creation-modal.tsx similarity index 100% rename from frontend/src/components/agents/agent-creation-modal.tsx rename to apps/frontend/src/components/agents/agent-creation-modal.tsx diff --git a/frontend/src/components/agents/agent-mcp-configuration.tsx b/apps/frontend/src/components/agents/agent-mcp-configuration.tsx similarity index 100% rename from frontend/src/components/agents/agent-mcp-configuration.tsx rename to apps/frontend/src/components/agents/agent-mcp-configuration.tsx diff --git a/frontend/src/components/agents/agent-selector.tsx b/apps/frontend/src/components/agents/agent-selector.tsx similarity index 100% rename from frontend/src/components/agents/agent-selector.tsx rename to apps/frontend/src/components/agents/agent-selector.tsx diff --git a/frontend/src/components/agents/agent-version-switcher.tsx b/apps/frontend/src/components/agents/agent-version-switcher.tsx similarity index 100% rename from frontend/src/components/agents/agent-version-switcher.tsx rename to apps/frontend/src/components/agents/agent-version-switcher.tsx diff --git a/frontend/src/components/agents/agents-grid.tsx b/apps/frontend/src/components/agents/agents-grid.tsx similarity index 100% rename from frontend/src/components/agents/agents-grid.tsx rename to apps/frontend/src/components/agents/agents-grid.tsx diff --git a/frontend/src/components/agents/composio/composio-app-card.tsx b/apps/frontend/src/components/agents/composio/composio-app-card.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-app-card.tsx rename to apps/frontend/src/components/agents/composio/composio-app-card.tsx diff --git a/frontend/src/components/agents/composio/composio-connections-section.tsx b/apps/frontend/src/components/agents/composio/composio-connections-section.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-connections-section.tsx rename to apps/frontend/src/components/agents/composio/composio-connections-section.tsx diff --git a/frontend/src/components/agents/composio/composio-connector.tsx b/apps/frontend/src/components/agents/composio/composio-connector.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-connector.tsx rename to apps/frontend/src/components/agents/composio/composio-connector.tsx diff --git a/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx b/apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-credential-profile-selector.tsx rename to apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx diff --git a/frontend/src/components/agents/composio/composio-profile-selector.tsx b/apps/frontend/src/components/agents/composio/composio-profile-selector.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-profile-selector.tsx rename to apps/frontend/src/components/agents/composio/composio-profile-selector.tsx diff --git a/frontend/src/components/agents/composio/composio-registry.tsx b/apps/frontend/src/components/agents/composio/composio-registry.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-registry.tsx rename to apps/frontend/src/components/agents/composio/composio-registry.tsx diff --git a/frontend/src/components/agents/composio/composio-tools-manager.tsx b/apps/frontend/src/components/agents/composio/composio-tools-manager.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-tools-manager.tsx rename to apps/frontend/src/components/agents/composio/composio-tools-manager.tsx diff --git a/frontend/src/components/agents/composio/composio-tools-selector.tsx b/apps/frontend/src/components/agents/composio/composio-tools-selector.tsx similarity index 100% rename from frontend/src/components/agents/composio/composio-tools-selector.tsx rename to apps/frontend/src/components/agents/composio/composio-tools-selector.tsx diff --git a/frontend/src/components/agents/config/agent-editor-dialog.tsx b/apps/frontend/src/components/agents/config/agent-editor-dialog.tsx similarity index 100% rename from frontend/src/components/agents/config/agent-editor-dialog.tsx rename to apps/frontend/src/components/agents/config/agent-editor-dialog.tsx diff --git a/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx b/apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx similarity index 100% rename from frontend/src/components/agents/config/agent-icon-editor-dialog.tsx rename to apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx diff --git a/frontend/src/components/agents/config/icon-picker.tsx b/apps/frontend/src/components/agents/config/icon-picker.tsx similarity index 100% rename from frontend/src/components/agents/config/icon-picker.tsx rename to apps/frontend/src/components/agents/config/icon-picker.tsx diff --git a/frontend/src/components/agents/config/index.ts b/apps/frontend/src/components/agents/config/index.ts similarity index 100% rename from frontend/src/components/agents/config/index.ts rename to apps/frontend/src/components/agents/config/index.ts diff --git a/frontend/src/components/agents/config/model-selector.tsx b/apps/frontend/src/components/agents/config/model-selector.tsx similarity index 100% rename from frontend/src/components/agents/config/model-selector.tsx rename to apps/frontend/src/components/agents/config/model-selector.tsx diff --git a/frontend/src/components/agents/config/version-alert.tsx b/apps/frontend/src/components/agents/config/version-alert.tsx similarity index 100% rename from frontend/src/components/agents/config/version-alert.tsx rename to apps/frontend/src/components/agents/config/version-alert.tsx diff --git a/frontend/src/components/agents/create-version-button.tsx b/apps/frontend/src/components/agents/create-version-button.tsx similarity index 100% rename from frontend/src/components/agents/create-version-button.tsx rename to apps/frontend/src/components/agents/create-version-button.tsx diff --git a/frontend/src/components/agents/custom-agents-page/header.tsx b/apps/frontend/src/components/agents/custom-agents-page/header.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/header.tsx rename to apps/frontend/src/components/agents/custom-agents-page/header.tsx diff --git a/frontend/src/components/agents/custom-agents-page/index.ts b/apps/frontend/src/components/agents/custom-agents-page/index.ts similarity index 100% rename from frontend/src/components/agents/custom-agents-page/index.ts rename to apps/frontend/src/components/agents/custom-agents-page/index.ts diff --git a/frontend/src/components/agents/custom-agents-page/loading-skeleton.tsx b/apps/frontend/src/components/agents/custom-agents-page/loading-skeleton.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/loading-skeleton.tsx rename to apps/frontend/src/components/agents/custom-agents-page/loading-skeleton.tsx diff --git a/frontend/src/components/agents/custom-agents-page/marketplace-section-header.tsx b/apps/frontend/src/components/agents/custom-agents-page/marketplace-section-header.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/marketplace-section-header.tsx rename to apps/frontend/src/components/agents/custom-agents-page/marketplace-section-header.tsx diff --git a/frontend/src/components/agents/custom-agents-page/marketplace-tab.tsx b/apps/frontend/src/components/agents/custom-agents-page/marketplace-tab.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/marketplace-tab.tsx rename to apps/frontend/src/components/agents/custom-agents-page/marketplace-tab.tsx diff --git a/frontend/src/components/agents/custom-agents-page/my-agents-tab.tsx b/apps/frontend/src/components/agents/custom-agents-page/my-agents-tab.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/my-agents-tab.tsx rename to apps/frontend/src/components/agents/custom-agents-page/my-agents-tab.tsx diff --git a/frontend/src/components/agents/custom-agents-page/my-templates-tab.tsx b/apps/frontend/src/components/agents/custom-agents-page/my-templates-tab.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/my-templates-tab.tsx rename to apps/frontend/src/components/agents/custom-agents-page/my-templates-tab.tsx diff --git a/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx b/apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/publish-dialog.tsx rename to apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx diff --git a/frontend/src/components/agents/custom-agents-page/search-bar.tsx b/apps/frontend/src/components/agents/custom-agents-page/search-bar.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/search-bar.tsx rename to apps/frontend/src/components/agents/custom-agents-page/search-bar.tsx diff --git a/frontend/src/components/agents/custom-agents-page/tabs-navigation.tsx b/apps/frontend/src/components/agents/custom-agents-page/tabs-navigation.tsx similarity index 100% rename from frontend/src/components/agents/custom-agents-page/tabs-navigation.tsx rename to apps/frontend/src/components/agents/custom-agents-page/tabs-navigation.tsx diff --git a/frontend/src/components/agents/docs-agent/advanced-toolbar.tsx b/apps/frontend/src/components/agents/docs-agent/advanced-toolbar.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/advanced-toolbar.tsx rename to apps/frontend/src/components/agents/docs-agent/advanced-toolbar.tsx diff --git a/frontend/src/components/agents/docs-agent/custom-highlight.ts b/apps/frontend/src/components/agents/docs-agent/custom-highlight.ts similarity index 100% rename from frontend/src/components/agents/docs-agent/custom-highlight.ts rename to apps/frontend/src/components/agents/docs-agent/custom-highlight.ts diff --git a/frontend/src/components/agents/docs-agent/editor.tsx b/apps/frontend/src/components/agents/docs-agent/editor.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor.tsx rename to apps/frontend/src/components/agents/docs-agent/editor.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/color-picker.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/color-picker.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/color-picker.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/color-picker.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/font-selector.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/font-selector.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/font-selector.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/font-selector.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/highlight-picker.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/highlight-picker.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/highlight-picker.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/highlight-picker.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/image-dialog.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/image-dialog.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/image-dialog.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/image-dialog.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/link-dialog.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/link-dialog.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/link-dialog.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/link-dialog.tsx diff --git a/frontend/src/components/agents/docs-agent/editor/controls/table-dropdown.tsx b/apps/frontend/src/components/agents/docs-agent/editor/controls/table-dropdown.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/editor/controls/table-dropdown.tsx rename to apps/frontend/src/components/agents/docs-agent/editor/controls/table-dropdown.tsx diff --git a/frontend/src/components/agents/docs-agent/extensions/page-break.ts b/apps/frontend/src/components/agents/docs-agent/extensions/page-break.ts similarity index 100% rename from frontend/src/components/agents/docs-agent/extensions/page-break.ts rename to apps/frontend/src/components/agents/docs-agent/extensions/page-break.ts diff --git a/frontend/src/components/agents/docs-agent/ruler.tsx b/apps/frontend/src/components/agents/docs-agent/ruler.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/ruler.tsx rename to apps/frontend/src/components/agents/docs-agent/ruler.tsx diff --git a/frontend/src/components/agents/docs-agent/simple-toolbar.tsx b/apps/frontend/src/components/agents/docs-agent/simple-toolbar.tsx similarity index 100% rename from frontend/src/components/agents/docs-agent/simple-toolbar.tsx rename to apps/frontend/src/components/agents/docs-agent/simple-toolbar.tsx diff --git a/frontend/src/components/agents/empty-state.tsx b/apps/frontend/src/components/agents/empty-state.tsx similarity index 100% rename from frontend/src/components/agents/empty-state.tsx rename to apps/frontend/src/components/agents/empty-state.tsx diff --git a/frontend/src/components/agents/installation/custom-server-step.tsx b/apps/frontend/src/components/agents/installation/custom-server-step.tsx similarity index 100% rename from frontend/src/components/agents/installation/custom-server-step.tsx rename to apps/frontend/src/components/agents/installation/custom-server-step.tsx diff --git a/frontend/src/components/agents/installation/streamlined-install-dialog.tsx b/apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx similarity index 100% rename from frontend/src/components/agents/installation/streamlined-install-dialog.tsx rename to apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx diff --git a/frontend/src/components/agents/installation/streamlined-profile-connector.tsx b/apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx similarity index 100% rename from frontend/src/components/agents/installation/streamlined-profile-connector.tsx rename to apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx diff --git a/frontend/src/components/agents/installation/trigger-config-step.tsx b/apps/frontend/src/components/agents/installation/trigger-config-step.tsx similarity index 100% rename from frontend/src/components/agents/installation/trigger-config-step.tsx rename to apps/frontend/src/components/agents/installation/trigger-config-step.tsx diff --git a/frontend/src/components/agents/installation/trigger-variables-step.tsx b/apps/frontend/src/components/agents/installation/trigger-variables-step.tsx similarity index 100% rename from frontend/src/components/agents/installation/trigger-variables-step.tsx rename to apps/frontend/src/components/agents/installation/trigger-variables-step.tsx diff --git a/frontend/src/components/agents/installation/types.ts b/apps/frontend/src/components/agents/installation/types.ts similarity index 100% rename from frontend/src/components/agents/installation/types.ts rename to apps/frontend/src/components/agents/installation/types.ts diff --git a/frontend/src/components/agents/integrations-registry.tsx b/apps/frontend/src/components/agents/integrations-registry.tsx similarity index 100% rename from frontend/src/components/agents/integrations-registry.tsx rename to apps/frontend/src/components/agents/integrations-registry.tsx diff --git a/frontend/src/components/agents/json-import-dialog.tsx b/apps/frontend/src/components/agents/json-import-dialog.tsx similarity index 100% rename from frontend/src/components/agents/json-import-dialog.tsx rename to apps/frontend/src/components/agents/json-import-dialog.tsx diff --git a/frontend/src/components/agents/knowledge-base/agent-kb-tree.tsx b/apps/frontend/src/components/agents/knowledge-base/agent-kb-tree.tsx similarity index 100% rename from frontend/src/components/agents/knowledge-base/agent-kb-tree.tsx rename to apps/frontend/src/components/agents/knowledge-base/agent-kb-tree.tsx diff --git a/frontend/src/components/agents/loading-state.tsx b/apps/frontend/src/components/agents/loading-state.tsx similarity index 100% rename from frontend/src/components/agents/loading-state.tsx rename to apps/frontend/src/components/agents/loading-state.tsx diff --git a/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx b/apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx similarity index 100% rename from frontend/src/components/agents/marketplace-agent-preview-dialog.tsx rename to apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx diff --git a/frontend/src/components/agents/mcp/configured-mcp-list.tsx b/apps/frontend/src/components/agents/mcp/configured-mcp-list.tsx similarity index 100% rename from frontend/src/components/agents/mcp/configured-mcp-list.tsx rename to apps/frontend/src/components/agents/mcp/configured-mcp-list.tsx diff --git a/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx b/apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx similarity index 100% rename from frontend/src/components/agents/mcp/custom-mcp-dialog.tsx rename to apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx diff --git a/frontend/src/components/agents/mcp/mcp-configuration-new.tsx b/apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx similarity index 100% rename from frontend/src/components/agents/mcp/mcp-configuration-new.tsx rename to apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx diff --git a/frontend/src/components/agents/mcp/mcp-server-card.tsx b/apps/frontend/src/components/agents/mcp/mcp-server-card.tsx similarity index 100% rename from frontend/src/components/agents/mcp/mcp-server-card.tsx rename to apps/frontend/src/components/agents/mcp/mcp-server-card.tsx diff --git a/frontend/src/components/agents/mcp/tools-loader.tsx b/apps/frontend/src/components/agents/mcp/tools-loader.tsx similarity index 100% rename from frontend/src/components/agents/mcp/tools-loader.tsx rename to apps/frontend/src/components/agents/mcp/tools-loader.tsx diff --git a/frontend/src/components/agents/mcp/tools-manager.tsx b/apps/frontend/src/components/agents/mcp/tools-manager.tsx similarity index 100% rename from frontend/src/components/agents/mcp/tools-manager.tsx rename to apps/frontend/src/components/agents/mcp/tools-manager.tsx diff --git a/frontend/src/components/agents/mcp/types.ts b/apps/frontend/src/components/agents/mcp/types.ts similarity index 100% rename from frontend/src/components/agents/mcp/types.ts rename to apps/frontend/src/components/agents/mcp/types.ts diff --git a/frontend/src/components/agents/new-agent-dialog.tsx b/apps/frontend/src/components/agents/new-agent-dialog.tsx similarity index 100% rename from frontend/src/components/agents/new-agent-dialog.tsx rename to apps/frontend/src/components/agents/new-agent-dialog.tsx diff --git a/frontend/src/components/agents/pagination.tsx b/apps/frontend/src/components/agents/pagination.tsx similarity index 100% rename from frontend/src/components/agents/pagination.tsx rename to apps/frontend/src/components/agents/pagination.tsx diff --git a/frontend/src/components/agents/results-info.tsx b/apps/frontend/src/components/agents/results-info.tsx similarity index 100% rename from frontend/src/components/agents/results-info.tsx rename to apps/frontend/src/components/agents/results-info.tsx diff --git a/frontend/src/components/agents/tools/granular-tool-configuration.tsx b/apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx similarity index 100% rename from frontend/src/components/agents/tools/granular-tool-configuration.tsx rename to apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx diff --git a/frontend/src/components/agents/tools/tool-groups.ts b/apps/frontend/src/components/agents/tools/tool-groups.ts similarity index 100% rename from frontend/src/components/agents/tools/tool-groups.ts rename to apps/frontend/src/components/agents/tools/tool-groups.ts diff --git a/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx b/apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx similarity index 100% rename from frontend/src/components/agents/triggers/agent-triggers-configuration.tsx rename to apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx diff --git a/frontend/src/components/agents/triggers/configured-triggers-list.tsx b/apps/frontend/src/components/agents/triggers/configured-triggers-list.tsx similarity index 100% rename from frontend/src/components/agents/triggers/configured-triggers-list.tsx rename to apps/frontend/src/components/agents/triggers/configured-triggers-list.tsx diff --git a/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx b/apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx similarity index 100% rename from frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx rename to apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx diff --git a/frontend/src/components/agents/triggers/one-click-integrations.tsx b/apps/frontend/src/components/agents/triggers/one-click-integrations.tsx similarity index 100% rename from frontend/src/components/agents/triggers/one-click-integrations.tsx rename to apps/frontend/src/components/agents/triggers/one-click-integrations.tsx diff --git a/frontend/src/components/agents/triggers/providers/event-config.tsx b/apps/frontend/src/components/agents/triggers/providers/event-config.tsx similarity index 100% rename from frontend/src/components/agents/triggers/providers/event-config.tsx rename to apps/frontend/src/components/agents/triggers/providers/event-config.tsx diff --git a/frontend/src/components/agents/triggers/providers/schedule-config.tsx b/apps/frontend/src/components/agents/triggers/providers/schedule-config.tsx similarity index 100% rename from frontend/src/components/agents/triggers/providers/schedule-config.tsx rename to apps/frontend/src/components/agents/triggers/providers/schedule-config.tsx diff --git a/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx b/apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx similarity index 100% rename from frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx rename to apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx diff --git a/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx b/apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx similarity index 100% rename from frontend/src/components/agents/triggers/trigger-browse-dialog.tsx rename to apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx diff --git a/frontend/src/components/agents/triggers/types.ts b/apps/frontend/src/components/agents/triggers/types.ts similarity index 100% rename from frontend/src/components/agents/triggers/types.ts rename to apps/frontend/src/components/agents/triggers/types.ts diff --git a/frontend/src/components/agents/triggers/utils.tsx b/apps/frontend/src/components/agents/triggers/utils.tsx similarity index 100% rename from frontend/src/components/agents/triggers/utils.tsx rename to apps/frontend/src/components/agents/triggers/utils.tsx diff --git a/frontend/src/components/agents/upcoming-runs-dropdown.tsx b/apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx similarity index 100% rename from frontend/src/components/agents/upcoming-runs-dropdown.tsx rename to apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx diff --git a/frontend/src/components/agents/version-inline-editor.tsx b/apps/frontend/src/components/agents/version-inline-editor.tsx similarity index 100% rename from frontend/src/components/agents/version-inline-editor.tsx rename to apps/frontend/src/components/agents/version-inline-editor.tsx diff --git a/frontend/src/components/analytics/auth-event-tracker.tsx b/apps/frontend/src/components/analytics/auth-event-tracker.tsx similarity index 100% rename from frontend/src/components/analytics/auth-event-tracker.tsx rename to apps/frontend/src/components/analytics/auth-event-tracker.tsx diff --git a/frontend/src/components/analytics/route-change-tracker.tsx b/apps/frontend/src/components/analytics/route-change-tracker.tsx similarity index 100% rename from frontend/src/components/analytics/route-change-tracker.tsx rename to apps/frontend/src/components/analytics/route-change-tracker.tsx diff --git a/frontend/src/components/announcements/announcement-dialog.tsx b/apps/frontend/src/components/announcements/announcement-dialog.tsx similarity index 100% rename from frontend/src/components/announcements/announcement-dialog.tsx rename to apps/frontend/src/components/announcements/announcement-dialog.tsx diff --git a/frontend/src/components/announcements/components/memories-announcement.tsx b/apps/frontend/src/components/announcements/components/memories-announcement.tsx similarity index 100% rename from frontend/src/components/announcements/components/memories-announcement.tsx rename to apps/frontend/src/components/announcements/components/memories-announcement.tsx diff --git a/frontend/src/components/announcements/index.ts b/apps/frontend/src/components/announcements/index.ts similarity index 100% rename from frontend/src/components/announcements/index.ts rename to apps/frontend/src/components/announcements/index.ts diff --git a/frontend/src/components/announcements/kortix-app-banners.tsx b/apps/frontend/src/components/announcements/kortix-app-banners.tsx similarity index 100% rename from frontend/src/components/announcements/kortix-app-banners.tsx rename to apps/frontend/src/components/announcements/kortix-app-banners.tsx diff --git a/frontend/src/components/announcements/mobile-app-interstitial.tsx b/apps/frontend/src/components/announcements/mobile-app-interstitial.tsx similarity index 100% rename from frontend/src/components/announcements/mobile-app-interstitial.tsx rename to apps/frontend/src/components/announcements/mobile-app-interstitial.tsx diff --git a/frontend/src/components/announcements/registry.ts b/apps/frontend/src/components/announcements/registry.ts similarity index 71% rename from frontend/src/components/announcements/registry.ts rename to apps/frontend/src/components/announcements/registry.ts index 5b10d98195..0708e9d6e6 100644 --- a/frontend/src/components/announcements/registry.ts +++ b/apps/frontend/src/components/announcements/registry.ts @@ -1,14 +1,11 @@ import { ComponentType } from 'react'; -import { MemoriesAnnouncement } from './components/memories-announcement'; export interface AnnouncementComponentProps { onClose: () => void; [key: string]: unknown; } -export const announcementRegistry: Record> = { - 'memories': MemoriesAnnouncement, -}; +export const announcementRegistry: Record> = {}; export function registerAnnouncement( name: string, diff --git a/frontend/src/components/announcements/technical-issue-banner.tsx b/apps/frontend/src/components/announcements/technical-issue-banner.tsx similarity index 100% rename from frontend/src/components/announcements/technical-issue-banner.tsx rename to apps/frontend/src/components/announcements/technical-issue-banner.tsx diff --git a/frontend/src/components/auth/background-aal-checker.tsx b/apps/frontend/src/components/auth/background-aal-checker.tsx similarity index 100% rename from frontend/src/components/auth/background-aal-checker.tsx rename to apps/frontend/src/components/auth/background-aal-checker.tsx diff --git a/frontend/src/components/auth/example-showcase.tsx b/apps/frontend/src/components/auth/example-showcase.tsx similarity index 100% rename from frontend/src/components/auth/example-showcase.tsx rename to apps/frontend/src/components/auth/example-showcase.tsx diff --git a/frontend/src/components/auth/phone-verification/otp-verification.tsx b/apps/frontend/src/components/auth/phone-verification/otp-verification.tsx similarity index 100% rename from frontend/src/components/auth/phone-verification/otp-verification.tsx rename to apps/frontend/src/components/auth/phone-verification/otp-verification.tsx diff --git a/frontend/src/components/auth/phone-verification/phone-input.tsx b/apps/frontend/src/components/auth/phone-verification/phone-input.tsx similarity index 100% rename from frontend/src/components/auth/phone-verification/phone-input.tsx rename to apps/frontend/src/components/auth/phone-verification/phone-input.tsx diff --git a/frontend/src/components/auth/phone-verification/phone-verification-page.tsx b/apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx similarity index 100% rename from frontend/src/components/auth/phone-verification/phone-verification-page.tsx rename to apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx diff --git a/frontend/src/components/auth/release-badge.tsx b/apps/frontend/src/components/auth/release-badge.tsx similarity index 100% rename from frontend/src/components/auth/release-badge.tsx rename to apps/frontend/src/components/auth/release-badge.tsx diff --git a/frontend/src/components/billing/credit-purchase.tsx b/apps/frontend/src/components/billing/credit-purchase.tsx similarity index 100% rename from frontend/src/components/billing/credit-purchase.tsx rename to apps/frontend/src/components/billing/credit-purchase.tsx diff --git a/frontend/src/components/billing/credit-transactions.tsx b/apps/frontend/src/components/billing/credit-transactions.tsx similarity index 100% rename from frontend/src/components/billing/credit-transactions.tsx rename to apps/frontend/src/components/billing/credit-transactions.tsx diff --git a/frontend/src/components/billing/credit-usage.tsx b/apps/frontend/src/components/billing/credit-usage.tsx similarity index 100% rename from frontend/src/components/billing/credit-usage.tsx rename to apps/frontend/src/components/billing/credit-usage.tsx diff --git a/frontend/src/components/billing/credits-display.tsx b/apps/frontend/src/components/billing/credits-display.tsx similarity index 100% rename from frontend/src/components/billing/credits-display.tsx rename to apps/frontend/src/components/billing/credits-display.tsx diff --git a/frontend/src/components/billing/downgrade-confirmation-dialog.tsx b/apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx similarity index 100% rename from frontend/src/components/billing/downgrade-confirmation-dialog.tsx rename to apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx diff --git a/frontend/src/components/billing/index.ts b/apps/frontend/src/components/billing/index.ts similarity index 100% rename from frontend/src/components/billing/index.ts rename to apps/frontend/src/components/billing/index.ts diff --git a/frontend/src/components/billing/plan-utils.ts b/apps/frontend/src/components/billing/plan-utils.ts similarity index 100% rename from frontend/src/components/billing/plan-utils.ts rename to apps/frontend/src/components/billing/plan-utils.ts diff --git a/frontend/src/components/billing/pricing/index.ts b/apps/frontend/src/components/billing/pricing/index.ts similarity index 100% rename from frontend/src/components/billing/pricing/index.ts rename to apps/frontend/src/components/billing/pricing/index.ts diff --git a/frontend/src/components/billing/pricing/plan-selection-modal.tsx b/apps/frontend/src/components/billing/pricing/plan-selection-modal.tsx similarity index 100% rename from frontend/src/components/billing/pricing/plan-selection-modal.tsx rename to apps/frontend/src/components/billing/pricing/plan-selection-modal.tsx diff --git a/frontend/src/components/billing/pricing/pricing-section.tsx b/apps/frontend/src/components/billing/pricing/pricing-section.tsx similarity index 100% rename from frontend/src/components/billing/pricing/pricing-section.tsx rename to apps/frontend/src/components/billing/pricing/pricing-section.tsx diff --git a/frontend/src/components/billing/scheduled-downgrade-card.tsx b/apps/frontend/src/components/billing/scheduled-downgrade-card.tsx similarity index 100% rename from frontend/src/components/billing/scheduled-downgrade-card.tsx rename to apps/frontend/src/components/billing/scheduled-downgrade-card.tsx diff --git a/frontend/src/components/billing/subscription-cancellation-card.tsx b/apps/frontend/src/components/billing/subscription-cancellation-card.tsx similarity index 100% rename from frontend/src/components/billing/subscription-cancellation-card.tsx rename to apps/frontend/src/components/billing/subscription-cancellation-card.tsx diff --git a/frontend/src/components/billing/thread-usage.tsx b/apps/frontend/src/components/billing/thread-usage.tsx similarity index 100% rename from frontend/src/components/billing/thread-usage.tsx rename to apps/frontend/src/components/billing/thread-usage.tsx diff --git a/frontend/src/components/billing/tier-badge.tsx b/apps/frontend/src/components/billing/tier-badge.tsx similarity index 100% rename from frontend/src/components/billing/tier-badge.tsx rename to apps/frontend/src/components/billing/tier-badge.tsx diff --git a/frontend/src/components/billing/upgrade-celebration.tsx b/apps/frontend/src/components/billing/upgrade-celebration.tsx similarity index 100% rename from frontend/src/components/billing/upgrade-celebration.tsx rename to apps/frontend/src/components/billing/upgrade-celebration.tsx diff --git a/frontend/src/components/cookie-consent.tsx b/apps/frontend/src/components/cookie-consent.tsx similarity index 100% rename from frontend/src/components/cookie-consent.tsx rename to apps/frontend/src/components/cookie-consent.tsx diff --git a/frontend/src/components/dashboard/ai-worker-templates.tsx b/apps/frontend/src/components/dashboard/ai-worker-templates.tsx similarity index 100% rename from frontend/src/components/dashboard/ai-worker-templates.tsx rename to apps/frontend/src/components/dashboard/ai-worker-templates.tsx diff --git a/frontend/src/components/dashboard/custom-agents-section.tsx b/apps/frontend/src/components/dashboard/custom-agents-section.tsx similarity index 100% rename from frontend/src/components/dashboard/custom-agents-section.tsx rename to apps/frontend/src/components/dashboard/custom-agents-section.tsx diff --git a/frontend/src/components/dashboard/dashboard-content.tsx b/apps/frontend/src/components/dashboard/dashboard-content.tsx similarity index 99% rename from frontend/src/components/dashboard/dashboard-content.tsx rename to apps/frontend/src/components/dashboard/dashboard-content.tsx index a522b2100e..98a3523858 100644 --- a/frontend/src/components/dashboard/dashboard-content.tsx +++ b/apps/frontend/src/components/dashboard/dashboard-content.tsx @@ -64,7 +64,6 @@ export function DashboardContent() { const [inputValue, setInputValue] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [showConfigDialog, setShowConfigDialog] = useState(false); - const [memoryEnabled, setMemoryEnabled] = useState(true); const [configAgentId, setConfigAgentId] = useState(null); const [isRedirecting, setIsRedirecting] = useState(false); const [autoSubmit, setAutoSubmit] = useState(false); @@ -325,7 +324,6 @@ export function DashboardContent() { fileIds: fileIds.length > 0 ? fileIds : undefined, modelName: options?.model_name, agentId: selectedAgentId || undefined, - memoryEnabled: true, }); if (!result) { @@ -484,8 +482,6 @@ export function DashboardContent() { selectedCharts={selectedCharts} selectedOutputFormat={selectedOutputFormat} selectedTemplate={selectedTemplate} - memoryEnabled={memoryEnabled} - onMemoryToggle={setMemoryEnabled} /> {alertType === 'daily_refresh' && ( diff --git a/frontend/src/components/dashboard/examples/index.tsx b/apps/frontend/src/components/dashboard/examples/index.tsx similarity index 100% rename from frontend/src/components/dashboard/examples/index.tsx rename to apps/frontend/src/components/dashboard/examples/index.tsx diff --git a/frontend/src/components/dashboard/layout-content.tsx b/apps/frontend/src/components/dashboard/layout-content.tsx similarity index 100% rename from frontend/src/components/dashboard/layout-content.tsx rename to apps/frontend/src/components/dashboard/layout-content.tsx diff --git a/frontend/src/components/dashboard/maintenance-banner.tsx b/apps/frontend/src/components/dashboard/maintenance-banner.tsx similarity index 100% rename from frontend/src/components/dashboard/maintenance-banner.tsx rename to apps/frontend/src/components/dashboard/maintenance-banner.tsx diff --git a/frontend/src/components/dashboard/maintenance-notice.tsx b/apps/frontend/src/components/dashboard/maintenance-notice.tsx similarity index 100% rename from frontend/src/components/dashboard/maintenance-notice.tsx rename to apps/frontend/src/components/dashboard/maintenance-notice.tsx diff --git a/frontend/src/components/dashboard/suna-modes-panel.tsx b/apps/frontend/src/components/dashboard/suna-modes-panel.tsx similarity index 100% rename from frontend/src/components/dashboard/suna-modes-panel.tsx rename to apps/frontend/src/components/dashboard/suna-modes-panel.tsx diff --git a/frontend/src/components/dashboard/trial-management.tsx b/apps/frontend/src/components/dashboard/trial-management.tsx similarity index 100% rename from frontend/src/components/dashboard/trial-management.tsx rename to apps/frontend/src/components/dashboard/trial-management.tsx diff --git a/frontend/src/components/dashboard/usage-limits-popover.tsx b/apps/frontend/src/components/dashboard/usage-limits-popover.tsx similarity index 100% rename from frontend/src/components/dashboard/usage-limits-popover.tsx rename to apps/frontend/src/components/dashboard/usage-limits-popover.tsx diff --git a/frontend/src/components/debug/presence-debug.tsx b/apps/frontend/src/components/debug/presence-debug.tsx similarity index 100% rename from frontend/src/components/debug/presence-debug.tsx rename to apps/frontend/src/components/debug/presence-debug.tsx diff --git a/frontend/src/components/env-manager/local-env-manager.tsx b/apps/frontend/src/components/env-manager/local-env-manager.tsx similarity index 100% rename from frontend/src/components/env-manager/local-env-manager.tsx rename to apps/frontend/src/components/env-manager/local-env-manager.tsx diff --git a/frontend/src/components/file-editors/code-editor.tsx b/apps/frontend/src/components/file-editors/code-editor.tsx similarity index 100% rename from frontend/src/components/file-editors/code-editor.tsx rename to apps/frontend/src/components/file-editors/code-editor.tsx diff --git a/frontend/src/components/file-editors/index.tsx b/apps/frontend/src/components/file-editors/index.tsx similarity index 100% rename from frontend/src/components/file-editors/index.tsx rename to apps/frontend/src/components/file-editors/index.tsx diff --git a/frontend/src/components/file-editors/markdown-editor.tsx b/apps/frontend/src/components/file-editors/markdown-editor.tsx similarity index 100% rename from frontend/src/components/file-editors/markdown-editor.tsx rename to apps/frontend/src/components/file-editors/markdown-editor.tsx diff --git a/frontend/src/components/file-editors/markdown-toolbar.tsx b/apps/frontend/src/components/file-editors/markdown-toolbar.tsx similarity index 100% rename from frontend/src/components/file-editors/markdown-toolbar.tsx rename to apps/frontend/src/components/file-editors/markdown-toolbar.tsx diff --git a/frontend/src/components/file-editors/utils.ts b/apps/frontend/src/components/file-editors/utils.ts similarity index 100% rename from frontend/src/components/file-editors/utils.ts rename to apps/frontend/src/components/file-editors/utils.ts diff --git a/frontend/src/components/file-layouts/FileCarousel.tsx b/apps/frontend/src/components/file-layouts/FileCarousel.tsx similarity index 100% rename from frontend/src/components/file-layouts/FileCarousel.tsx rename to apps/frontend/src/components/file-layouts/FileCarousel.tsx diff --git a/frontend/src/components/file-layouts/FileGrid.tsx b/apps/frontend/src/components/file-layouts/FileGrid.tsx similarity index 100% rename from frontend/src/components/file-layouts/FileGrid.tsx rename to apps/frontend/src/components/file-layouts/FileGrid.tsx diff --git a/frontend/src/components/file-previews/DocumentPreview.tsx b/apps/frontend/src/components/file-previews/DocumentPreview.tsx similarity index 100% rename from frontend/src/components/file-previews/DocumentPreview.tsx rename to apps/frontend/src/components/file-previews/DocumentPreview.tsx diff --git a/frontend/src/components/file-previews/FileCard.tsx b/apps/frontend/src/components/file-previews/FileCard.tsx similarity index 100% rename from frontend/src/components/file-previews/FileCard.tsx rename to apps/frontend/src/components/file-previews/FileCard.tsx diff --git a/frontend/src/components/file-previews/ImagePreview.tsx b/apps/frontend/src/components/file-previews/ImagePreview.tsx similarity index 100% rename from frontend/src/components/file-previews/ImagePreview.tsx rename to apps/frontend/src/components/file-previews/ImagePreview.tsx diff --git a/frontend/src/components/file-previews/PdfPreview.tsx b/apps/frontend/src/components/file-previews/PdfPreview.tsx similarity index 100% rename from frontend/src/components/file-previews/PdfPreview.tsx rename to apps/frontend/src/components/file-previews/PdfPreview.tsx diff --git a/frontend/src/components/file-previews/SpreadsheetPreview.tsx b/apps/frontend/src/components/file-previews/SpreadsheetPreview.tsx similarity index 100% rename from frontend/src/components/file-previews/SpreadsheetPreview.tsx rename to apps/frontend/src/components/file-previews/SpreadsheetPreview.tsx diff --git a/frontend/src/components/file-renderers/JsonRenderer.tsx b/apps/frontend/src/components/file-renderers/JsonRenderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/JsonRenderer.tsx rename to apps/frontend/src/components/file-renderers/JsonRenderer.tsx diff --git a/frontend/src/components/file-renderers/binary-renderer.tsx b/apps/frontend/src/components/file-renderers/binary-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/binary-renderer.tsx rename to apps/frontend/src/components/file-renderers/binary-renderer.tsx diff --git a/frontend/src/components/file-renderers/canvas-renderer.tsx b/apps/frontend/src/components/file-renderers/canvas-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/canvas-renderer.tsx rename to apps/frontend/src/components/file-renderers/canvas-renderer.tsx diff --git a/frontend/src/components/file-renderers/csv-renderer.tsx b/apps/frontend/src/components/file-renderers/csv-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/csv-renderer.tsx rename to apps/frontend/src/components/file-renderers/csv-renderer.tsx diff --git a/frontend/src/components/file-renderers/html-renderer.tsx b/apps/frontend/src/components/file-renderers/html-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/html-renderer.tsx rename to apps/frontend/src/components/file-renderers/html-renderer.tsx diff --git a/frontend/src/components/file-renderers/image-renderer.tsx b/apps/frontend/src/components/file-renderers/image-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/image-renderer.tsx rename to apps/frontend/src/components/file-renderers/image-renderer.tsx diff --git a/frontend/src/components/file-renderers/index.tsx b/apps/frontend/src/components/file-renderers/index.tsx similarity index 100% rename from frontend/src/components/file-renderers/index.tsx rename to apps/frontend/src/components/file-renderers/index.tsx diff --git a/frontend/src/components/file-renderers/pdf-renderer.tsx b/apps/frontend/src/components/file-renderers/pdf-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/pdf-renderer.tsx rename to apps/frontend/src/components/file-renderers/pdf-renderer.tsx diff --git a/frontend/src/components/file-renderers/pptx-renderer.tsx b/apps/frontend/src/components/file-renderers/pptx-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/pptx-renderer.tsx rename to apps/frontend/src/components/file-renderers/pptx-renderer.tsx diff --git a/frontend/src/components/file-renderers/video-renderer.tsx b/apps/frontend/src/components/file-renderers/video-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/video-renderer.tsx rename to apps/frontend/src/components/file-renderers/video-renderer.tsx diff --git a/frontend/src/components/file-renderers/xlsx-renderer.tsx b/apps/frontend/src/components/file-renderers/xlsx-renderer.tsx similarity index 100% rename from frontend/src/components/file-renderers/xlsx-renderer.tsx rename to apps/frontend/src/components/file-renderers/xlsx-renderer.tsx diff --git a/frontend/src/components/help/help-search-modal.tsx b/apps/frontend/src/components/help/help-search-modal.tsx similarity index 100% rename from frontend/src/components/help/help-search-modal.tsx rename to apps/frontend/src/components/help/help-search-modal.tsx diff --git a/frontend/src/components/help/help-sidebar.tsx b/apps/frontend/src/components/help/help-sidebar.tsx similarity index 100% rename from frontend/src/components/help/help-sidebar.tsx rename to apps/frontend/src/components/help/help-sidebar.tsx diff --git a/frontend/src/components/home/dashboard-promo-banner.tsx b/apps/frontend/src/components/home/dashboard-promo-banner.tsx similarity index 100% rename from frontend/src/components/home/dashboard-promo-banner.tsx rename to apps/frontend/src/components/home/dashboard-promo-banner.tsx diff --git a/frontend/src/components/home/footer-section.tsx b/apps/frontend/src/components/home/footer-section.tsx similarity index 100% rename from frontend/src/components/home/footer-section.tsx rename to apps/frontend/src/components/home/footer-section.tsx diff --git a/frontend/src/components/home/hero-section.tsx b/apps/frontend/src/components/home/hero-section.tsx similarity index 98% rename from frontend/src/components/home/hero-section.tsx rename to apps/frontend/src/components/home/hero-section.tsx index 8220c03093..2ec8b46a69 100644 --- a/frontend/src/components/home/hero-section.tsx +++ b/apps/frontend/src/components/home/hero-section.tsx @@ -67,7 +67,6 @@ export function HeroSection() { const isMobile = useIsMobile(); const [isSubmitting, setIsSubmitting] = useState(false); const [inputValue, setInputValue] = useState(''); - const [memoryEnabled, setMemoryEnabled] = useState(true); const { selectedAgentId, @@ -222,7 +221,6 @@ export function HeroSection() { files: pendingFiles, modelName: options?.model_name, agentId: selectedAgentId || undefined, - memoryEnabled: true, }); if (!result) { @@ -295,8 +293,6 @@ export function HeroSection() { selectedCharts={selectedCharts} selectedOutputFormat={selectedOutputFormat} selectedTemplate={selectedTemplate} - memoryEnabled={memoryEnabled} - onMemoryToggle={setMemoryEnabled} /> diff --git a/frontend/src/components/home/icons.tsx b/apps/frontend/src/components/home/icons.tsx similarity index 100% rename from frontend/src/components/home/icons.tsx rename to apps/frontend/src/components/home/icons.tsx diff --git a/frontend/src/components/home/locale-switcher.tsx b/apps/frontend/src/components/home/locale-switcher.tsx similarity index 100% rename from frontend/src/components/home/locale-switcher.tsx rename to apps/frontend/src/components/home/locale-switcher.tsx diff --git a/frontend/src/components/home/nav-menu.tsx b/apps/frontend/src/components/home/nav-menu.tsx similarity index 100% rename from frontend/src/components/home/nav-menu.tsx rename to apps/frontend/src/components/home/nav-menu.tsx diff --git a/frontend/src/components/home/navbar.tsx b/apps/frontend/src/components/home/navbar.tsx similarity index 100% rename from frontend/src/components/home/navbar.tsx rename to apps/frontend/src/components/home/navbar.tsx diff --git a/frontend/src/components/home/promo-banner.tsx b/apps/frontend/src/components/home/promo-banner.tsx similarity index 100% rename from frontend/src/components/home/promo-banner.tsx rename to apps/frontend/src/components/home/promo-banner.tsx diff --git a/frontend/src/components/home/showcase-section.tsx b/apps/frontend/src/components/home/showcase-section.tsx similarity index 100% rename from frontend/src/components/home/showcase-section.tsx rename to apps/frontend/src/components/home/showcase-section.tsx diff --git a/frontend/src/components/home/simple-footer.tsx b/apps/frontend/src/components/home/simple-footer.tsx similarity index 100% rename from frontend/src/components/home/simple-footer.tsx rename to apps/frontend/src/components/home/simple-footer.tsx diff --git a/frontend/src/components/home/theme-provider.tsx b/apps/frontend/src/components/home/theme-provider.tsx similarity index 100% rename from frontend/src/components/home/theme-provider.tsx rename to apps/frontend/src/components/home/theme-provider.tsx diff --git a/frontend/src/components/home/theme-toggle.tsx b/apps/frontend/src/components/home/theme-toggle.tsx similarity index 100% rename from frontend/src/components/home/theme-toggle.tsx rename to apps/frontend/src/components/home/theme-toggle.tsx diff --git a/frontend/src/components/home/wordmark-footer.tsx b/apps/frontend/src/components/home/wordmark-footer.tsx similarity index 100% rename from frontend/src/components/home/wordmark-footer.tsx rename to apps/frontend/src/components/home/wordmark-footer.tsx diff --git a/frontend/src/components/i18n-provider.tsx b/apps/frontend/src/components/i18n-provider.tsx similarity index 100% rename from frontend/src/components/i18n-provider.tsx rename to apps/frontend/src/components/i18n-provider.tsx diff --git a/frontend/src/components/knowledge-base/edit-summary-modal.tsx b/apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx similarity index 100% rename from frontend/src/components/knowledge-base/edit-summary-modal.tsx rename to apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx diff --git a/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx b/apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx similarity index 100% rename from frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx rename to apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx diff --git a/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx b/apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx similarity index 100% rename from frontend/src/components/knowledge-base/kb-file-preview-modal.tsx rename to apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx diff --git a/frontend/src/components/knowledge-base/knowledge-base-header.tsx b/apps/frontend/src/components/knowledge-base/knowledge-base-header.tsx similarity index 100% rename from frontend/src/components/knowledge-base/knowledge-base-header.tsx rename to apps/frontend/src/components/knowledge-base/knowledge-base-header.tsx diff --git a/frontend/src/components/knowledge-base/knowledge-base-manager.tsx b/apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx similarity index 100% rename from frontend/src/components/knowledge-base/knowledge-base-manager.tsx rename to apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx diff --git a/frontend/src/components/knowledge-base/knowledge-base-page.tsx b/apps/frontend/src/components/knowledge-base/knowledge-base-page.tsx similarity index 100% rename from frontend/src/components/knowledge-base/knowledge-base-page.tsx rename to apps/frontend/src/components/knowledge-base/knowledge-base-page.tsx diff --git a/frontend/src/components/knowledge-base/shared-kb-tree.tsx b/apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx similarity index 100% rename from frontend/src/components/knowledge-base/shared-kb-tree.tsx rename to apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx diff --git a/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx b/apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx similarity index 100% rename from frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx rename to apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx diff --git a/frontend/src/components/layout/app-providers.tsx b/apps/frontend/src/components/layout/app-providers.tsx similarity index 100% rename from frontend/src/components/layout/app-providers.tsx rename to apps/frontend/src/components/layout/app-providers.tsx diff --git a/frontend/src/components/maintenance/maintenance-page.tsx b/apps/frontend/src/components/maintenance/maintenance-page.tsx similarity index 100% rename from frontend/src/components/maintenance/maintenance-page.tsx rename to apps/frontend/src/components/maintenance/maintenance-page.tsx diff --git a/frontend/src/components/markdown/index.tsx b/apps/frontend/src/components/markdown/index.tsx similarity index 100% rename from frontend/src/components/markdown/index.tsx rename to apps/frontend/src/components/markdown/index.tsx diff --git a/frontend/src/components/markdown/unified-markdown.tsx b/apps/frontend/src/components/markdown/unified-markdown.tsx similarity index 100% rename from frontend/src/components/markdown/unified-markdown.tsx rename to apps/frontend/src/components/markdown/unified-markdown.tsx diff --git a/frontend/src/components/memory/MemoryCard.tsx b/apps/frontend/src/components/memory/MemoryCard.tsx similarity index 100% rename from frontend/src/components/memory/MemoryCard.tsx rename to apps/frontend/src/components/memory/MemoryCard.tsx diff --git a/frontend/src/components/memory/MemoryList.tsx b/apps/frontend/src/components/memory/MemoryList.tsx similarity index 100% rename from frontend/src/components/memory/MemoryList.tsx rename to apps/frontend/src/components/memory/MemoryList.tsx diff --git a/apps/frontend/src/components/memory/MemorySettings.tsx b/apps/frontend/src/components/memory/MemorySettings.tsx new file mode 100644 index 0000000000..9fa8b6bfda --- /dev/null +++ b/apps/frontend/src/components/memory/MemorySettings.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { Brain, Sparkles } from 'lucide-react'; +import { Alert, AlertDescription } from '@/components/ui/alert'; +import { useTranslations } from 'next-intl'; + +export function MemorySettings() { + const t = useTranslations('settings.memory'); + + return ( +
+
+
+
+
+
+ +
+
+

{t('title') || 'Memory'}

+

+ {t('description') || 'Personalized context from your conversations'} +

+
+
+
+
+ + + + + Coming Soon +

+ Memory is currently under development. This feature will allow Kortix to remember important information from your conversations to provide more personalized and context-aware responses. +

+
+
+
+
+ ); +} diff --git a/frontend/src/components/notifications/notification-center.tsx b/apps/frontend/src/components/notifications/notification-center.tsx similarity index 100% rename from frontend/src/components/notifications/notification-center.tsx rename to apps/frontend/src/components/notifications/notification-center.tsx diff --git a/frontend/src/components/notifications/notification-dropdown.tsx b/apps/frontend/src/components/notifications/notification-dropdown.tsx similarity index 100% rename from frontend/src/components/notifications/notification-dropdown.tsx rename to apps/frontend/src/components/notifications/notification-dropdown.tsx diff --git a/frontend/src/components/notifications/notification-settings.tsx b/apps/frontend/src/components/notifications/notification-settings.tsx similarity index 100% rename from frontend/src/components/notifications/notification-settings.tsx rename to apps/frontend/src/components/notifications/notification-settings.tsx diff --git a/frontend/src/components/onboarding/README.md b/apps/frontend/src/components/onboarding/README.md similarity index 100% rename from frontend/src/components/onboarding/README.md rename to apps/frontend/src/components/onboarding/README.md diff --git a/frontend/src/components/onboarding/agent-config/agent-configuration.tsx b/apps/frontend/src/components/onboarding/agent-config/agent-configuration.tsx similarity index 100% rename from frontend/src/components/onboarding/agent-config/agent-configuration.tsx rename to apps/frontend/src/components/onboarding/agent-config/agent-configuration.tsx diff --git a/frontend/src/components/onboarding/agent-config/configuration-utils.ts b/apps/frontend/src/components/onboarding/agent-config/configuration-utils.ts similarity index 100% rename from frontend/src/components/onboarding/agent-config/configuration-utils.ts rename to apps/frontend/src/components/onboarding/agent-config/configuration-utils.ts diff --git a/frontend/src/components/onboarding/agent-config/field-renderer.tsx b/apps/frontend/src/components/onboarding/agent-config/field-renderer.tsx similarity index 100% rename from frontend/src/components/onboarding/agent-config/field-renderer.tsx rename to apps/frontend/src/components/onboarding/agent-config/field-renderer.tsx diff --git a/frontend/src/components/onboarding/agent-config/multi-agent-configuration.tsx b/apps/frontend/src/components/onboarding/agent-config/multi-agent-configuration.tsx similarity index 100% rename from frontend/src/components/onboarding/agent-config/multi-agent-configuration.tsx rename to apps/frontend/src/components/onboarding/agent-config/multi-agent-configuration.tsx diff --git a/frontend/src/components/onboarding/index.ts b/apps/frontend/src/components/onboarding/index.ts similarity index 100% rename from frontend/src/components/onboarding/index.ts rename to apps/frontend/src/components/onboarding/index.ts diff --git a/frontend/src/components/onboarding/new-onboarding-page.tsx b/apps/frontend/src/components/onboarding/new-onboarding-page.tsx similarity index 100% rename from frontend/src/components/onboarding/new-onboarding-page.tsx rename to apps/frontend/src/components/onboarding/new-onboarding-page.tsx diff --git a/frontend/src/components/onboarding/onboarding-config.tsx b/apps/frontend/src/components/onboarding/onboarding-config.tsx similarity index 100% rename from frontend/src/components/onboarding/onboarding-config.tsx rename to apps/frontend/src/components/onboarding/onboarding-config.tsx diff --git a/frontend/src/components/onboarding/onboarding-provider.tsx b/apps/frontend/src/components/onboarding/onboarding-provider.tsx similarity index 100% rename from frontend/src/components/onboarding/onboarding-provider.tsx rename to apps/frontend/src/components/onboarding/onboarding-provider.tsx diff --git a/frontend/src/components/onboarding/shared/context.ts b/apps/frontend/src/components/onboarding/shared/context.ts similarity index 100% rename from frontend/src/components/onboarding/shared/context.ts rename to apps/frontend/src/components/onboarding/shared/context.ts diff --git a/frontend/src/components/onboarding/shared/data.ts b/apps/frontend/src/components/onboarding/shared/data.ts similarity index 100% rename from frontend/src/components/onboarding/shared/data.ts rename to apps/frontend/src/components/onboarding/shared/data.ts diff --git a/frontend/src/components/onboarding/shared/icon-renderer.tsx b/apps/frontend/src/components/onboarding/shared/icon-renderer.tsx similarity index 100% rename from frontend/src/components/onboarding/shared/icon-renderer.tsx rename to apps/frontend/src/components/onboarding/shared/icon-renderer.tsx diff --git a/frontend/src/components/onboarding/shared/progress-indicator.tsx b/apps/frontend/src/components/onboarding/shared/progress-indicator.tsx similarity index 100% rename from frontend/src/components/onboarding/shared/progress-indicator.tsx rename to apps/frontend/src/components/onboarding/shared/progress-indicator.tsx diff --git a/frontend/src/components/onboarding/shared/step-wrapper.tsx b/apps/frontend/src/components/onboarding/shared/step-wrapper.tsx similarity index 100% rename from frontend/src/components/onboarding/shared/step-wrapper.tsx rename to apps/frontend/src/components/onboarding/shared/step-wrapper.tsx diff --git a/frontend/src/components/onboarding/shared/types.ts b/apps/frontend/src/components/onboarding/shared/types.ts similarity index 100% rename from frontend/src/components/onboarding/shared/types.ts rename to apps/frontend/src/components/onboarding/shared/types.ts diff --git a/frontend/src/components/onboarding/steps/ceo-intro-step.tsx b/apps/frontend/src/components/onboarding/steps/ceo-intro-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/ceo-intro-step.tsx rename to apps/frontend/src/components/onboarding/steps/ceo-intro-step.tsx diff --git a/frontend/src/components/onboarding/steps/completion-step.tsx b/apps/frontend/src/components/onboarding/steps/completion-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/completion-step.tsx rename to apps/frontend/src/components/onboarding/steps/completion-step.tsx diff --git a/frontend/src/components/onboarding/steps/smart-context-step.tsx b/apps/frontend/src/components/onboarding/steps/smart-context-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/smart-context-step.tsx rename to apps/frontend/src/components/onboarding/steps/smart-context-step.tsx diff --git a/frontend/src/components/onboarding/steps/team-invitation-step.tsx b/apps/frontend/src/components/onboarding/steps/team-invitation-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/team-invitation-step.tsx rename to apps/frontend/src/components/onboarding/steps/team-invitation-step.tsx diff --git a/frontend/src/components/onboarding/steps/user-type-step.tsx b/apps/frontend/src/components/onboarding/steps/user-type-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/user-type-step.tsx rename to apps/frontend/src/components/onboarding/steps/user-type-step.tsx diff --git a/frontend/src/components/onboarding/steps/workforce-selection-step.tsx b/apps/frontend/src/components/onboarding/steps/workforce-selection-step.tsx similarity index 100% rename from frontend/src/components/onboarding/steps/workforce-selection-step.tsx rename to apps/frontend/src/components/onboarding/steps/workforce-selection-step.tsx diff --git a/frontend/src/components/posthog-identify.tsx b/apps/frontend/src/components/posthog-identify.tsx similarity index 100% rename from frontend/src/components/posthog-identify.tsx rename to apps/frontend/src/components/posthog-identify.tsx diff --git a/frontend/src/components/presence-provider.tsx b/apps/frontend/src/components/presence-provider.tsx similarity index 100% rename from frontend/src/components/presence-provider.tsx rename to apps/frontend/src/components/presence-provider.tsx diff --git a/frontend/src/components/referrals/index.ts b/apps/frontend/src/components/referrals/index.ts similarity index 100% rename from frontend/src/components/referrals/index.ts rename to apps/frontend/src/components/referrals/index.ts diff --git a/frontend/src/components/referrals/referral-code-dialog.tsx b/apps/frontend/src/components/referrals/referral-code-dialog.tsx similarity index 100% rename from frontend/src/components/referrals/referral-code-dialog.tsx rename to apps/frontend/src/components/referrals/referral-code-dialog.tsx diff --git a/frontend/src/components/referrals/referral-code-section.tsx b/apps/frontend/src/components/referrals/referral-code-section.tsx similarity index 100% rename from frontend/src/components/referrals/referral-code-section.tsx rename to apps/frontend/src/components/referrals/referral-code-section.tsx diff --git a/frontend/src/components/referrals/referral-dialog.tsx b/apps/frontend/src/components/referrals/referral-dialog.tsx similarity index 100% rename from frontend/src/components/referrals/referral-dialog.tsx rename to apps/frontend/src/components/referrals/referral-dialog.tsx diff --git a/frontend/src/components/referrals/referral-email-invitation.tsx b/apps/frontend/src/components/referrals/referral-email-invitation.tsx similarity index 100% rename from frontend/src/components/referrals/referral-email-invitation.tsx rename to apps/frontend/src/components/referrals/referral-email-invitation.tsx diff --git a/frontend/src/components/referrals/referral-stats-cards.tsx b/apps/frontend/src/components/referrals/referral-stats-cards.tsx similarity index 100% rename from frontend/src/components/referrals/referral-stats-cards.tsx rename to apps/frontend/src/components/referrals/referral-stats-cards.tsx diff --git a/frontend/src/components/referrals/referrals-tab.tsx b/apps/frontend/src/components/referrals/referrals-tab.tsx similarity index 100% rename from frontend/src/components/referrals/referrals-tab.tsx rename to apps/frontend/src/components/referrals/referrals-tab.tsx diff --git a/apps/frontend/src/components/settings/knowledge-base-settings.tsx b/apps/frontend/src/components/settings/knowledge-base-settings.tsx new file mode 100644 index 0000000000..2539971a00 --- /dev/null +++ b/apps/frontend/src/components/settings/knowledge-base-settings.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { FileText, Sparkles } from 'lucide-react'; +import { Alert, AlertDescription } from '@/components/ui/alert'; +import { useTranslations } from 'next-intl'; + +export function KnowledgeBaseSettings() { + const t = useTranslations('settings.knowledgeBase'); + + return ( +
+
+
+
+
+
+ +
+
+

{t('title') || 'Knowledge Base'}

+

+ {t('description') || 'Upload and manage documents for your agents'} +

+
+
+
+
+ + + + + Coming Soon +

+ Knowledge Base is currently under development. This feature will allow you to upload documents and files that your agents can reference to provide more accurate and context-aware responses. +

+
+
+
+
+ ); +} + diff --git a/frontend/src/components/settings/language-switcher.tsx b/apps/frontend/src/components/settings/language-switcher.tsx similarity index 100% rename from frontend/src/components/settings/language-switcher.tsx rename to apps/frontend/src/components/settings/language-switcher.tsx diff --git a/frontend/src/components/settings/user-settings-modal.tsx b/apps/frontend/src/components/settings/user-settings-modal.tsx similarity index 99% rename from frontend/src/components/settings/user-settings-modal.tsx rename to apps/frontend/src/components/settings/user-settings-modal.tsx index 177f0a2ee7..2ae0390334 100644 --- a/frontend/src/components/settings/user-settings-modal.tsx +++ b/apps/frontend/src/components/settings/user-settings-modal.tsx @@ -98,6 +98,7 @@ import { useTranslations } from 'next-intl'; import { ReferralsTab } from '@/components/referrals/referrals-tab'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { MemorySettings } from '@/components/memory/MemorySettings'; +import { KnowledgeBaseSettings } from './knowledge-base-settings'; type TabId = 'general' | 'plan' | 'billing' | 'usage' | 'memory' | 'env-manager' | 'knowledge-base' | 'integrations' | 'api-keys' | 'referrals'; @@ -148,9 +149,8 @@ export function UserSettingsModal({ if (tabId === 'plan') { setShowPlanModal(true); } else if (tabId === 'knowledge-base') { - // Close modal first for instant feel, then navigate - onOpenChange(false); - router.push('/knowledge'); + // Show Coming Soon tab instead of navigating + setActiveTab('knowledge-base'); } else if (tabId === 'integrations') { onOpenChange(false); router.push('/settings/credentials'); @@ -227,6 +227,7 @@ export function UserSettingsModal({ {activeTab === 'billing' && setShowPlanModal(true)} isActive={activeTab === 'billing'} />} {activeTab === 'usage' && } {activeTab === 'memory' && } + {activeTab === 'knowledge-base' && } {activeTab === 'referrals' && } {activeTab === 'env-manager' && isLocal && } @@ -280,6 +281,7 @@ export function UserSettingsModal({ {activeTab === 'billing' && setShowPlanModal(true)} isActive={activeTab === 'billing'} />} {activeTab === 'usage' && } {activeTab === 'memory' && } + {activeTab === 'knowledge-base' && } {activeTab === 'referrals' && } {activeTab === 'env-manager' && isLocal && } diff --git a/frontend/src/components/shared/prompt-examples.tsx b/apps/frontend/src/components/shared/prompt-examples.tsx similarity index 100% rename from frontend/src/components/shared/prompt-examples.tsx rename to apps/frontend/src/components/shared/prompt-examples.tsx diff --git a/frontend/src/components/sidebar/cta.tsx b/apps/frontend/src/components/sidebar/cta.tsx similarity index 100% rename from frontend/src/components/sidebar/cta.tsx rename to apps/frontend/src/components/sidebar/cta.tsx diff --git a/frontend/src/components/sidebar/date-picker.tsx b/apps/frontend/src/components/sidebar/date-picker.tsx similarity index 100% rename from frontend/src/components/sidebar/date-picker.tsx rename to apps/frontend/src/components/sidebar/date-picker.tsx diff --git a/frontend/src/components/sidebar/kortix-enterprise-modal.tsx b/apps/frontend/src/components/sidebar/kortix-enterprise-modal.tsx similarity index 100% rename from frontend/src/components/sidebar/kortix-enterprise-modal.tsx rename to apps/frontend/src/components/sidebar/kortix-enterprise-modal.tsx diff --git a/frontend/src/components/sidebar/kortix-logo.tsx b/apps/frontend/src/components/sidebar/kortix-logo.tsx similarity index 100% rename from frontend/src/components/sidebar/kortix-logo.tsx rename to apps/frontend/src/components/sidebar/kortix-logo.tsx diff --git a/frontend/src/components/sidebar/nav-agents-view.tsx b/apps/frontend/src/components/sidebar/nav-agents-view.tsx similarity index 100% rename from frontend/src/components/sidebar/nav-agents-view.tsx rename to apps/frontend/src/components/sidebar/nav-agents-view.tsx diff --git a/frontend/src/components/sidebar/nav-agents.tsx b/apps/frontend/src/components/sidebar/nav-agents.tsx similarity index 100% rename from frontend/src/components/sidebar/nav-agents.tsx rename to apps/frontend/src/components/sidebar/nav-agents.tsx diff --git a/frontend/src/components/sidebar/nav-global-config.tsx b/apps/frontend/src/components/sidebar/nav-global-config.tsx similarity index 99% rename from frontend/src/components/sidebar/nav-global-config.tsx rename to apps/frontend/src/components/sidebar/nav-global-config.tsx index 7341340f2c..e2fb1bd2b2 100644 --- a/frontend/src/components/sidebar/nav-global-config.tsx +++ b/apps/frontend/src/components/sidebar/nav-global-config.tsx @@ -37,7 +37,7 @@ export function NavGlobalConfig() { }; return ( -
+
{/* Section Header */}
diff --git a/frontend/src/components/sidebar/nav-main.tsx b/apps/frontend/src/components/sidebar/nav-main.tsx similarity index 100% rename from frontend/src/components/sidebar/nav-main.tsx rename to apps/frontend/src/components/sidebar/nav-main.tsx diff --git a/apps/frontend/src/components/sidebar/nav-projects.tsx b/apps/frontend/src/components/sidebar/nav-projects.tsx new file mode 100644 index 0000000000..78bee7c75d --- /dev/null +++ b/apps/frontend/src/components/sidebar/nav-projects.tsx @@ -0,0 +1,132 @@ +'use client'; + +import { useState } from 'react'; +import { useRouter, usePathname } from 'next/navigation'; +import { Plus, FolderOpen, ChevronRight, Loader2 } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { useSidebar } from '@/components/ui/sidebar'; +import { useProjects } from '@/hooks/sidebar/use-sidebar'; +import { cn } from '@/lib/utils'; +import Link from 'next/link'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip'; +import { NewAgentDialog } from '@/components/agents/new-agent-dialog'; +import posthog from 'posthog-js'; + +export function NavProjects() { + const { isMobile, setOpenMobile } = useSidebar(); + const router = useRouter(); + const pathname = usePathname(); + const [showNewProjectDialog, setShowNewProjectDialog] = useState(false); + + const { + data: projects = [], + isLoading, + error + } = useProjects(); + + // Get unique projects (max 5 for sidebar display) + const displayedProjects = projects.slice(0, 5); + + const handleNewProject = () => { + posthog.capture('new_project_clicked', { source: 'sidebar' }); + setShowNewProjectDialog(true); + }; + + const handleNavigation = (path: string) => { + router.push(path); + if (isMobile) { + setOpenMobile(false); + } + }; + + return ( +
+ {/* Section Header */} +
+ + Projects + + + + + + New project + +
+ + {/* Projects List */} +
+ {isLoading ? ( + // Skeleton loading state +
+ {Array.from({ length: 3 }).map((_, index) => ( +
+
+
+
+ ))} +
+ ) : displayedProjects.length > 0 ? ( + displayedProjects.map((project) => { + const isActive = pathname?.includes(`/projects/${project.project_id}`); + + return ( + isMobile && setOpenMobile(false)} + className={cn( + "group flex items-center gap-2.5 px-3 py-2 rounded-xl transition-all text-[13px]", + isActive + ? "bg-accent text-accent-foreground font-medium" + : "hover:bg-accent/50 text-foreground/80 hover:text-foreground" + )} + > + + {project.name} + + ); + }) + ) : ( + // Empty state +
+

+ No projects yet +

+
+ )} + + {/* View all projects link */} + {projects.length > 5 && ( + + )} +
+ + {/* New Project Dialog */} + +
+ ); +} + diff --git a/apps/frontend/src/components/sidebar/nav-tasks.tsx b/apps/frontend/src/components/sidebar/nav-tasks.tsx new file mode 100644 index 0000000000..ba042cefa1 --- /dev/null +++ b/apps/frontend/src/components/sidebar/nav-tasks.tsx @@ -0,0 +1,359 @@ +'use client'; + +import { useEffect, useState, useRef, useMemo } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { + MoreHorizontal, + Trash2, + Loader2, + Frown, +} from "lucide-react"; +import { ThreadIcon } from "./thread-icon"; +import { toast } from "sonner"; +import { usePathname, useRouter } from "next/navigation"; +import { cn } from '@/lib/utils'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { useSidebar } from '@/components/ui/sidebar'; +import Link from "next/link"; +import { DeleteConfirmationDialog } from "@/components/thread/DeleteConfirmationDialog"; +import { useDeleteOperation } from '@/stores/delete-operation-store'; +import { ThreadWithProject } from '@/hooks/sidebar/use-sidebar'; +import { useDeleteThread, useProjects } from '@/hooks/sidebar/use-sidebar'; +import { threadKeys } from '@/hooks/threads/keys'; +import { useThreadAgentStatuses } from '@/hooks/threads'; +import { formatDateForList } from '@/lib/utils/date-formatting'; +import { useThreads } from '@/hooks/threads/use-threads'; +import { useTranslations } from 'next-intl'; + +// Task item component matching Manus design +const TaskItem: React.FC<{ + thread: ThreadWithProject; + isActive: boolean; + isLoading: boolean; + isRunning: boolean; + onNavigate: (e: React.MouseEvent, threadId: string, url: string) => void; + onDelete: (threadId: string, threadName: string) => void; +}> = ({ + thread, + isActive, + isLoading, + isRunning, + onNavigate, + onDelete, +}) => { + const [isHovering, setIsHovering] = useState(false); + + return ( + onNavigate(e, thread.threadId, thread.url)} + prefetch={false} + className={cn( + "group flex items-center gap-2.5 px-3 py-2 rounded-xl transition-all", + isActive + ? "bg-accent text-accent-foreground" + : "hover:bg-accent/50 text-foreground/80 hover:text-foreground" + )} + onMouseEnter={() => setIsHovering(true)} + onMouseLeave={() => setIsHovering(false)} + > + {/* Icon with optional running indicator */} +
+ {isLoading ? ( + + ) : ( + + )} + {/* Running indicator - red dot badge like Manus */} + {isRunning && ( +
+ + + + +
+ )} +
+ + {/* Task name */} + + {thread.projectName} + + + {/* Menu button - appears on hover */} + + + + + + { + e.preventDefault(); + e.stopPropagation(); + onDelete(thread.threadId, thread.projectName); + }} + className="text-destructive focus:text-destructive" + > + + Delete + + + + + ); +}; + +export function NavTasks() { + const t = useTranslations('sidebar'); + const { isMobile, state, setOpenMobile } = useSidebar(); + const [loadingThreadId, setLoadingThreadId] = useState(null); + const pathname = usePathname(); + const router = useRouter(); + const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); + const [threadToDelete, setThreadToDelete] = useState<{ id: string; name: string } | null>(null); + const isNavigatingRef = useRef(false); + const { performDelete } = useDeleteOperation(); + const isPerformingActionRef = useRef(false); + const queryClient = useQueryClient(); + const scrollContainerRef = useRef(null); + + const { + data: projects = [], + isLoading: isProjectsLoading, + error: projectsError + } = useProjects(); + + const { + data: threadsResponse, + isLoading: isThreadsLoading, + error: threadsError + } = useThreads({ + limit: 500, + }); + + const { mutate: deleteThreadMutation, isPending: isDeletingSingle } = useDeleteThread(); + + const currentThreads = threadsResponse?.threads || []; + + // Process threads directly + const combinedThreads: ThreadWithProject[] = useMemo(() => { + if (currentThreads.length === 0) { + return []; + } + + const processed: ThreadWithProject[] = []; + + for (const thread of currentThreads) { + const projectId = thread.project_id; + const project = thread.project; + + if (!projectId) { + continue; + } + + const displayName = project?.name || 'Unnamed Project'; + const iconName = project?.icon_name; + const updatedAt = thread.updated_at || project?.updated_at || new Date().toISOString(); + const formattedDate = formatDateForList(updatedAt); + + processed.push({ + threadId: thread.thread_id, + projectId: projectId, + projectName: displayName, + threadName: thread.name && thread.name.trim() ? thread.name : formattedDate, + url: `/projects/${projectId}/thread/${thread.thread_id}`, + updatedAt: updatedAt, + iconName: iconName, + }); + } + + return processed.sort((a, b) => + new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime() + ); + }, [currentThreads]); + + // Track agent running status for all threads + const threadIds = combinedThreads.map(thread => thread.threadId); + const agentStatusMap = useThreadAgentStatuses(threadIds); + + useEffect(() => { + setLoadingThreadId(null); + }, [pathname]); + + useEffect(() => { + const handleNavigationComplete = () => { + document.body.style.pointerEvents = 'auto'; + isNavigatingRef.current = false; + }; + + window.addEventListener("popstate", handleNavigationComplete); + + return () => { + window.removeEventListener('popstate', handleNavigationComplete); + document.body.style.pointerEvents = "auto"; + }; + }, []); + + useEffect(() => { + isNavigatingRef.current = false; + document.body.style.pointerEvents = 'auto'; + }, [pathname]); + + const handleThreadClick = (e: React.MouseEvent, threadId: string, url: string) => { + if (!e.metaKey) { + setLoadingThreadId(threadId); + } + + if (isMobile) { + setOpenMobile(false); + } + }; + + const handleDeleteThread = async (threadId: string, threadName: string) => { + setThreadToDelete({ id: threadId, name: threadName }); + setIsDeleteDialogOpen(true); + }; + + const confirmDelete = async () => { + if (!threadToDelete || isPerformingActionRef.current) return; + + isPerformingActionRef.current = true; + setIsDeleteDialogOpen(false); + + const threadId = threadToDelete.id; + const isActive = pathname?.includes(threadId); + + const thread = combinedThreads.find(t => t.threadId === threadId); + const currentThread = currentThreads.find(t => t.thread_id === threadId); + const sandboxId = currentThread?.project?.sandbox?.id; + + await performDelete( + threadId, + isActive, + async () => { + deleteThreadMutation( + { threadId, sandboxId }, + { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: threadKeys.lists() }); + toast.success('Task deleted successfully'); + }, + onSettled: () => { + setThreadToDelete(null); + isPerformingActionRef.current = false; + } + } + ); + }, + () => { + setThreadToDelete(null); + isPerformingActionRef.current = false; + }, + ); + }; + + const isInitialLoading = (isProjectsLoading || isThreadsLoading) && combinedThreads.length === 0; + const hasError = projectsError || threadsError; + + if (hasError) { + console.error('Error loading data:', { projectsError, threadsError }); + } + + return ( +
+
+ {/* Top fade gradient */} +
+ +
+ {(state !== 'collapsed' || isMobile) && ( + <> + {isInitialLoading ? ( +
+ {Array.from({ length: 8 }).map((_, index) => ( +
+
+
+
+ ))} +
+ ) : combinedThreads.length > 0 ? ( +
+ {combinedThreads.map((thread) => { + const isActive = pathname?.includes(thread.threadId) || false; + const isThreadLoading = loadingThreadId === thread.threadId; + const isAgentRunning = agentStatusMap.get(thread.threadId) || false; + + return ( + + ); + })} +
+ ) : ( +
+
+ +
+

+ {t('noConversations')} +

+

+ Start a new task to get going +

+
+ )} + + )} +
+ + {/* Bottom fade gradient */} +
+
+ + {threadToDelete && ( + setIsDeleteDialogOpen(false)} + onConfirm={confirmDelete} + threadName={threadToDelete.name} + isDeleting={isDeletingSingle} + /> + )} +
+ ); +} + diff --git a/frontend/src/components/sidebar/nav-trigger-runs.tsx b/apps/frontend/src/components/sidebar/nav-trigger-runs.tsx similarity index 100% rename from frontend/src/components/sidebar/nav-trigger-runs.tsx rename to apps/frontend/src/components/sidebar/nav-trigger-runs.tsx diff --git a/frontend/src/components/sidebar/nav-user-with-teams.tsx b/apps/frontend/src/components/sidebar/nav-user-with-teams.tsx similarity index 100% rename from frontend/src/components/sidebar/nav-user-with-teams.tsx rename to apps/frontend/src/components/sidebar/nav-user-with-teams.tsx diff --git a/frontend/src/components/sidebar/search-search.tsx b/apps/frontend/src/components/sidebar/search-search.tsx similarity index 100% rename from frontend/src/components/sidebar/search-search.tsx rename to apps/frontend/src/components/sidebar/search-search.tsx diff --git a/frontend/src/components/sidebar/share-modal.tsx b/apps/frontend/src/components/sidebar/share-modal.tsx similarity index 100% rename from frontend/src/components/sidebar/share-modal.tsx rename to apps/frontend/src/components/sidebar/share-modal.tsx diff --git a/frontend/src/components/sidebar/sidebar-left.tsx b/apps/frontend/src/components/sidebar/sidebar-left.tsx similarity index 100% rename from frontend/src/components/sidebar/sidebar-left.tsx rename to apps/frontend/src/components/sidebar/sidebar-left.tsx diff --git a/frontend/src/components/sidebar/thread-icon.tsx b/apps/frontend/src/components/sidebar/thread-icon.tsx similarity index 100% rename from frontend/src/components/sidebar/thread-icon.tsx rename to apps/frontend/src/components/sidebar/thread-icon.tsx diff --git a/frontend/src/components/sidebar/thread-search-modal.tsx b/apps/frontend/src/components/sidebar/thread-search-modal.tsx similarity index 100% rename from frontend/src/components/sidebar/thread-search-modal.tsx rename to apps/frontend/src/components/sidebar/thread-search-modal.tsx diff --git a/frontend/src/components/team-switcher.tsx b/apps/frontend/src/components/team-switcher.tsx similarity index 100% rename from frontend/src/components/team-switcher.tsx rename to apps/frontend/src/components/team-switcher.tsx diff --git a/frontend/src/components/theme-provider.tsx b/apps/frontend/src/components/theme-provider.tsx similarity index 100% rename from frontend/src/components/theme-provider.tsx rename to apps/frontend/src/components/theme-provider.tsx diff --git a/frontend/src/components/thread/ContextUsageIndicator.tsx b/apps/frontend/src/components/thread/ContextUsageIndicator.tsx similarity index 100% rename from frontend/src/components/thread/ContextUsageIndicator.tsx rename to apps/frontend/src/components/thread/ContextUsageIndicator.tsx diff --git a/frontend/src/components/thread/DeleteConfirmationDialog.tsx b/apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx similarity index 100% rename from frontend/src/components/thread/DeleteConfirmationDialog.tsx rename to apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx diff --git a/frontend/src/components/thread/HealthCheckedVncIframe.tsx b/apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx similarity index 100% rename from frontend/src/components/thread/HealthCheckedVncIframe.tsx rename to apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx diff --git a/frontend/src/components/thread/ThreadComponent.tsx b/apps/frontend/src/components/thread/ThreadComponent.tsx similarity index 100% rename from frontend/src/components/thread/ThreadComponent.tsx rename to apps/frontend/src/components/thread/ThreadComponent.tsx diff --git a/frontend/src/components/thread/agent-run-limit-banner.tsx b/apps/frontend/src/components/thread/agent-run-limit-banner.tsx similarity index 100% rename from frontend/src/components/thread/agent-run-limit-banner.tsx rename to apps/frontend/src/components/thread/agent-run-limit-banner.tsx diff --git a/frontend/src/components/thread/agent-run-limit-dialog.tsx b/apps/frontend/src/components/thread/agent-run-limit-dialog.tsx similarity index 100% rename from frontend/src/components/thread/agent-run-limit-dialog.tsx rename to apps/frontend/src/components/thread/agent-run-limit-dialog.tsx diff --git a/frontend/src/components/thread/chat-input/chat-input.tsx b/apps/frontend/src/components/thread/chat-input/chat-input.tsx similarity index 98% rename from frontend/src/components/thread/chat-input/chat-input.tsx rename to apps/frontend/src/components/thread/chat-input/chat-input.tsx index faa30425ff..2992280b46 100644 --- a/frontend/src/components/thread/chat-input/chat-input.tsx +++ b/apps/frontend/src/components/thread/chat-input/chat-input.tsx @@ -43,7 +43,6 @@ import { isStagingMode, isLocalMode } from '@/lib/config'; import { PlanSelectionModal } from '@/components/billing/pricing'; import { AgentConfigurationDialog } from '@/components/agents/agent-configuration-dialog'; import { SpotlightCard } from '@/components/ui/spotlight-card'; -import { MemoryToggle } from './memory-toggle'; import posthog from 'posthog-js'; import { trackCtaUpgrade } from '@/lib/analytics/gtm'; @@ -690,8 +689,6 @@ export interface ChatInputProps { selectedTemplate?: string | null; threadId?: string | null; projectId?: string; - memoryEnabled?: boolean; - onMemoryToggle?: (enabled: boolean) => void; } export interface UploadedFile { @@ -745,8 +742,6 @@ export const ChatInput = memo(forwardRef( selectedTemplate = null, threadId = null, projectId, - memoryEnabled, - onMemoryToggle, }, ref, ) => { @@ -1311,14 +1306,6 @@ export const ChatInput = memo(forwardRef( onOpenPlanModal={handleOpenPlanModal} /> - {/* {isLoggedIn && !threadId && ( - - )} */} -
(
)}
- ), [hideAttachments, loading, disabled, isAgentRunning, isUploading, sandboxId, projectId, messages, isLoggedIn, isFreeTier, quickIntegrations, integrationIcons, handleOpenRegistry, handleOpenPlanModal, threadId, memoryEnabled, onMemoryToggle, isSunaAgent, sunaAgentModes, onModeDeselect, selectedMode, isModeDismissing, handleModeDeselect]); + ), [hideAttachments, loading, disabled, isAgentRunning, isUploading, sandboxId, projectId, messages, isLoggedIn, isFreeTier, quickIntegrations, integrationIcons, handleOpenRegistry, handleOpenPlanModal, threadId, isSunaAgent, sunaAgentModes, onModeDeselect, selectedMode, isModeDismissing, handleModeDeselect]); const rightControls = useMemo(() => (
@@ -1362,7 +1349,7 @@ export const ChatInput = memo(forwardRef( pendingFilesCount={pendingFilesCount} />
- ), [renderConfigDropdown, isLoggedIn, handleTranscription, loading, disabled, isAgentRunning, hasContent, hasFiles, isUploading, onStopAgent, handleSubmit, buttonLoaderVariant, pendingFilesCount]); + ), [renderConfigDropdown, isLoggedIn, loading, disabled, handleTranscription, isAgentRunning, hasContent, hasFiles, isUploading, onStopAgent, handleSubmit, buttonLoaderVariant, pendingFilesCount]); const renderControls = useMemo(() => (
diff --git a/frontend/src/components/thread/chat-input/chat-snack.tsx b/apps/frontend/src/components/thread/chat-input/chat-snack.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/chat-snack.tsx rename to apps/frontend/src/components/thread/chat-input/chat-snack.tsx diff --git a/frontend/src/components/thread/chat-input/custom-model-dialog.tsx b/apps/frontend/src/components/thread/chat-input/custom-model-dialog.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/custom-model-dialog.tsx rename to apps/frontend/src/components/thread/chat-input/custom-model-dialog.tsx diff --git a/frontend/src/components/thread/chat-input/file-upload-handler.tsx b/apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/file-upload-handler.tsx rename to apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx diff --git a/frontend/src/components/thread/chat-input/floating-tool-preview.tsx b/apps/frontend/src/components/thread/chat-input/floating-tool-preview.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/floating-tool-preview.tsx rename to apps/frontend/src/components/thread/chat-input/floating-tool-preview.tsx diff --git a/frontend/src/components/thread/chat-input/unified-config-menu.tsx b/apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/unified-config-menu.tsx rename to apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx diff --git a/frontend/src/components/thread/chat-input/upgrade-preview.tsx b/apps/frontend/src/components/thread/chat-input/upgrade-preview.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/upgrade-preview.tsx rename to apps/frontend/src/components/thread/chat-input/upgrade-preview.tsx diff --git a/frontend/src/components/thread/chat-input/voice-recorder.tsx b/apps/frontend/src/components/thread/chat-input/voice-recorder.tsx similarity index 100% rename from frontend/src/components/thread/chat-input/voice-recorder.tsx rename to apps/frontend/src/components/thread/chat-input/voice-recorder.tsx diff --git a/frontend/src/components/thread/content/ApifyApprovalInline.tsx b/apps/frontend/src/components/thread/content/ApifyApprovalInline.tsx similarity index 100% rename from frontend/src/components/thread/content/ApifyApprovalInline.tsx rename to apps/frontend/src/components/thread/content/ApifyApprovalInline.tsx diff --git a/frontend/src/components/thread/content/MediaGenerationInline.tsx b/apps/frontend/src/components/thread/content/MediaGenerationInline.tsx similarity index 100% rename from frontend/src/components/thread/content/MediaGenerationInline.tsx rename to apps/frontend/src/components/thread/content/MediaGenerationInline.tsx diff --git a/frontend/src/components/thread/content/PlaybackControls.tsx b/apps/frontend/src/components/thread/content/PlaybackControls.tsx similarity index 100% rename from frontend/src/components/thread/content/PlaybackControls.tsx rename to apps/frontend/src/components/thread/content/PlaybackControls.tsx diff --git a/frontend/src/components/thread/content/PlaybackFloatingControls.tsx b/apps/frontend/src/components/thread/content/PlaybackFloatingControls.tsx similarity index 100% rename from frontend/src/components/thread/content/PlaybackFloatingControls.tsx rename to apps/frontend/src/components/thread/content/PlaybackFloatingControls.tsx diff --git a/frontend/src/components/thread/content/ShowToolStream.tsx b/apps/frontend/src/components/thread/content/ShowToolStream.tsx similarity index 100% rename from frontend/src/components/thread/content/ShowToolStream.tsx rename to apps/frontend/src/components/thread/content/ShowToolStream.tsx diff --git a/frontend/src/components/thread/content/SimplePlaybackControls.tsx b/apps/frontend/src/components/thread/content/SimplePlaybackControls.tsx similarity index 100% rename from frontend/src/components/thread/content/SimplePlaybackControls.tsx rename to apps/frontend/src/components/thread/content/SimplePlaybackControls.tsx diff --git a/frontend/src/components/thread/content/StreamingText.tsx b/apps/frontend/src/components/thread/content/StreamingText.tsx similarity index 54% rename from frontend/src/components/thread/content/StreamingText.tsx rename to apps/frontend/src/components/thread/content/StreamingText.tsx index 735a3828ca..0e8050e3e2 100644 --- a/frontend/src/components/thread/content/StreamingText.tsx +++ b/apps/frontend/src/components/thread/content/StreamingText.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { ComposioUrlDetector } from './composio-url-detector'; +import { useSmoothText } from '@/hooks/messages/useSmoothText'; interface StreamingTextProps { content: string; @@ -8,13 +9,16 @@ interface StreamingTextProps { export const StreamingText: React.FC = ({ content, }) => { - if (!content) { + // Apply smooth typewriter effect: reveal text at ~50 chars/second + const smoothContent = useSmoothText(content, 50, true); + + if (!smoothContent) { return null; } return (
- +
); }; diff --git a/frontend/src/components/thread/content/ThinkingCollapsible.tsx b/apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx similarity index 100% rename from frontend/src/components/thread/content/ThinkingCollapsible.tsx rename to apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx diff --git a/frontend/src/components/thread/content/ThreadContent.tsx b/apps/frontend/src/components/thread/content/ThreadContent.tsx similarity index 97% rename from frontend/src/components/thread/content/ThreadContent.tsx rename to apps/frontend/src/components/thread/content/ThreadContent.tsx index debedb1fc0..8e6c3b2672 100644 --- a/frontend/src/components/thread/content/ThreadContent.tsx +++ b/apps/frontend/src/components/thread/content/ThreadContent.tsx @@ -25,6 +25,7 @@ import { extractTextFromPartialJson, extractTextFromStreamingAskComplete, } from "@/hooks/messages/utils"; +import { useSmoothText } from "@/hooks/messages/useSmoothText"; import { AppIcon } from "../tool-views/shared/AppIcon"; export function renderAttachments( @@ -166,6 +167,14 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ threadId?: string; onPromptFill?: (message: string) => void; }) { + // Apply smooth typewriter effect to streaming text (120 chars/sec for snappy feel) + // Returns { text, isAnimating } - we continue rendering while animation is in progress + const { text: smoothStreamingText, isAnimating: isSmoothAnimating } = useSmoothText( + streamingTextContent || "", + 120, + true + ); + const toolResultsMap = useMemo(() => { const map = new Map(); group.messages.forEach((msg) => { @@ -259,20 +268,21 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ]); const streamingContent = useMemo(() => { - if ( - !isLastGroup || - readOnly || - !streamingTextContent || - (streamHookStatus !== "streaming" && streamHookStatus !== "connecting") - ) { + // Continue rendering if: + // 1. Currently streaming, OR + // 2. Animation is still in progress (let it finish even after stream ends) + const isStreaming = streamHookStatus === "streaming" || streamHookStatus === "connecting"; + const shouldRender = isLastGroup && !readOnly && smoothStreamingText && (isStreaming || isSmoothAnimating); + + if (!shouldRender) { return null; } let detectedTag: string | null = null; let tagStartIndex = -1; - const askIndex = streamingTextContent.indexOf(""); + smoothStreamingText.indexOf(""); if (functionCallsIndex !== -1) { const functionCallsContent = - streamingTextContent.substring(functionCallsIndex); + smoothStreamingText.substring(functionCallsIndex); if ( functionCallsContent.includes(' @@ -363,7 +374,8 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ }, [ isLastGroup, readOnly, - streamingTextContent, + smoothStreamingText, + isSmoothAnimating, streamHookStatus, visibleMessages, handleToolClick, diff --git a/frontend/src/components/thread/content/ThreadSkeleton.tsx b/apps/frontend/src/components/thread/content/ThreadSkeleton.tsx similarity index 100% rename from frontend/src/components/thread/content/ThreadSkeleton.tsx rename to apps/frontend/src/components/thread/content/ThreadSkeleton.tsx diff --git a/frontend/src/components/thread/content/agent-avatar.tsx b/apps/frontend/src/components/thread/content/agent-avatar.tsx similarity index 100% rename from frontend/src/components/thread/content/agent-avatar.tsx rename to apps/frontend/src/components/thread/content/agent-avatar.tsx diff --git a/frontend/src/components/thread/content/composio-url-detector.tsx b/apps/frontend/src/components/thread/content/composio-url-detector.tsx similarity index 100% rename from frontend/src/components/thread/content/composio-url-detector.tsx rename to apps/frontend/src/components/thread/content/composio-url-detector.tsx diff --git a/frontend/src/components/thread/content/loader.tsx b/apps/frontend/src/components/thread/content/loader.tsx similarity index 100% rename from frontend/src/components/thread/content/loader.tsx rename to apps/frontend/src/components/thread/content/loader.tsx diff --git a/frontend/src/components/thread/content/usePlaybackControls.tsx b/apps/frontend/src/components/thread/content/usePlaybackControls.tsx similarity index 100% rename from frontend/src/components/thread/content/usePlaybackControls.tsx rename to apps/frontend/src/components/thread/content/usePlaybackControls.tsx diff --git a/frontend/src/components/thread/file-attachment/AttachmentGroup.tsx b/apps/frontend/src/components/thread/file-attachment/AttachmentGroup.tsx similarity index 100% rename from frontend/src/components/thread/file-attachment/AttachmentGroup.tsx rename to apps/frontend/src/components/thread/file-attachment/AttachmentGroup.tsx diff --git a/frontend/src/components/thread/file-attachment/index.tsx b/apps/frontend/src/components/thread/file-attachment/index.tsx similarity index 100% rename from frontend/src/components/thread/file-attachment/index.tsx rename to apps/frontend/src/components/thread/file-attachment/index.tsx diff --git a/frontend/src/components/thread/file-browser.tsx b/apps/frontend/src/components/thread/file-browser.tsx similarity index 100% rename from frontend/src/components/thread/file-browser.tsx rename to apps/frontend/src/components/thread/file-browser.tsx diff --git a/frontend/src/components/thread/iframe-preview.tsx b/apps/frontend/src/components/thread/iframe-preview.tsx similarity index 100% rename from frontend/src/components/thread/iframe-preview.tsx rename to apps/frontend/src/components/thread/iframe-preview.tsx diff --git a/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx b/apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/FileBrowserView.tsx rename to apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx diff --git a/frontend/src/components/thread/kortix-computer/FileViewerView.tsx b/apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/FileViewerView.tsx rename to apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx diff --git a/frontend/src/components/thread/kortix-computer/KortixComputer.tsx b/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx similarity index 99% rename from frontend/src/components/thread/kortix-computer/KortixComputer.tsx rename to apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx index 05d9997b97..3bccda0a35 100644 --- a/frontend/src/components/thread/kortix-computer/KortixComputer.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx @@ -357,7 +357,8 @@ export const KortixComputer = memo(function KortixComputer({ const showDuringStreaming = currentToolName && [ 'create-file', 'edit-file', 'full-file-rewrite', 'read-file', 'delete-file', 'execute-command', 'check-command-output', 'terminate-command', - 'spreadsheet-create', 'spreadsheet-add-rows', 'spreadsheet-update-cell', 'spreadsheet-format-cells', 'spreadsheet-read' + 'spreadsheet-create', 'spreadsheet-add-rows', 'spreadsheet-update-cell', 'spreadsheet-format-cells', 'spreadsheet-read', + 'web-search', 'image-search' ].includes(currentToolName); if (isCurrentToolStreaming && totalCompletedCalls > 0 && !showDuringStreaming) { diff --git a/frontend/src/components/thread/kortix-computer/KortixComputerHeader.tsx b/apps/frontend/src/components/thread/kortix-computer/KortixComputerHeader.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/KortixComputerHeader.tsx rename to apps/frontend/src/components/thread/kortix-computer/KortixComputerHeader.tsx diff --git a/frontend/src/components/thread/kortix-computer/VersionBanner.tsx b/apps/frontend/src/components/thread/kortix-computer/VersionBanner.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/VersionBanner.tsx rename to apps/frontend/src/components/thread/kortix-computer/VersionBanner.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/AppWindow.tsx b/apps/frontend/src/components/thread/kortix-computer/components/AppWindow.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/AppWindow.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/AppWindow.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/Desktop.tsx b/apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/Desktop.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/DesktopContextMenu.tsx b/apps/frontend/src/components/thread/kortix-computer/components/DesktopContextMenu.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/DesktopContextMenu.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/DesktopContextMenu.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx b/apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/Dock.tsx b/apps/frontend/src/components/thread/kortix-computer/components/Dock.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/Dock.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/Dock.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx b/apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/EmptyState.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx b/apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/FileContextMenu.tsx b/apps/frontend/src/components/thread/kortix-computer/components/FileContextMenu.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/FileContextMenu.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/FileContextMenu.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx b/apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/Icons.tsx b/apps/frontend/src/components/thread/kortix-computer/components/Icons.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/Icons.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/Icons.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/LoadingState.tsx b/apps/frontend/src/components/thread/kortix-computer/components/LoadingState.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/LoadingState.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/LoadingState.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/NavigationControls.tsx b/apps/frontend/src/components/thread/kortix-computer/components/NavigationControls.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/NavigationControls.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/NavigationControls.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx b/apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/QuickLaunch.tsx b/apps/frontend/src/components/thread/kortix-computer/components/QuickLaunch.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/QuickLaunch.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/QuickLaunch.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/SandboxInfoCard.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SandboxInfoCard.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/SandboxInfoCard.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/SandboxInfoCard.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/SystemInfoContent.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SystemInfoContent.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/SystemInfoContent.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/SystemInfoContent.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/Terminal.tsx b/apps/frontend/src/components/thread/kortix-computer/components/Terminal.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/Terminal.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/Terminal.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/ToolbarButtons.tsx b/apps/frontend/src/components/thread/kortix-computer/components/ToolbarButtons.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/ToolbarButtons.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/ToolbarButtons.tsx diff --git a/frontend/src/components/thread/kortix-computer/components/ViewToggle.tsx b/apps/frontend/src/components/thread/kortix-computer/components/ViewToggle.tsx similarity index 100% rename from frontend/src/components/thread/kortix-computer/components/ViewToggle.tsx rename to apps/frontend/src/components/thread/kortix-computer/components/ViewToggle.tsx diff --git a/frontend/src/components/thread/kortix-computer/index.ts b/apps/frontend/src/components/thread/kortix-computer/index.ts similarity index 100% rename from frontend/src/components/thread/kortix-computer/index.ts rename to apps/frontend/src/components/thread/kortix-computer/index.ts diff --git a/frontend/src/components/thread/layout/index.ts b/apps/frontend/src/components/thread/layout/index.ts similarity index 100% rename from frontend/src/components/thread/layout/index.ts rename to apps/frontend/src/components/thread/layout/index.ts diff --git a/frontend/src/components/thread/layout/thread-layout.tsx b/apps/frontend/src/components/thread/layout/thread-layout.tsx similarity index 100% rename from frontend/src/components/thread/layout/thread-layout.tsx rename to apps/frontend/src/components/thread/layout/thread-layout.tsx diff --git a/frontend/src/components/thread/thread-error.tsx b/apps/frontend/src/components/thread/thread-error.tsx similarity index 100% rename from frontend/src/components/thread/thread-error.tsx rename to apps/frontend/src/components/thread/thread-error.tsx diff --git a/frontend/src/components/thread/thread-site-header.tsx b/apps/frontend/src/components/thread/thread-site-header.tsx similarity index 100% rename from frontend/src/components/thread/thread-site-header.tsx rename to apps/frontend/src/components/thread/thread-site-header.tsx diff --git a/frontend/src/components/thread/tool-views/BrowserToolView.tsx b/apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/BrowserToolView.tsx rename to apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx diff --git a/frontend/src/components/thread/tool-views/CompleteToolView.tsx b/apps/frontend/src/components/thread/tool-views/CompleteToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/CompleteToolView.tsx rename to apps/frontend/src/components/thread/tool-views/CompleteToolView.tsx diff --git a/frontend/src/components/thread/tool-views/GenericToolView.tsx b/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/GenericToolView.tsx rename to apps/frontend/src/components/thread/tool-views/GenericToolView.tsx diff --git a/frontend/src/components/thread/tool-views/KbToolView.tsx b/apps/frontend/src/components/thread/tool-views/KbToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/KbToolView.tsx rename to apps/frontend/src/components/thread/tool-views/KbToolView.tsx diff --git a/frontend/src/components/thread/tool-views/UploadFileToolView.tsx b/apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/UploadFileToolView.tsx rename to apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx diff --git a/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx b/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/WebCrawlToolView.tsx rename to apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx diff --git a/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx b/apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx rename to apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx diff --git a/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx b/apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx rename to apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx diff --git a/frontend/src/components/thread/tool-views/apify-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/apify-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/apify-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/apify-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx b/apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx rename to apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx diff --git a/frontend/src/components/thread/tool-views/canvas-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/canvas-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/canvas-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/canvas-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/check-profile-connection/_utils.ts b/apps/frontend/src/components/thread/tool-views/check-profile-connection/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/check-profile-connection/_utils.ts rename to apps/frontend/src/components/thread/tool-views/check-profile-connection/_utils.ts diff --git a/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx b/apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx rename to apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx diff --git a/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx rename to apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx diff --git a/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx rename to apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx diff --git a/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx rename to apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx diff --git a/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx rename to apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx diff --git a/frontend/src/components/thread/tool-views/command-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/command-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/command-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/command-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx rename to apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx diff --git a/frontend/src/components/thread/tool-views/company-search-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/company-search-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/company-search-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/company-search-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/configure-agent-integration/_utils.ts b/apps/frontend/src/components/thread/tool-views/configure-agent-integration/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/configure-agent-integration/_utils.ts rename to apps/frontend/src/components/thread/tool-views/configure-agent-integration/_utils.ts diff --git a/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx b/apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx rename to apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx diff --git a/frontend/src/components/thread/tool-views/configure-profile-for-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/configure-profile-for-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/configure-profile-for-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/configure-profile-for-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/configure-profile-for-agent/configure-profile-for-agent.tsx b/apps/frontend/src/components/thread/tool-views/configure-profile-for-agent/configure-profile-for-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/configure-profile-for-agent/configure-profile-for-agent.tsx rename to apps/frontend/src/components/thread/tool-views/configure-profile-for-agent/configure-profile-for-agent.tsx diff --git a/frontend/src/components/thread/tool-views/connect-credential-profile/_utils.ts b/apps/frontend/src/components/thread/tool-views/connect-credential-profile/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/connect-credential-profile/_utils.ts rename to apps/frontend/src/components/thread/tool-views/connect-credential-profile/_utils.ts diff --git a/frontend/src/components/thread/tool-views/connect-credential-profile/connect-credential-profile.tsx b/apps/frontend/src/components/thread/tool-views/connect-credential-profile/connect-credential-profile.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/connect-credential-profile/connect-credential-profile.tsx rename to apps/frontend/src/components/thread/tool-views/connect-credential-profile/connect-credential-profile.tsx diff --git a/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/_utils.ts b/apps/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/_utils.ts rename to apps/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/_utils.ts diff --git a/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/create-agent-scheduled-trigger.tsx b/apps/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/create-agent-scheduled-trigger.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/create-agent-scheduled-trigger.tsx rename to apps/frontend/src/components/thread/tool-views/create-agent-scheduled-trigger/create-agent-scheduled-trigger.tsx diff --git a/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/create-credential-profile-for-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/create-credential-profile-for-agent.tsx b/apps/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/create-credential-profile-for-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/create-credential-profile-for-agent/create-credential-profile-for-agent.tsx rename to apps/frontend/src/components/thread/tool-views/create-credential-profile-for-agent/create-credential-profile-for-agent.tsx diff --git a/frontend/src/components/thread/tool-views/create-credential-profile/_utils.ts b/apps/frontend/src/components/thread/tool-views/create-credential-profile/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/create-credential-profile/_utils.ts rename to apps/frontend/src/components/thread/tool-views/create-credential-profile/_utils.ts diff --git a/frontend/src/components/thread/tool-views/create-credential-profile/create-credential-profile.tsx b/apps/frontend/src/components/thread/tool-views/create-credential-profile/create-credential-profile.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/create-credential-profile/create-credential-profile.tsx rename to apps/frontend/src/components/thread/tool-views/create-credential-profile/create-credential-profile.tsx diff --git a/frontend/src/components/thread/tool-views/create-event-trigger/_utils.ts b/apps/frontend/src/components/thread/tool-views/create-event-trigger/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/create-event-trigger/_utils.ts rename to apps/frontend/src/components/thread/tool-views/create-event-trigger/_utils.ts diff --git a/frontend/src/components/thread/tool-views/create-event-trigger/create-event-trigger.tsx b/apps/frontend/src/components/thread/tool-views/create-event-trigger/create-event-trigger.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/create-event-trigger/create-event-trigger.tsx rename to apps/frontend/src/components/thread/tool-views/create-event-trigger/create-event-trigger.tsx diff --git a/frontend/src/components/thread/tool-views/create-new-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/create-new-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/create-new-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/create-new-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx b/apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx rename to apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx diff --git a/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx b/apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx rename to apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx diff --git a/frontend/src/components/thread/tool-views/designer-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/designer-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/designer-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/designer-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/discover-mcp-tools-for-agent.tsx b/apps/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/discover-mcp-tools-for-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/discover-mcp-tools-for-agent.tsx rename to apps/frontend/src/components/thread/tool-views/discover-mcp-tools-for-agent/discover-mcp-tools-for-agent.tsx diff --git a/frontend/src/components/thread/tool-views/discover-user-mcp-servers/_utils.ts b/apps/frontend/src/components/thread/tool-views/discover-user-mcp-servers/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/discover-user-mcp-servers/_utils.ts rename to apps/frontend/src/components/thread/tool-views/discover-user-mcp-servers/_utils.ts diff --git a/frontend/src/components/thread/tool-views/discover-user-mcp-servers/discover-user-mcp-servers.tsx b/apps/frontend/src/components/thread/tool-views/discover-user-mcp-servers/discover-user-mcp-servers.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/discover-user-mcp-servers/discover-user-mcp-servers.tsx rename to apps/frontend/src/components/thread/tool-views/discover-user-mcp-servers/discover-user-mcp-servers.tsx diff --git a/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx b/apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx rename to apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx diff --git a/frontend/src/components/thread/tool-views/document-parser-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/document-parser-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/document-parser-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/document-parser-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx b/apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx rename to apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx diff --git a/frontend/src/components/thread/tool-views/expand-message-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/expand-message-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/expand-message-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/expand-message-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx b/apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx rename to apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx diff --git a/frontend/src/components/thread/tool-views/expose-port-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/expose-port-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/expose-port-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/expose-port-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/file-operation/FileEditToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-operation/FileEditToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/file-operation/FileEditToolView.tsx rename to apps/frontend/src/components/thread/tool-views/file-operation/FileEditToolView.tsx diff --git a/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx rename to apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx diff --git a/frontend/src/components/thread/tool-views/file-operation/_utils.ts b/apps/frontend/src/components/thread/tool-views/file-operation/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/file-operation/_utils.ts rename to apps/frontend/src/components/thread/tool-views/file-operation/_utils.ts diff --git a/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx rename to apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx diff --git a/frontend/src/components/thread/tool-views/file-reader-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/file-reader-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/file-reader-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/file-reader-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/get-app-details/_utils.ts b/apps/frontend/src/components/thread/tool-views/get-app-details/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/get-app-details/_utils.ts rename to apps/frontend/src/components/thread/tool-views/get-app-details/_utils.ts diff --git a/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx b/apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx rename to apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx diff --git a/frontend/src/components/thread/tool-views/get-credential-profiles/_utils.ts b/apps/frontend/src/components/thread/tool-views/get-credential-profiles/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/get-credential-profiles/_utils.ts rename to apps/frontend/src/components/thread/tool-views/get-credential-profiles/_utils.ts diff --git a/frontend/src/components/thread/tool-views/get-credential-profiles/get-credential-profiles.tsx b/apps/frontend/src/components/thread/tool-views/get-credential-profiles/get-credential-profiles.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/get-credential-profiles/get-credential-profiles.tsx rename to apps/frontend/src/components/thread/tool-views/get-credential-profiles/get-credential-profiles.tsx diff --git a/frontend/src/components/thread/tool-views/get-current-agent-config/_utils.ts b/apps/frontend/src/components/thread/tool-views/get-current-agent-config/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/get-current-agent-config/_utils.ts rename to apps/frontend/src/components/thread/tool-views/get-current-agent-config/_utils.ts diff --git a/frontend/src/components/thread/tool-views/get-current-agent-config/get-current-agent-config.tsx b/apps/frontend/src/components/thread/tool-views/get-current-agent-config/get-current-agent-config.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/get-current-agent-config/get-current-agent-config.tsx rename to apps/frontend/src/components/thread/tool-views/get-current-agent-config/get-current-agent-config.tsx diff --git a/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx b/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx rename to apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx diff --git a/frontend/src/components/thread/tool-views/image-edit-generate-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/image-edit-generate-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/list-app-event-triggers/_utils.ts b/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/list-app-event-triggers/_utils.ts rename to apps/frontend/src/components/thread/tool-views/list-app-event-triggers/_utils.ts diff --git a/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx b/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx rename to apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx diff --git a/frontend/src/components/thread/tool-views/mcp-content-renderer.tsx b/apps/frontend/src/components/thread/tool-views/mcp-content-renderer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/mcp-content-renderer.tsx rename to apps/frontend/src/components/thread/tool-views/mcp-content-renderer.tsx diff --git a/frontend/src/components/thread/tool-views/mcp-format-detector.ts b/apps/frontend/src/components/thread/tool-views/mcp-format-detector.ts similarity index 100% rename from frontend/src/components/thread/tool-views/mcp-format-detector.ts rename to apps/frontend/src/components/thread/tool-views/mcp-format-detector.ts diff --git a/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx rename to apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx diff --git a/frontend/src/components/thread/tool-views/people-search-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/people-search-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/people-search-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/people-search-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideCard.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideCard.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideCard.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideCard.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx diff --git a/frontend/src/components/thread/tool-views/presentation-tools/PresentationViewer.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationViewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/presentation-tools/PresentationViewer.tsx rename to apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationViewer.tsx diff --git a/frontend/src/components/thread/tool-views/reality-defender-tool/RealityDefenderToolView.tsx b/apps/frontend/src/components/thread/tool-views/reality-defender-tool/RealityDefenderToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/reality-defender-tool/RealityDefenderToolView.tsx rename to apps/frontend/src/components/thread/tool-views/reality-defender-tool/RealityDefenderToolView.tsx diff --git a/frontend/src/components/thread/tool-views/reality-defender-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/reality-defender-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/reality-defender-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/reality-defender-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/search-mcp-servers-for-agent.tsx b/apps/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/search-mcp-servers-for-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/search-mcp-servers-for-agent.tsx rename to apps/frontend/src/components/thread/tool-views/search-mcp-servers-for-agent/search-mcp-servers-for-agent.tsx diff --git a/frontend/src/components/thread/tool-views/search-mcp-servers/_utils.ts b/apps/frontend/src/components/thread/tool-views/search-mcp-servers/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/search-mcp-servers/_utils.ts rename to apps/frontend/src/components/thread/tool-views/search-mcp-servers/_utils.ts diff --git a/frontend/src/components/thread/tool-views/search-mcp-servers/search-mcp-servers.tsx b/apps/frontend/src/components/thread/tool-views/search-mcp-servers/search-mcp-servers.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/search-mcp-servers/search-mcp-servers.tsx rename to apps/frontend/src/components/thread/tool-views/search-mcp-servers/search-mcp-servers.tsx diff --git a/frontend/src/components/thread/tool-views/see-image-tool/SeeImageToolView.tsx b/apps/frontend/src/components/thread/tool-views/see-image-tool/SeeImageToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/see-image-tool/SeeImageToolView.tsx rename to apps/frontend/src/components/thread/tool-views/see-image-tool/SeeImageToolView.tsx diff --git a/frontend/src/components/thread/tool-views/see-image-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/see-image-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/see-image-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/see-image-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/shared/AppIcon.tsx b/apps/frontend/src/components/thread/tool-views/shared/AppIcon.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/AppIcon.tsx rename to apps/frontend/src/components/thread/tool-views/shared/AppIcon.tsx diff --git a/frontend/src/components/thread/tool-views/shared/FileDownloadButton.tsx b/apps/frontend/src/components/thread/tool-views/shared/FileDownloadButton.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/FileDownloadButton.tsx rename to apps/frontend/src/components/thread/tool-views/shared/FileDownloadButton.tsx diff --git a/frontend/src/components/thread/tool-views/shared/ImageLoader.tsx b/apps/frontend/src/components/thread/tool-views/shared/ImageLoader.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/ImageLoader.tsx rename to apps/frontend/src/components/thread/tool-views/shared/ImageLoader.tsx diff --git a/frontend/src/components/thread/tool-views/shared/JsonViewer.tsx b/apps/frontend/src/components/thread/tool-views/shared/JsonViewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/JsonViewer.tsx rename to apps/frontend/src/components/thread/tool-views/shared/JsonViewer.tsx diff --git a/frontend/src/components/thread/tool-views/shared/LoadingState.tsx b/apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/LoadingState.tsx rename to apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx diff --git a/frontend/src/components/thread/tool-views/shared/SmartJsonViewer.tsx b/apps/frontend/src/components/thread/tool-views/shared/SmartJsonViewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/SmartJsonViewer.tsx rename to apps/frontend/src/components/thread/tool-views/shared/SmartJsonViewer.tsx diff --git a/frontend/src/components/thread/tool-views/shared/TaskCompletedFeedback.tsx b/apps/frontend/src/components/thread/tool-views/shared/TaskCompletedFeedback.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/shared/TaskCompletedFeedback.tsx rename to apps/frontend/src/components/thread/tool-views/shared/TaskCompletedFeedback.tsx diff --git a/frontend/src/components/thread/tool-views/sheets-tools/luckysheet-viewer.tsx b/apps/frontend/src/components/thread/tool-views/sheets-tools/luckysheet-viewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/sheets-tools/luckysheet-viewer.tsx rename to apps/frontend/src/components/thread/tool-views/sheets-tools/luckysheet-viewer.tsx diff --git a/frontend/src/components/thread/tool-views/sheets-tools/sheets-tool-view.tsx b/apps/frontend/src/components/thread/tool-views/sheets-tools/sheets-tool-view.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/sheets-tools/sheets-tool-view.tsx rename to apps/frontend/src/components/thread/tool-views/sheets-tools/sheets-tool-view.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetLoader.tsx b/apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetLoader.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetLoader.tsx rename to apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetLoader.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetSimulation.tsx b/apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetSimulation.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetSimulation.tsx rename to apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetSimulation.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetToolview.tsx b/apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetToolview.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetToolview.tsx rename to apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetToolview.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetViewer.tsx b/apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetViewer.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetViewer.tsx rename to apps/frontend/src/components/thread/tool-views/spreadsheet/SpreadsheetViewer.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/SyncStatusIndicator.tsx b/apps/frontend/src/components/thread/tool-views/spreadsheet/SyncStatusIndicator.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/SyncStatusIndicator.tsx rename to apps/frontend/src/components/thread/tool-views/spreadsheet/SyncStatusIndicator.tsx diff --git a/frontend/src/components/thread/tool-views/spreadsheet/_utils.ts b/apps/frontend/src/components/thread/tool-views/spreadsheet/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/_utils.ts rename to apps/frontend/src/components/thread/tool-views/spreadsheet/_utils.ts diff --git a/frontend/src/components/thread/tool-views/spreadsheet/kortix-spreadsheet-styles.css b/apps/frontend/src/components/thread/tool-views/spreadsheet/kortix-spreadsheet-styles.css similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/kortix-spreadsheet-styles.css rename to apps/frontend/src/components/thread/tool-views/spreadsheet/kortix-spreadsheet-styles.css diff --git a/frontend/src/components/thread/tool-views/spreadsheet/useSpreadsheetSync.ts b/apps/frontend/src/components/thread/tool-views/spreadsheet/useSpreadsheetSync.ts similarity index 100% rename from frontend/src/components/thread/tool-views/spreadsheet/useSpreadsheetSync.ts rename to apps/frontend/src/components/thread/tool-views/spreadsheet/useSpreadsheetSync.ts diff --git a/frontend/src/components/thread/tool-views/task-list/TaskListToolView.tsx b/apps/frontend/src/components/thread/tool-views/task-list/TaskListToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/task-list/TaskListToolView.tsx rename to apps/frontend/src/components/thread/tool-views/task-list/TaskListToolView.tsx diff --git a/frontend/src/components/thread/tool-views/task-list/_utils.ts b/apps/frontend/src/components/thread/tool-views/task-list/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/task-list/_utils.ts rename to apps/frontend/src/components/thread/tool-views/task-list/_utils.ts diff --git a/frontend/src/components/thread/tool-views/tool-result-parser.ts b/apps/frontend/src/components/thread/tool-views/tool-result-parser.ts similarity index 100% rename from frontend/src/components/thread/tool-views/tool-result-parser.ts rename to apps/frontend/src/components/thread/tool-views/tool-result-parser.ts diff --git a/frontend/src/components/thread/tool-views/types.ts b/apps/frontend/src/components/thread/tool-views/types.ts similarity index 100% rename from frontend/src/components/thread/tool-views/types.ts rename to apps/frontend/src/components/thread/tool-views/types.ts diff --git a/frontend/src/components/thread/tool-views/update-agent/_utils.ts b/apps/frontend/src/components/thread/tool-views/update-agent/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/update-agent/_utils.ts rename to apps/frontend/src/components/thread/tool-views/update-agent/_utils.ts diff --git a/frontend/src/components/thread/tool-views/update-agent/update-agent.tsx b/apps/frontend/src/components/thread/tool-views/update-agent/update-agent.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/update-agent/update-agent.tsx rename to apps/frontend/src/components/thread/tool-views/update-agent/update-agent.tsx diff --git a/frontend/src/components/thread/tool-views/utils.ts b/apps/frontend/src/components/thread/tool-views/utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/utils.ts rename to apps/frontend/src/components/thread/tool-views/utils.ts diff --git a/frontend/src/components/thread/tool-views/utils/presentation-utils.ts b/apps/frontend/src/components/thread/tool-views/utils/presentation-utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/utils/presentation-utils.ts rename to apps/frontend/src/components/thread/tool-views/utils/presentation-utils.ts diff --git a/frontend/src/components/thread/tool-views/vapi-call/CallStatusToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/CallStatusToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/CallStatusToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/CallStatusToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/EndCallToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/EndCallToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/EndCallToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/EndCallToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/ListCallsToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/ListCallsToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/ListCallsToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/ListCallsToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/MakeCallToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/MakeCallToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/MakeCallToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/MakeCallToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/MonitorCallToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/MonitorCallToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/MonitorCallToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/MonitorCallToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/WaitForCallCompletionToolView.tsx b/apps/frontend/src/components/thread/tool-views/vapi-call/WaitForCallCompletionToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/WaitForCallCompletionToolView.tsx rename to apps/frontend/src/components/thread/tool-views/vapi-call/WaitForCallCompletionToolView.tsx diff --git a/frontend/src/components/thread/tool-views/vapi-call/_utils.ts b/apps/frontend/src/components/thread/tool-views/vapi-call/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/vapi-call/_utils.ts rename to apps/frontend/src/components/thread/tool-views/vapi-call/_utils.ts diff --git a/frontend/src/components/thread/tool-views/wait-tool/WaitToolView.tsx b/apps/frontend/src/components/thread/tool-views/wait-tool/WaitToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/wait-tool/WaitToolView.tsx rename to apps/frontend/src/components/thread/tool-views/wait-tool/WaitToolView.tsx diff --git a/frontend/src/components/thread/tool-views/web-dev/GetProjectStructureView.tsx b/apps/frontend/src/components/thread/tool-views/web-dev/GetProjectStructureView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/web-dev/GetProjectStructureView.tsx rename to apps/frontend/src/components/thread/tool-views/web-dev/GetProjectStructureView.tsx diff --git a/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx b/apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx rename to apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx diff --git a/frontend/src/components/thread/tool-views/web-scrape-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/web-scrape-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/web-scrape-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/web-scrape-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx similarity index 98% rename from frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx rename to apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx index 58d5ec4658..5172affd24 100644 --- a/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx @@ -53,15 +53,6 @@ export function WebSearchToolView({ assistantTimestamp ); - // Log the extracted data for debugging - console.log('[WebSearchToolView] Data:', { - query, - isBatch, - batchResultsLength: batchResults?.length, - currentQueryIndex, - searchResultsLength: searchResults?.length - }); - // Reset to first query when batch results change useEffect(() => { if (isBatch && batchResults && batchResults.length > 0) { @@ -158,7 +149,7 @@ export function WebSearchToolView({ iconColor="text-blue-500 dark:text-blue-400" bgColor="bg-gradient-to-b from-blue-100 to-blue-50 shadow-inner dark:from-blue-800/40 dark:to-blue-900/60 dark:shadow-blue-950/20" title={name === 'image-search' ? "Searching for images" : "Searching the web"} - filePath={query} + filePath={typeof query === 'string' ? query : undefined} showProgress={true} /> ) : searchResults.length > 0 || answer || images.length > 0 ? ( diff --git a/frontend/src/components/thread/tool-views/web-search-tool/_utils.ts b/apps/frontend/src/components/thread/tool-views/web-search-tool/_utils.ts similarity index 100% rename from frontend/src/components/thread/tool-views/web-search-tool/_utils.ts rename to apps/frontend/src/components/thread/tool-views/web-search-tool/_utils.ts diff --git a/frontend/src/components/thread/tool-views/wrapper/ToolViewRegistry.tsx b/apps/frontend/src/components/thread/tool-views/wrapper/ToolViewRegistry.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/wrapper/ToolViewRegistry.tsx rename to apps/frontend/src/components/thread/tool-views/wrapper/ToolViewRegistry.tsx diff --git a/frontend/src/components/thread/tool-views/wrapper/ToolViewWrapper.tsx b/apps/frontend/src/components/thread/tool-views/wrapper/ToolViewWrapper.tsx similarity index 100% rename from frontend/src/components/thread/tool-views/wrapper/ToolViewWrapper.tsx rename to apps/frontend/src/components/thread/tool-views/wrapper/ToolViewWrapper.tsx diff --git a/frontend/src/components/thread/tool-views/wrapper/index.ts b/apps/frontend/src/components/thread/tool-views/wrapper/index.ts similarity index 100% rename from frontend/src/components/thread/tool-views/wrapper/index.ts rename to apps/frontend/src/components/thread/tool-views/wrapper/index.ts diff --git a/frontend/src/components/thread/tool-views/xml-parser.ts b/apps/frontend/src/components/thread/tool-views/xml-parser.ts similarity index 100% rename from frontend/src/components/thread/tool-views/xml-parser.ts rename to apps/frontend/src/components/thread/tool-views/xml-parser.ts diff --git a/frontend/src/components/thread/types.ts b/apps/frontend/src/components/thread/types.ts similarity index 100% rename from frontend/src/components/thread/types.ts rename to apps/frontend/src/components/thread/types.ts diff --git a/apps/frontend/src/components/thread/utils.ts b/apps/frontend/src/components/thread/utils.ts new file mode 100644 index 0000000000..a87042cb1e --- /dev/null +++ b/apps/frontend/src/components/thread/utils.ts @@ -0,0 +1,150 @@ +/** + * Thread utilities for rendering tool calls and messages + * Re-exports from @agentpress/shared plus frontend-specific utilities + */ + +// Re-export shared utilities +export { + safeJsonParse, + getUserFriendlyToolName, + extractAppSlugFromToolCall, + HIDE_STREAMING_XML_TAGS, +} from '@agentpress/shared'; + +// Re-export getToolIcon from frontend icon resolver +export { getToolIcon } from '@/lib/icons/tool-icons'; + +// Frontend-specific flags +export const SHOULD_RENDER_TOOL_RESULTS = false; +export const HIDE_BROWSER_TAB = true; + +/** + * Extract a primary parameter from tool call arguments for display + * Frontend-specific implementation + */ +export const extractPrimaryParam = ( + toolName: string, + content: string | undefined, +): string | null => { + if (!content) return null; + + try { + const parsed = JSON.parse(content); + + if (parsed.query) { + const query = Array.isArray(parsed.query) ? parsed.query[0] : parsed.query; + return query.length > 30 ? query.substring(0, 27) + '...' : query; + } + if (parsed.arguments?.query) { + const query = Array.isArray(parsed.arguments.query) ? parsed.arguments.query[0] : parsed.arguments.query; + return query.length > 30 ? query.substring(0, 27) + '...' : query; + } + + if (toolName?.toLowerCase().startsWith('browser_')) { + if (parsed.url) return parsed.url; + if (parsed.arguments?.url) return parsed.arguments.url; + if (parsed.goal) { + const goal = parsed.goal; + return goal.length > 30 ? goal.substring(0, 27) + '...' : goal; + } + return null; + } + + if (parsed.file_path) { + const path = parsed.file_path; + return typeof path === 'string' ? path.split('/').pop() || path : null; + } + if (parsed.arguments?.file_path) { + const path = parsed.arguments.file_path; + return typeof path === 'string' ? path.split('/').pop() || path : null; + } + + if (toolName?.toLowerCase() === 'execute-command') { + if (parsed.command) { + const cmd = parsed.command; + return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; + } + if (parsed.arguments?.command) { + const cmd = parsed.arguments.command; + return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; + } + } + } catch { + // Fallback to regex extraction + } + + // Regex fallback for plain text content + try { + if (toolName?.toLowerCase().startsWith('browser_')) { + const urlMatch = content.match(/url["']?\s*[:=]\s*["']?([^"'\s]+)/i); + if (urlMatch) return urlMatch[1]; + + const goalMatch = content.match(/goal["']?\s*[:=]\s*["']?([^"'\s]+)/i); + if (goalMatch) { + const goal = goalMatch[1]; + return goal.length > 30 ? goal.substring(0, 27) + '...' : goal; + } + return null; + } + + const filePathMatch = content.match(/file_path["']?\s*[:=]\s*["']?([^"'\s]+)/i); + if (filePathMatch) { + const path = filePathMatch[1]; + return path.split('/').pop() || path; + } + + if (toolName?.toLowerCase() === 'execute-command') { + const commandMatch = content.match(/(?:command|cmd)["']?\s*[:=]\s*["']?([^"'\n]+)/i); + if (commandMatch) { + const cmd = commandMatch[1]; + return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; + } + } + } catch { + // Continue + } + + // Tool-specific extraction + let match: RegExpMatchArray | null = null; + + switch (toolName?.toLowerCase()) { + case 'create-file': + case 'full-file-rewrite': + case 'read-file': + case 'delete-file': + case 'str-replace': + match = content.match(/file_path["']?\s*[:=]\s*["']?([^"'\s]+)/i); + return match ? match[1].split('/').pop() || match[1] : null; + case 'edit-file': + match = content.match(/target_file["']?\s*[:=]\s*["']?([^"'\s]+)/i); + return match ? (match[1].split('/').pop() || match[1]).trim() : null; + + case 'execute-command': + match = content.match(/(?:command|cmd)["']?\s*[:=]\s*["']?([^"'\n]+)/i); + if (match) { + const cmd = match[1]; + return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; + } + return null; + + case 'web-search': + case 'image-search': + match = content.match(/query["']?\s*[:=]\s*["']?([^"'\s]+)/i); + return match + ? match[1].length > 30 + ? match[1].substring(0, 27) + '...' + : match[1] + : null; + + case 'call-data-provider': + match = content.match(/service_name["']?\s*[:=]\s*["']?([^"'\s]+)/i); + const route = content.match(/route["']?\s*[:=]\s*["']?([^"'\s]+)/i); + return match && route + ? `${match[1]}/${route[1]}` + : match + ? match[1] + : null; + } + + return null; +}; diff --git a/frontend/src/components/triggers/simplified-trigger-detail-panel.tsx b/apps/frontend/src/components/triggers/simplified-trigger-detail-panel.tsx similarity index 100% rename from frontend/src/components/triggers/simplified-trigger-detail-panel.tsx rename to apps/frontend/src/components/triggers/simplified-trigger-detail-panel.tsx diff --git a/frontend/src/components/triggers/trigger-creation-dialog.tsx b/apps/frontend/src/components/triggers/trigger-creation-dialog.tsx similarity index 100% rename from frontend/src/components/triggers/trigger-creation-dialog.tsx rename to apps/frontend/src/components/triggers/trigger-creation-dialog.tsx diff --git a/frontend/src/components/triggers/triggers-page-header.tsx b/apps/frontend/src/components/triggers/triggers-page-header.tsx similarity index 100% rename from frontend/src/components/triggers/triggers-page-header.tsx rename to apps/frontend/src/components/triggers/triggers-page-header.tsx diff --git a/frontend/src/components/triggers/triggers-page.tsx b/apps/frontend/src/components/triggers/triggers-page.tsx similarity index 100% rename from frontend/src/components/triggers/triggers-page.tsx rename to apps/frontend/src/components/triggers/triggers-page.tsx diff --git a/frontend/src/components/ui/accordion.tsx b/apps/frontend/src/components/ui/accordion.tsx similarity index 100% rename from frontend/src/components/ui/accordion.tsx rename to apps/frontend/src/components/ui/accordion.tsx diff --git a/frontend/src/components/ui/alert-dialog.tsx b/apps/frontend/src/components/ui/alert-dialog.tsx similarity index 100% rename from frontend/src/components/ui/alert-dialog.tsx rename to apps/frontend/src/components/ui/alert-dialog.tsx diff --git a/frontend/src/components/ui/alert.tsx b/apps/frontend/src/components/ui/alert.tsx similarity index 100% rename from frontend/src/components/ui/alert.tsx rename to apps/frontend/src/components/ui/alert.tsx diff --git a/frontend/src/components/ui/animated-bg.tsx b/apps/frontend/src/components/ui/animated-bg.tsx similarity index 100% rename from frontend/src/components/ui/animated-bg.tsx rename to apps/frontend/src/components/ui/animated-bg.tsx diff --git a/frontend/src/components/ui/animated-shiny-text.tsx b/apps/frontend/src/components/ui/animated-shiny-text.tsx similarity index 100% rename from frontend/src/components/ui/animated-shiny-text.tsx rename to apps/frontend/src/components/ui/animated-shiny-text.tsx diff --git a/frontend/src/components/ui/avatar.tsx b/apps/frontend/src/components/ui/avatar.tsx similarity index 100% rename from frontend/src/components/ui/avatar.tsx rename to apps/frontend/src/components/ui/avatar.tsx diff --git a/frontend/src/components/ui/badge.tsx b/apps/frontend/src/components/ui/badge.tsx similarity index 100% rename from frontend/src/components/ui/badge.tsx rename to apps/frontend/src/components/ui/badge.tsx diff --git a/frontend/src/components/ui/border-beam.tsx b/apps/frontend/src/components/ui/border-beam.tsx similarity index 100% rename from frontend/src/components/ui/border-beam.tsx rename to apps/frontend/src/components/ui/border-beam.tsx diff --git a/frontend/src/components/ui/breadcrumb.tsx b/apps/frontend/src/components/ui/breadcrumb.tsx similarity index 100% rename from frontend/src/components/ui/breadcrumb.tsx rename to apps/frontend/src/components/ui/breadcrumb.tsx diff --git a/frontend/src/components/ui/button.tsx b/apps/frontend/src/components/ui/button.tsx similarity index 100% rename from frontend/src/components/ui/button.tsx rename to apps/frontend/src/components/ui/button.tsx diff --git a/frontend/src/components/ui/calendar.tsx b/apps/frontend/src/components/ui/calendar.tsx similarity index 100% rename from frontend/src/components/ui/calendar.tsx rename to apps/frontend/src/components/ui/calendar.tsx diff --git a/frontend/src/components/ui/card.tsx b/apps/frontend/src/components/ui/card.tsx similarity index 100% rename from frontend/src/components/ui/card.tsx rename to apps/frontend/src/components/ui/card.tsx diff --git a/frontend/src/components/ui/checkbox.tsx b/apps/frontend/src/components/ui/checkbox.tsx similarity index 100% rename from frontend/src/components/ui/checkbox.tsx rename to apps/frontend/src/components/ui/checkbox.tsx diff --git a/frontend/src/components/ui/code-block.tsx b/apps/frontend/src/components/ui/code-block.tsx similarity index 100% rename from frontend/src/components/ui/code-block.tsx rename to apps/frontend/src/components/ui/code-block.tsx diff --git a/frontend/src/components/ui/collapsible.tsx b/apps/frontend/src/components/ui/collapsible.tsx similarity index 100% rename from frontend/src/components/ui/collapsible.tsx rename to apps/frontend/src/components/ui/collapsible.tsx diff --git a/frontend/src/components/ui/command.tsx b/apps/frontend/src/components/ui/command.tsx similarity index 100% rename from frontend/src/components/ui/command.tsx rename to apps/frontend/src/components/ui/command.tsx diff --git a/frontend/src/components/ui/context-menu.tsx b/apps/frontend/src/components/ui/context-menu.tsx similarity index 100% rename from frontend/src/components/ui/context-menu.tsx rename to apps/frontend/src/components/ui/context-menu.tsx diff --git a/frontend/src/components/ui/csv-table.tsx b/apps/frontend/src/components/ui/csv-table.tsx similarity index 100% rename from frontend/src/components/ui/csv-table.tsx rename to apps/frontend/src/components/ui/csv-table.tsx diff --git a/frontend/src/components/ui/data-table.tsx b/apps/frontend/src/components/ui/data-table.tsx similarity index 100% rename from frontend/src/components/ui/data-table.tsx rename to apps/frontend/src/components/ui/data-table.tsx diff --git a/frontend/src/components/ui/date-range-picker.tsx b/apps/frontend/src/components/ui/date-range-picker.tsx similarity index 100% rename from frontend/src/components/ui/date-range-picker.tsx rename to apps/frontend/src/components/ui/date-range-picker.tsx diff --git a/frontend/src/components/ui/dialog.tsx b/apps/frontend/src/components/ui/dialog.tsx similarity index 100% rename from frontend/src/components/ui/dialog.tsx rename to apps/frontend/src/components/ui/dialog.tsx diff --git a/frontend/src/components/ui/drawer.tsx b/apps/frontend/src/components/ui/drawer.tsx similarity index 100% rename from frontend/src/components/ui/drawer.tsx rename to apps/frontend/src/components/ui/drawer.tsx diff --git a/frontend/src/components/ui/dropdown-menu.tsx b/apps/frontend/src/components/ui/dropdown-menu.tsx similarity index 100% rename from frontend/src/components/ui/dropdown-menu.tsx rename to apps/frontend/src/components/ui/dropdown-menu.tsx diff --git a/frontend/src/components/ui/dynamic-greeting.tsx b/apps/frontend/src/components/ui/dynamic-greeting.tsx similarity index 100% rename from frontend/src/components/ui/dynamic-greeting.tsx rename to apps/frontend/src/components/ui/dynamic-greeting.tsx diff --git a/frontend/src/components/ui/editable-markdown.tsx b/apps/frontend/src/components/ui/editable-markdown.tsx similarity index 100% rename from frontend/src/components/ui/editable-markdown.tsx rename to apps/frontend/src/components/ui/editable-markdown.tsx diff --git a/frontend/src/components/ui/editable.tsx b/apps/frontend/src/components/ui/editable.tsx similarity index 100% rename from frontend/src/components/ui/editable.tsx rename to apps/frontend/src/components/ui/editable.tsx diff --git a/frontend/src/components/ui/expandable-markdown-editor.tsx b/apps/frontend/src/components/ui/expandable-markdown-editor.tsx similarity index 100% rename from frontend/src/components/ui/expandable-markdown-editor.tsx rename to apps/frontend/src/components/ui/expandable-markdown-editor.tsx diff --git a/frontend/src/components/ui/fancy-tabs.tsx b/apps/frontend/src/components/ui/fancy-tabs.tsx similarity index 100% rename from frontend/src/components/ui/fancy-tabs.tsx rename to apps/frontend/src/components/ui/fancy-tabs.tsx diff --git a/frontend/src/components/ui/flickering-grid.tsx b/apps/frontend/src/components/ui/flickering-grid.tsx similarity index 100% rename from frontend/src/components/ui/flickering-grid.tsx rename to apps/frontend/src/components/ui/flickering-grid.tsx diff --git a/frontend/src/components/ui/form.tsx b/apps/frontend/src/components/ui/form.tsx similarity index 100% rename from frontend/src/components/ui/form.tsx rename to apps/frontend/src/components/ui/form.tsx diff --git a/frontend/src/components/ui/grain-icon.tsx b/apps/frontend/src/components/ui/grain-icon.tsx similarity index 100% rename from frontend/src/components/ui/grain-icon.tsx rename to apps/frontend/src/components/ui/grain-icon.tsx diff --git a/frontend/src/components/ui/grain-text.tsx b/apps/frontend/src/components/ui/grain-text.tsx similarity index 100% rename from frontend/src/components/ui/grain-text.tsx rename to apps/frontend/src/components/ui/grain-text.tsx diff --git a/frontend/src/components/ui/icons/slack.tsx b/apps/frontend/src/components/ui/icons/slack.tsx similarity index 100% rename from frontend/src/components/ui/icons/slack.tsx rename to apps/frontend/src/components/ui/icons/slack.tsx diff --git a/frontend/src/components/ui/input.tsx b/apps/frontend/src/components/ui/input.tsx similarity index 100% rename from frontend/src/components/ui/input.tsx rename to apps/frontend/src/components/ui/input.tsx diff --git a/frontend/src/components/ui/kbd.tsx b/apps/frontend/src/components/ui/kbd.tsx similarity index 100% rename from frontend/src/components/ui/kbd.tsx rename to apps/frontend/src/components/ui/kbd.tsx diff --git a/frontend/src/components/ui/kortix-loader.tsx b/apps/frontend/src/components/ui/kortix-loader.tsx similarity index 100% rename from frontend/src/components/ui/kortix-loader.tsx rename to apps/frontend/src/components/ui/kortix-loader.tsx diff --git a/frontend/src/components/ui/label.tsx b/apps/frontend/src/components/ui/label.tsx similarity index 100% rename from frontend/src/components/ui/label.tsx rename to apps/frontend/src/components/ui/label.tsx diff --git a/frontend/src/components/ui/mermaid-renderer.tsx b/apps/frontend/src/components/ui/mermaid-renderer.tsx similarity index 100% rename from frontend/src/components/ui/mermaid-renderer.tsx rename to apps/frontend/src/components/ui/mermaid-renderer.tsx diff --git a/frontend/src/components/ui/page-header.tsx b/apps/frontend/src/components/ui/page-header.tsx similarity index 100% rename from frontend/src/components/ui/page-header.tsx rename to apps/frontend/src/components/ui/page-header.tsx diff --git a/frontend/src/components/ui/phone-input.tsx b/apps/frontend/src/components/ui/phone-input.tsx similarity index 100% rename from frontend/src/components/ui/phone-input.tsx rename to apps/frontend/src/components/ui/phone-input.tsx diff --git a/frontend/src/components/ui/pixel-art-editor.tsx b/apps/frontend/src/components/ui/pixel-art-editor.tsx similarity index 100% rename from frontend/src/components/ui/pixel-art-editor.tsx rename to apps/frontend/src/components/ui/pixel-art-editor.tsx diff --git a/frontend/src/components/ui/pixel-avatar.tsx b/apps/frontend/src/components/ui/pixel-avatar.tsx similarity index 100% rename from frontend/src/components/ui/pixel-avatar.tsx rename to apps/frontend/src/components/ui/pixel-avatar.tsx diff --git a/frontend/src/components/ui/popover.tsx b/apps/frontend/src/components/ui/popover.tsx similarity index 100% rename from frontend/src/components/ui/popover.tsx rename to apps/frontend/src/components/ui/popover.tsx diff --git a/frontend/src/components/ui/portal.tsx b/apps/frontend/src/components/ui/portal.tsx similarity index 100% rename from frontend/src/components/ui/portal.tsx rename to apps/frontend/src/components/ui/portal.tsx diff --git a/frontend/src/components/ui/progress.tsx b/apps/frontend/src/components/ui/progress.tsx similarity index 100% rename from frontend/src/components/ui/progress.tsx rename to apps/frontend/src/components/ui/progress.tsx diff --git a/frontend/src/components/ui/radio-group.tsx b/apps/frontend/src/components/ui/radio-group.tsx similarity index 100% rename from frontend/src/components/ui/radio-group.tsx rename to apps/frontend/src/components/ui/radio-group.tsx diff --git a/frontend/src/components/ui/resizable.tsx b/apps/frontend/src/components/ui/resizable.tsx similarity index 100% rename from frontend/src/components/ui/resizable.tsx rename to apps/frontend/src/components/ui/resizable.tsx diff --git a/frontend/src/components/ui/ripple.tsx b/apps/frontend/src/components/ui/ripple.tsx similarity index 100% rename from frontend/src/components/ui/ripple.tsx rename to apps/frontend/src/components/ui/ripple.tsx diff --git a/frontend/src/components/ui/scroll-area.tsx b/apps/frontend/src/components/ui/scroll-area.tsx similarity index 100% rename from frontend/src/components/ui/scroll-area.tsx rename to apps/frontend/src/components/ui/scroll-area.tsx diff --git a/frontend/src/components/ui/select.tsx b/apps/frontend/src/components/ui/select.tsx similarity index 100% rename from frontend/src/components/ui/select.tsx rename to apps/frontend/src/components/ui/select.tsx diff --git a/frontend/src/components/ui/separator.tsx b/apps/frontend/src/components/ui/separator.tsx similarity index 100% rename from frontend/src/components/ui/separator.tsx rename to apps/frontend/src/components/ui/separator.tsx diff --git a/frontend/src/components/ui/shadcn-io/code-block/index.tsx b/apps/frontend/src/components/ui/shadcn-io/code-block/index.tsx similarity index 100% rename from frontend/src/components/ui/shadcn-io/code-block/index.tsx rename to apps/frontend/src/components/ui/shadcn-io/code-block/index.tsx diff --git a/frontend/src/components/ui/shadcn-io/code-block/server.tsx b/apps/frontend/src/components/ui/shadcn-io/code-block/server.tsx similarity index 100% rename from frontend/src/components/ui/shadcn-io/code-block/server.tsx rename to apps/frontend/src/components/ui/shadcn-io/code-block/server.tsx diff --git a/frontend/src/components/ui/sheet.tsx b/apps/frontend/src/components/ui/sheet.tsx similarity index 100% rename from frontend/src/components/ui/sheet.tsx rename to apps/frontend/src/components/ui/sheet.tsx diff --git a/frontend/src/components/ui/shiny-text.tsx b/apps/frontend/src/components/ui/shiny-text.tsx similarity index 100% rename from frontend/src/components/ui/shiny-text.tsx rename to apps/frontend/src/components/ui/shiny-text.tsx diff --git a/frontend/src/components/ui/sidebar.tsx b/apps/frontend/src/components/ui/sidebar.tsx similarity index 100% rename from frontend/src/components/ui/sidebar.tsx rename to apps/frontend/src/components/ui/sidebar.tsx diff --git a/frontend/src/components/ui/skeleton.tsx b/apps/frontend/src/components/ui/skeleton.tsx similarity index 100% rename from frontend/src/components/ui/skeleton.tsx rename to apps/frontend/src/components/ui/skeleton.tsx diff --git a/frontend/src/components/ui/slider.tsx b/apps/frontend/src/components/ui/slider.tsx similarity index 100% rename from frontend/src/components/ui/slider.tsx rename to apps/frontend/src/components/ui/slider.tsx diff --git a/frontend/src/components/ui/sonner.tsx b/apps/frontend/src/components/ui/sonner.tsx similarity index 100% rename from frontend/src/components/ui/sonner.tsx rename to apps/frontend/src/components/ui/sonner.tsx diff --git a/frontend/src/components/ui/spotlight-card.tsx b/apps/frontend/src/components/ui/spotlight-card.tsx similarity index 100% rename from frontend/src/components/ui/spotlight-card.tsx rename to apps/frontend/src/components/ui/spotlight-card.tsx diff --git a/frontend/src/components/ui/status-overlay.tsx b/apps/frontend/src/components/ui/status-overlay.tsx similarity index 100% rename from frontend/src/components/ui/status-overlay.tsx rename to apps/frontend/src/components/ui/status-overlay.tsx diff --git a/frontend/src/components/ui/submit-button.tsx b/apps/frontend/src/components/ui/submit-button.tsx similarity index 100% rename from frontend/src/components/ui/submit-button.tsx rename to apps/frontend/src/components/ui/submit-button.tsx diff --git a/frontend/src/components/ui/switch.tsx b/apps/frontend/src/components/ui/switch.tsx similarity index 100% rename from frontend/src/components/ui/switch.tsx rename to apps/frontend/src/components/ui/switch.tsx diff --git a/frontend/src/components/ui/table.tsx b/apps/frontend/src/components/ui/table.tsx similarity index 100% rename from frontend/src/components/ui/table.tsx rename to apps/frontend/src/components/ui/table.tsx diff --git a/frontend/src/components/ui/tabs.tsx b/apps/frontend/src/components/ui/tabs.tsx similarity index 100% rename from frontend/src/components/ui/tabs.tsx rename to apps/frontend/src/components/ui/tabs.tsx diff --git a/frontend/src/components/ui/tag-input.tsx b/apps/frontend/src/components/ui/tag-input.tsx similarity index 100% rename from frontend/src/components/ui/tag-input.tsx rename to apps/frontend/src/components/ui/tag-input.tsx diff --git a/frontend/src/components/ui/textarea.tsx b/apps/frontend/src/components/ui/textarea.tsx similarity index 100% rename from frontend/src/components/ui/textarea.tsx rename to apps/frontend/src/components/ui/textarea.tsx diff --git a/frontend/src/components/ui/toggle.tsx b/apps/frontend/src/components/ui/toggle.tsx similarity index 100% rename from frontend/src/components/ui/toggle.tsx rename to apps/frontend/src/components/ui/toggle.tsx diff --git a/frontend/src/components/ui/tooltip.tsx b/apps/frontend/src/components/ui/tooltip.tsx similarity index 100% rename from frontend/src/components/ui/tooltip.tsx rename to apps/frontend/src/components/ui/tooltip.tsx diff --git a/frontend/src/components/ui/unified-agent-card.tsx b/apps/frontend/src/components/ui/unified-agent-card.tsx similarity index 100% rename from frontend/src/components/ui/unified-agent-card.tsx rename to apps/frontend/src/components/ui/unified-agent-card.tsx diff --git a/frontend/src/components/ui/upgrade-dialog.tsx b/apps/frontend/src/components/ui/upgrade-dialog.tsx similarity index 100% rename from frontend/src/components/ui/upgrade-dialog.tsx rename to apps/frontend/src/components/ui/upgrade-dialog.tsx diff --git a/frontend/src/hooks/account/index.ts b/apps/frontend/src/hooks/account/index.ts similarity index 100% rename from frontend/src/hooks/account/index.ts rename to apps/frontend/src/hooks/account/index.ts diff --git a/frontend/src/hooks/account/use-account-deletion.ts b/apps/frontend/src/hooks/account/use-account-deletion.ts similarity index 100% rename from frontend/src/hooks/account/use-account-deletion.ts rename to apps/frontend/src/hooks/account/use-account-deletion.ts diff --git a/frontend/src/hooks/account/use-account-setup.ts b/apps/frontend/src/hooks/account/use-account-setup.ts similarity index 100% rename from frontend/src/hooks/account/use-account-setup.ts rename to apps/frontend/src/hooks/account/use-account-setup.ts diff --git a/frontend/src/hooks/account/use-accounts.ts b/apps/frontend/src/hooks/account/use-accounts.ts similarity index 100% rename from frontend/src/hooks/account/use-accounts.ts rename to apps/frontend/src/hooks/account/use-accounts.ts diff --git a/frontend/src/hooks/admin/index.ts b/apps/frontend/src/hooks/admin/index.ts similarity index 100% rename from frontend/src/hooks/admin/index.ts rename to apps/frontend/src/hooks/admin/index.ts diff --git a/frontend/src/hooks/admin/use-admin-analytics.ts b/apps/frontend/src/hooks/admin/use-admin-analytics.ts similarity index 100% rename from frontend/src/hooks/admin/use-admin-analytics.ts rename to apps/frontend/src/hooks/admin/use-admin-analytics.ts diff --git a/frontend/src/hooks/admin/use-admin-feedback.ts b/apps/frontend/src/hooks/admin/use-admin-feedback.ts similarity index 100% rename from frontend/src/hooks/admin/use-admin-feedback.ts rename to apps/frontend/src/hooks/admin/use-admin-feedback.ts diff --git a/frontend/src/hooks/admin/use-admin-role.ts b/apps/frontend/src/hooks/admin/use-admin-role.ts similarity index 100% rename from frontend/src/hooks/admin/use-admin-role.ts rename to apps/frontend/src/hooks/admin/use-admin-role.ts diff --git a/frontend/src/hooks/admin/use-admin-users.ts b/apps/frontend/src/hooks/admin/use-admin-users.ts similarity index 100% rename from frontend/src/hooks/admin/use-admin-users.ts rename to apps/frontend/src/hooks/admin/use-admin-users.ts diff --git a/frontend/src/hooks/admin/use-notification-workflow.ts b/apps/frontend/src/hooks/admin/use-notification-workflow.ts similarity index 100% rename from frontend/src/hooks/admin/use-notification-workflow.ts rename to apps/frontend/src/hooks/admin/use-notification-workflow.ts diff --git a/frontend/src/hooks/agents/index.ts b/apps/frontend/src/hooks/agents/index.ts similarity index 100% rename from frontend/src/hooks/agents/index.ts rename to apps/frontend/src/hooks/agents/index.ts diff --git a/frontend/src/hooks/agents/keys.ts b/apps/frontend/src/hooks/agents/keys.ts similarity index 100% rename from frontend/src/hooks/agents/keys.ts rename to apps/frontend/src/hooks/agents/keys.ts diff --git a/frontend/src/hooks/agents/use-agent-export-import.ts b/apps/frontend/src/hooks/agents/use-agent-export-import.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-export-import.ts rename to apps/frontend/src/hooks/agents/use-agent-export-import.ts diff --git a/frontend/src/hooks/agents/use-agent-icon-generation.ts b/apps/frontend/src/hooks/agents/use-agent-icon-generation.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-icon-generation.ts rename to apps/frontend/src/hooks/agents/use-agent-icon-generation.ts diff --git a/frontend/src/hooks/agents/use-agent-tools.ts b/apps/frontend/src/hooks/agents/use-agent-tools.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-tools.ts rename to apps/frontend/src/hooks/agents/use-agent-tools.ts diff --git a/frontend/src/hooks/agents/use-agent-upcoming-runs.ts b/apps/frontend/src/hooks/agents/use-agent-upcoming-runs.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-upcoming-runs.ts rename to apps/frontend/src/hooks/agents/use-agent-upcoming-runs.ts diff --git a/frontend/src/hooks/agents/use-agent-version-data.ts b/apps/frontend/src/hooks/agents/use-agent-version-data.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-version-data.ts rename to apps/frontend/src/hooks/agents/use-agent-version-data.ts diff --git a/frontend/src/hooks/agents/use-agent-versions.ts b/apps/frontend/src/hooks/agents/use-agent-versions.ts similarity index 100% rename from frontend/src/hooks/agents/use-agent-versions.ts rename to apps/frontend/src/hooks/agents/use-agent-versions.ts diff --git a/frontend/src/hooks/agents/use-agents.ts b/apps/frontend/src/hooks/agents/use-agents.ts similarity index 100% rename from frontend/src/hooks/agents/use-agents.ts rename to apps/frontend/src/hooks/agents/use-agents.ts diff --git a/frontend/src/hooks/agents/use-custom-mcp-tools.ts b/apps/frontend/src/hooks/agents/use-custom-mcp-tools.ts similarity index 100% rename from frontend/src/hooks/agents/use-custom-mcp-tools.ts rename to apps/frontend/src/hooks/agents/use-custom-mcp-tools.ts diff --git a/frontend/src/hooks/agents/use-json-import.ts b/apps/frontend/src/hooks/agents/use-json-import.ts similarity index 100% rename from frontend/src/hooks/agents/use-json-import.ts rename to apps/frontend/src/hooks/agents/use-json-import.ts diff --git a/frontend/src/hooks/agents/use-model-selection.ts b/apps/frontend/src/hooks/agents/use-model-selection.ts similarity index 100% rename from frontend/src/hooks/agents/use-model-selection.ts rename to apps/frontend/src/hooks/agents/use-model-selection.ts diff --git a/frontend/src/hooks/agents/use-update-agent-mcps.ts b/apps/frontend/src/hooks/agents/use-update-agent-mcps.ts similarity index 100% rename from frontend/src/hooks/agents/use-update-agent-mcps.ts rename to apps/frontend/src/hooks/agents/use-update-agent-mcps.ts diff --git a/frontend/src/hooks/agents/utils.ts b/apps/frontend/src/hooks/agents/utils.ts similarity index 100% rename from frontend/src/hooks/agents/utils.ts rename to apps/frontend/src/hooks/agents/utils.ts diff --git a/frontend/src/hooks/apify/use-apify-approvals.ts b/apps/frontend/src/hooks/apify/use-apify-approvals.ts similarity index 100% rename from frontend/src/hooks/apify/use-apify-approvals.ts rename to apps/frontend/src/hooks/apify/use-apify-approvals.ts diff --git a/frontend/src/hooks/auth/index.ts b/apps/frontend/src/hooks/auth/index.ts similarity index 100% rename from frontend/src/hooks/auth/index.ts rename to apps/frontend/src/hooks/auth/index.ts diff --git a/frontend/src/hooks/auth/phone-verification.ts b/apps/frontend/src/hooks/auth/phone-verification.ts similarity index 100% rename from frontend/src/hooks/auth/phone-verification.ts rename to apps/frontend/src/hooks/auth/phone-verification.ts diff --git a/frontend/src/hooks/billing/index.ts b/apps/frontend/src/hooks/billing/index.ts similarity index 100% rename from frontend/src/hooks/billing/index.ts rename to apps/frontend/src/hooks/billing/index.ts diff --git a/frontend/src/hooks/billing/use-account-state.ts b/apps/frontend/src/hooks/billing/use-account-state.ts similarity index 100% rename from frontend/src/hooks/billing/use-account-state.ts rename to apps/frontend/src/hooks/billing/use-account-state.ts diff --git a/frontend/src/hooks/billing/use-admin-billing.ts b/apps/frontend/src/hooks/billing/use-admin-billing.ts similarity index 100% rename from frontend/src/hooks/billing/use-admin-billing.ts rename to apps/frontend/src/hooks/billing/use-admin-billing.ts diff --git a/frontend/src/hooks/billing/use-billing-modal.ts b/apps/frontend/src/hooks/billing/use-billing-modal.ts similarity index 100% rename from frontend/src/hooks/billing/use-billing-modal.ts rename to apps/frontend/src/hooks/billing/use-billing-modal.ts diff --git a/frontend/src/hooks/billing/use-credit-usage.ts b/apps/frontend/src/hooks/billing/use-credit-usage.ts similarity index 100% rename from frontend/src/hooks/billing/use-credit-usage.ts rename to apps/frontend/src/hooks/billing/use-credit-usage.ts diff --git a/frontend/src/hooks/billing/use-download-restriction.ts b/apps/frontend/src/hooks/billing/use-download-restriction.ts similarity index 100% rename from frontend/src/hooks/billing/use-download-restriction.ts rename to apps/frontend/src/hooks/billing/use-download-restriction.ts diff --git a/frontend/src/hooks/billing/use-thread-billing.ts b/apps/frontend/src/hooks/billing/use-thread-billing.ts similarity index 100% rename from frontend/src/hooks/billing/use-thread-billing.ts rename to apps/frontend/src/hooks/billing/use-thread-billing.ts diff --git a/frontend/src/hooks/billing/use-thread-usage.ts b/apps/frontend/src/hooks/billing/use-thread-usage.ts similarity index 100% rename from frontend/src/hooks/billing/use-thread-usage.ts rename to apps/frontend/src/hooks/billing/use-thread-usage.ts diff --git a/frontend/src/hooks/billing/use-tier-configurations.ts b/apps/frontend/src/hooks/billing/use-tier-configurations.ts similarity index 100% rename from frontend/src/hooks/billing/use-tier-configurations.ts rename to apps/frontend/src/hooks/billing/use-tier-configurations.ts diff --git a/frontend/src/hooks/billing/use-transactions.ts b/apps/frontend/src/hooks/billing/use-transactions.ts similarity index 100% rename from frontend/src/hooks/billing/use-transactions.ts rename to apps/frontend/src/hooks/billing/use-transactions.ts diff --git a/frontend/src/hooks/composio/keys.ts b/apps/frontend/src/hooks/composio/keys.ts similarity index 100% rename from frontend/src/hooks/composio/keys.ts rename to apps/frontend/src/hooks/composio/keys.ts diff --git a/frontend/src/hooks/composio/use-composio-mutations.ts b/apps/frontend/src/hooks/composio/use-composio-mutations.ts similarity index 100% rename from frontend/src/hooks/composio/use-composio-mutations.ts rename to apps/frontend/src/hooks/composio/use-composio-mutations.ts diff --git a/frontend/src/hooks/composio/use-composio-profiles.ts b/apps/frontend/src/hooks/composio/use-composio-profiles.ts similarity index 100% rename from frontend/src/hooks/composio/use-composio-profiles.ts rename to apps/frontend/src/hooks/composio/use-composio-profiles.ts diff --git a/frontend/src/hooks/composio/use-composio-triggers.ts b/apps/frontend/src/hooks/composio/use-composio-triggers.ts similarity index 100% rename from frontend/src/hooks/composio/use-composio-triggers.ts rename to apps/frontend/src/hooks/composio/use-composio-triggers.ts diff --git a/frontend/src/hooks/composio/use-composio.ts b/apps/frontend/src/hooks/composio/use-composio.ts similarity index 100% rename from frontend/src/hooks/composio/use-composio.ts rename to apps/frontend/src/hooks/composio/use-composio.ts diff --git a/frontend/src/hooks/composio/utils.ts b/apps/frontend/src/hooks/composio/utils.ts similarity index 100% rename from frontend/src/hooks/composio/utils.ts rename to apps/frontend/src/hooks/composio/utils.ts diff --git a/frontend/src/hooks/dashboard/keys.ts b/apps/frontend/src/hooks/dashboard/keys.ts similarity index 100% rename from frontend/src/hooks/dashboard/keys.ts rename to apps/frontend/src/hooks/dashboard/keys.ts diff --git a/frontend/src/hooks/dashboard/use-initiate-agent.ts b/apps/frontend/src/hooks/dashboard/use-initiate-agent.ts similarity index 100% rename from frontend/src/hooks/dashboard/use-initiate-agent.ts rename to apps/frontend/src/hooks/dashboard/use-initiate-agent.ts diff --git a/frontend/src/hooks/dashboard/utils.ts b/apps/frontend/src/hooks/dashboard/utils.ts similarity index 100% rename from frontend/src/hooks/dashboard/utils.ts rename to apps/frontend/src/hooks/dashboard/utils.ts diff --git a/frontend/src/hooks/edge-flags/index.ts b/apps/frontend/src/hooks/edge-flags/index.ts similarity index 100% rename from frontend/src/hooks/edge-flags/index.ts rename to apps/frontend/src/hooks/edge-flags/index.ts diff --git a/frontend/src/hooks/files/index.ts b/apps/frontend/src/hooks/files/index.ts similarity index 100% rename from frontend/src/hooks/files/index.ts rename to apps/frontend/src/hooks/files/index.ts diff --git a/frontend/src/hooks/files/keys.ts b/apps/frontend/src/hooks/files/keys.ts similarity index 100% rename from frontend/src/hooks/files/keys.ts rename to apps/frontend/src/hooks/files/keys.ts diff --git a/frontend/src/hooks/files/use-cached-file.ts b/apps/frontend/src/hooks/files/use-cached-file.ts similarity index 100% rename from frontend/src/hooks/files/use-cached-file.ts rename to apps/frontend/src/hooks/files/use-cached-file.ts diff --git a/frontend/src/hooks/files/use-external-image.ts b/apps/frontend/src/hooks/files/use-external-image.ts similarity index 100% rename from frontend/src/hooks/files/use-external-image.ts rename to apps/frontend/src/hooks/files/use-external-image.ts diff --git a/frontend/src/hooks/files/use-file-content.ts b/apps/frontend/src/hooks/files/use-file-content.ts similarity index 100% rename from frontend/src/hooks/files/use-file-content.ts rename to apps/frontend/src/hooks/files/use-file-content.ts diff --git a/frontend/src/hooks/files/use-file-mutations.ts b/apps/frontend/src/hooks/files/use-file-mutations.ts similarity index 100% rename from frontend/src/hooks/files/use-file-mutations.ts rename to apps/frontend/src/hooks/files/use-file-mutations.ts diff --git a/frontend/src/hooks/files/use-file-queries.ts b/apps/frontend/src/hooks/files/use-file-queries.ts similarity index 100% rename from frontend/src/hooks/files/use-file-queries.ts rename to apps/frontend/src/hooks/files/use-file-queries.ts diff --git a/frontend/src/hooks/files/use-image-content.ts b/apps/frontend/src/hooks/files/use-image-content.ts similarity index 100% rename from frontend/src/hooks/files/use-image-content.ts rename to apps/frontend/src/hooks/files/use-image-content.ts diff --git a/frontend/src/hooks/files/use-presentation-viewer-modal.ts b/apps/frontend/src/hooks/files/use-presentation-viewer-modal.ts similarity index 100% rename from frontend/src/hooks/files/use-presentation-viewer-modal.ts rename to apps/frontend/src/hooks/files/use-presentation-viewer-modal.ts diff --git a/frontend/src/hooks/files/use-sandbox-details.ts b/apps/frontend/src/hooks/files/use-sandbox-details.ts similarity index 100% rename from frontend/src/hooks/files/use-sandbox-details.ts rename to apps/frontend/src/hooks/files/use-sandbox-details.ts diff --git a/frontend/src/hooks/files/use-sandbox-mutations.ts b/apps/frontend/src/hooks/files/use-sandbox-mutations.ts similarity index 100% rename from frontend/src/hooks/files/use-sandbox-mutations.ts rename to apps/frontend/src/hooks/files/use-sandbox-mutations.ts diff --git a/frontend/src/hooks/files/useVncPreloader.ts b/apps/frontend/src/hooks/files/useVncPreloader.ts similarity index 100% rename from frontend/src/hooks/files/useVncPreloader.ts rename to apps/frontend/src/hooks/files/useVncPreloader.ts diff --git a/frontend/src/hooks/index.ts b/apps/frontend/src/hooks/index.ts similarity index 100% rename from frontend/src/hooks/index.ts rename to apps/frontend/src/hooks/index.ts diff --git a/frontend/src/hooks/integrations/index.ts b/apps/frontend/src/hooks/integrations/index.ts similarity index 100% rename from frontend/src/hooks/integrations/index.ts rename to apps/frontend/src/hooks/integrations/index.ts diff --git a/frontend/src/hooks/integrations/useVapiCallRealtime.ts b/apps/frontend/src/hooks/integrations/useVapiCallRealtime.ts similarity index 100% rename from frontend/src/hooks/integrations/useVapiCallRealtime.ts rename to apps/frontend/src/hooks/integrations/useVapiCallRealtime.ts diff --git a/frontend/src/hooks/knowledge-base/keys.ts b/apps/frontend/src/hooks/knowledge-base/keys.ts similarity index 100% rename from frontend/src/hooks/knowledge-base/keys.ts rename to apps/frontend/src/hooks/knowledge-base/keys.ts diff --git a/frontend/src/hooks/knowledge-base/use-folders.ts b/apps/frontend/src/hooks/knowledge-base/use-folders.ts similarity index 100% rename from frontend/src/hooks/knowledge-base/use-folders.ts rename to apps/frontend/src/hooks/knowledge-base/use-folders.ts diff --git a/frontend/src/hooks/knowledge-base/use-knowledge-base-queries.ts b/apps/frontend/src/hooks/knowledge-base/use-knowledge-base-queries.ts similarity index 100% rename from frontend/src/hooks/knowledge-base/use-knowledge-base-queries.ts rename to apps/frontend/src/hooks/knowledge-base/use-knowledge-base-queries.ts diff --git a/frontend/src/hooks/mcp/use-credential-profiles.ts b/apps/frontend/src/hooks/mcp/use-credential-profiles.ts similarity index 100% rename from frontend/src/hooks/mcp/use-credential-profiles.ts rename to apps/frontend/src/hooks/mcp/use-credential-profiles.ts diff --git a/frontend/src/hooks/mcp/use-mcp-servers.ts b/apps/frontend/src/hooks/mcp/use-mcp-servers.ts similarity index 100% rename from frontend/src/hooks/mcp/use-mcp-servers.ts rename to apps/frontend/src/hooks/mcp/use-mcp-servers.ts diff --git a/frontend/src/hooks/memory/use-memory.ts b/apps/frontend/src/hooks/memory/use-memory.ts similarity index 100% rename from frontend/src/hooks/memory/use-memory.ts rename to apps/frontend/src/hooks/memory/use-memory.ts diff --git a/frontend/src/hooks/messages/index.ts b/apps/frontend/src/hooks/messages/index.ts similarity index 100% rename from frontend/src/hooks/messages/index.ts rename to apps/frontend/src/hooks/messages/index.ts diff --git a/frontend/src/hooks/messages/tool-tracking.ts b/apps/frontend/src/hooks/messages/tool-tracking.ts similarity index 100% rename from frontend/src/hooks/messages/tool-tracking.ts rename to apps/frontend/src/hooks/messages/tool-tracking.ts diff --git a/frontend/src/hooks/messages/useAgentStream.ts b/apps/frontend/src/hooks/messages/useAgentStream.ts similarity index 71% rename from frontend/src/hooks/messages/useAgentStream.ts rename to apps/frontend/src/hooks/messages/useAgentStream.ts index e99494a6ad..a2ea433798 100644 --- a/frontend/src/hooks/messages/useAgentStream.ts +++ b/apps/frontend/src/hooks/messages/useAgentStream.ts @@ -12,6 +12,25 @@ import { ParsedMetadata, } from '@/components/thread/types'; import { safeJsonParse } from '@/components/thread/utils'; +import { + createAccumulatorState, + clearAccumulator, + type ToolCallAccumulatorState, +} from '@agentpress/shared/streaming'; +import { + orderContentBySequence, + type TextChunk, +} from '@agentpress/shared/streaming'; +import { + mapAgentStatus, + preprocessStreamData, + isCompletionMessage, + parseStreamingMessage, + handleAssistantChunk, + handleToolCallChunk, + handleToolResult, + createMessageWithToolCalls, +} from '@agentpress/shared/streaming'; import { agentKeys } from '@/hooks/agents/keys'; import { composioKeys } from '@/hooks/composio/keys'; import { knowledgeBaseKeys } from '@/hooks/knowledge-base/keys'; @@ -60,9 +79,7 @@ export function useAgentStream( const queryClient = useQueryClient(); const [status, setStatus] = useState('idle'); - const [textContent, setTextContent] = useState< - { content: string; sequence?: number }[] - >([]); + const [textContent, setTextContent] = useState([]); // Optimized streaming with requestAnimationFrame for smooth rendering const rafRef = useRef(null); @@ -133,23 +150,7 @@ export function useAgentStream( const setMessagesRef = useRef(setMessages); // DELTA STREAMING: Track accumulated tool call arguments with sequence numbers - // Structure: Map }> - interface AccumulatedToolCall { - metadata: { - tool_call_id: string; - function_name: string; - index?: number; - [key: string]: any; - }; - chunks: Array<{sequence: number, delta: string}>; - } - const accumulatedToolCallsRef = useRef>(new Map()); - - // Track completed tool call IDs (tools that have received results) - const completedToolCallIdsRef = useRef>(new Set()); - - // Track tool results by tool_call_id for merging with streaming tool calls - const toolResultsRef = useRef>(new Map()); + const accumulatorRef = useRef(createAccumulatorState()); // Track previous tool call state to prevent unnecessary re-renders const previousToolCallStateRef = useRef(null); @@ -163,35 +164,7 @@ export function useAgentStream( }, [callbacks]); const orderedTextContent = useMemo(() => { - if (textContent.length === 0) return ''; - - // Only sort if sequences are out of order (optimization) - let needsSorting = false; - for (let i = 1; i < textContent.length; i++) { - const prevSeq = textContent[i - 1].sequence ?? 0; - const currSeq = textContent[i].sequence ?? 0; - if (currSeq < prevSeq) { - needsSorting = true; - break; - } - } - - // If already sorted, just concatenate - if (!needsSorting) { - let result = ''; - for (let i = 0; i < textContent.length; i++) { - result += textContent[i].content; - } - return result; - } - - // Only sort if necessary - const sorted = textContent.slice().sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0)); - let result = ''; - for (let i = 0; i < sorted.length; i++) { - result += sorted[i].content; - } - return result; + return orderContentBySequence(textContent); }, [textContent]); // Refs to capture current state for persistence @@ -254,19 +227,7 @@ export function useAgentStream( setMessagesRef.current = setMessages; }, [setMessages]); - // Helper function to map backend status to frontend status string - const mapAgentStatus = (backendStatus: string): string => { - switch (backendStatus) { - case 'completed': - return 'completed'; - case 'stopped': - return 'stopped'; - case 'failed': - return 'failed'; - default: - return 'error'; - } - }; + // Use shared mapAgentStatus function (imported above) // Internal function to update status and notify consumer // Uses callbacksRef to avoid recreating this function when callbacks change @@ -326,9 +287,7 @@ export function useAgentStream( setTextContent([]); setToolCall(null); // Clear accumulated tool call deltas and previous state - accumulatedToolCallsRef.current.clear(); - completedToolCallIdsRef.current.clear(); - toolResultsRef.current.clear(); + clearAccumulator(accumulatorRef.current); previousToolCallStateRef.current = null; lastToolCallUpdateTimeRef.current = 0; // Clear tool tracking for new stream @@ -418,24 +377,11 @@ export function useAgentStream( (rawData: string) => { if (!isMountedRef.current) return; - let processedData = rawData; - if (processedData.startsWith('data: ')) { - processedData = processedData.substring(6).trim(); - } + const processedData = preprocessStreamData(rawData); if (!processedData) return; - // Early exit for completion messages (check for any completed status message) - if ( - processedData.includes('"type": "status"') && - processedData.includes('"status": "completed"') - ) { - finalizeStream('completed', currentRunIdRef.current); - return; - } - if ( - processedData.includes('Run data not available for streaming') || - processedData.includes('Stream ended with status: completed') - ) { + // Early exit for completion messages + if (isCompletionMessage(processedData)) { finalizeStream('completed', currentRunIdRef.current); return; } @@ -573,10 +519,7 @@ export function useAgentStream( } // Process JSON messages - const message = safeJsonParse( - processedData, - null, - ) as UnifiedMessage | null; + const message = parseStreamingMessage(processedData); if (!message) { console.warn( '[useAgentStream] Failed to parse streamed message:', @@ -601,125 +544,29 @@ export function useAgentStream( switch (message.type) { case 'assistant': if (parsedMetadata.stream_status === 'tool_call_chunk') { - // Handle tool call chunks - extract from metadata.tool_calls - const toolCalls = parsedMetadata.tool_calls || []; - if (toolCalls.length > 0) { - // DELTA STREAMING: Accumulate deltas into full tool calls with sequence ordering - // First, update the accumulator with new deltas from this chunk - for (const tc of toolCalls as any[]) { - const toolCallId = tc.tool_call_id || 'unknown'; - const sequence = message.sequence ?? 0; - - // Get or create the accumulated entry for this tool call - let accumulated = accumulatedToolCallsRef.current.get(toolCallId); - if (!accumulated) { - accumulated = { - metadata: { - tool_call_id: tc.tool_call_id, - function_name: tc.function_name, - index: tc.index, - }, - chunks: [], - }; - accumulatedToolCallsRef.current.set(toolCallId, accumulated); - } - - // Update metadata if we have newer info (function_name might come later) - if (tc.function_name) { - accumulated.metadata.function_name = tc.function_name; - } - if (tc.index !== undefined) { - accumulated.metadata.index = tc.index; - } - - if (tc.is_delta && tc.arguments_delta) { - // This is a delta update - store it with sequence number - const existingIndex = accumulated.chunks.findIndex(c => c.sequence === sequence); - if (existingIndex >= 0) { - accumulated.chunks[existingIndex].delta = tc.arguments_delta; - } else { - accumulated.chunks.push({ sequence, delta: tc.arguments_delta }); - } - // Sort chunks by sequence number - accumulated.chunks.sort((a, b) => a.sequence - b.sequence); - } else if (tc.arguments) { - // Full arguments (non-delta) - replace all chunks with single full argument - const argsStr = typeof tc.arguments === 'string' ? tc.arguments : JSON.stringify(tc.arguments); - accumulated.chunks = [{ sequence, delta: argsStr }]; - } - } - - // Now reconstruct ALL accumulated tool calls (not just from this message) - // Merge streaming tool calls with completed tool results - const allReconstructedToolCalls = Array.from(accumulatedToolCallsRef.current.values()) - .sort((a, b) => (a.metadata.index ?? 0) - (b.metadata.index ?? 0)) - .map(accumulated => { - // Merge all chunks for this tool call - let mergedArgs = ''; - for (const chunk of accumulated.chunks) { - mergedArgs += chunk.delta; - } - - const toolCallId = accumulated.metadata.tool_call_id; - const isCompleted = completedToolCallIdsRef.current.has(toolCallId); - const toolResult = toolResultsRef.current.get(toolCallId); - - return { - tool_call_id: toolCallId, - function_name: accumulated.metadata.function_name, - index: accumulated.metadata.index, - arguments: mergedArgs, - is_delta: false, // Mark as assembled - completed: isCompleted, - tool_result: toolResult ? safeJsonParse(toolResult.metadata, {}).result : undefined, - }; - }); - - // Also include completed tools that may have results but aren't in accumulated ref - // (edge case: result arrives before tool call is fully streamed) - toolResultsRef.current.forEach((resultMessage, toolCallId) => { - if (!accumulatedToolCallsRef.current.has(toolCallId)) { - const toolMetadata = safeJsonParse(resultMessage.metadata, {}); - const functionName = toolMetadata.function_name; - if (functionName) { - // Add to reconstructed calls if not already present - const existing = allReconstructedToolCalls.find(tc => tc.tool_call_id === toolCallId); - if (!existing) { - allReconstructedToolCalls.push({ - tool_call_id: toolCallId, - function_name: functionName, - index: toolMetadata.index, - arguments: '{}', - is_delta: false, - completed: true, - tool_result: toolMetadata.result, - }); - } - } - } - }); - - // Re-sort after adding any missing completed tools - allReconstructedToolCalls.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); - - // Create updated message with ALL reconstructed tool calls - const updatedMessage = { - ...message, - metadata: JSON.stringify({ - ...parsedMetadata, - tool_calls: allReconstructedToolCalls, - }), - }; + // Handle tool call chunks using shared utilities + const reconstructedToolCalls = handleToolCallChunk( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCalls) { + // Create updated message with reconstructed tool calls + const updatedMessage = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCalls + ); // Create a stable representation for comparison to prevent unnecessary re-renders - // Compare tool call IDs, function names, and argument lengths (not full content) const currentStateKey = JSON.stringify({ - toolCallIds: allReconstructedToolCalls.map(tc => tc.tool_call_id), - functionNames: allReconstructedToolCalls.map(tc => tc.function_name), - argLengths: allReconstructedToolCalls.map(tc => + toolCallIds: reconstructedToolCalls.map(tc => tc.tool_call_id), + functionNames: reconstructedToolCalls.map(tc => tc.function_name), + argLengths: reconstructedToolCalls.map(tc => typeof tc.arguments === 'string' ? tc.arguments.length : JSON.stringify(tc.arguments).length ), - count: allReconstructedToolCalls.length, + count: reconstructedToolCalls.length, }); // Check if there's a meaningful change @@ -764,129 +611,65 @@ export function useAgentStream( } // Always call the callback to ensure downstream handlers get updates - // (they can implement their own deduplication if needed) callbacksRef.current.onToolCallChunk?.(updatedMessage); } - } else if ( - parsedMetadata.stream_status === 'chunk' && - parsedContent.content - ) { - // Use throttled approach for smoother streaming - addContentThrottled({ - sequence: message.sequence, - content: parsedContent.content, - }); - callbacksRef.current.onAssistantChunk?.({ content: parsedContent.content }); - } else if (parsedMetadata.stream_status === 'complete') { - // Flush any pending content before completing - flushPendingContent(); - - React.startTransition(() => { - setTextContent([]); - setToolCall(null); - }); - // Clear accumulated tool call deltas and previous state when assistant message completes - accumulatedToolCallsRef.current.clear(); - completedToolCallIdsRef.current.clear(); - toolResultsRef.current.clear(); - previousToolCallStateRef.current = null; - lastToolCallUpdateTimeRef.current = 0; - if (message.message_id) callbacksRef.current.onMessage(message); - } else if (!parsedMetadata.stream_status) { - // Handle non-chunked assistant messages if needed - callbacksRef.current.onAssistantStart?.(); - if (message.message_id) callbacksRef.current.onMessage(message); - } - break; - case 'tool': - // Don't clear toolCall state here - other tools may still be streaming - // The tool result message will be handled by onMessage callback, which updates useThreadToolCalls - // Mark this tool as completed and store its result, but keep other tools in accumulated ref - - // Log tool result received - try { - const toolMetadata = safeJsonParse(message.metadata, {}); - const toolCallId = toolMetadata.tool_call_id; - const functionName = toolMetadata.function_name; - if (toolCallId && functionName) { - // Mark this tool call as completed - completedToolCallIdsRef.current.add(toolCallId); - - // Store the tool result for merging with streaming tool calls - toolResultsRef.current.set(toolCallId, message); - - // Trigger an update to streamingToolCall to include this completed tool with its result - // Reconstruct all tool calls including this completed one - const allReconstructedToolCalls = Array.from(accumulatedToolCallsRef.current.values()) - .sort((a, b) => (a.metadata.index ?? 0) - (b.metadata.index ?? 0)) - .map(accumulated => { - let mergedArgs = ''; - for (const chunk of accumulated.chunks) { - mergedArgs += chunk.delta; - } - - const tcId = accumulated.metadata.tool_call_id; - const isCompleted = completedToolCallIdsRef.current.has(tcId); - const toolResult = toolResultsRef.current.get(tcId); - - return { - tool_call_id: tcId, - function_name: accumulated.metadata.function_name, - index: accumulated.metadata.index, - arguments: mergedArgs, - is_delta: false, - completed: isCompleted, - tool_result: toolResult ? safeJsonParse(toolResult.metadata, {}).result : undefined, - }; - }); - - // Include completed tools that may not be in accumulated ref - toolResultsRef.current.forEach((resultMsg, tcId) => { - if (!accumulatedToolCallsRef.current.has(tcId)) { - const resultMetadata = safeJsonParse(resultMsg.metadata, {}); - const fnName = resultMetadata.function_name; - if (fnName) { - const existing = allReconstructedToolCalls.find(tc => tc.tool_call_id === tcId); - if (!existing) { - allReconstructedToolCalls.push({ - tool_call_id: tcId, - function_name: fnName, - index: resultMetadata.index, - arguments: '{}', - is_delta: false, - completed: true, - tool_result: resultMetadata.result, - }); - } - } - } + } else { + // Handle text chunks + const chunkContent = handleAssistantChunk(message, parsedContent, parsedMetadata); + if (chunkContent) { + // Use throttled approach for smoother streaming + addContentThrottled({ + sequence: message.sequence, + content: chunkContent, }); + callbacksRef.current.onAssistantChunk?.({ content: chunkContent }); + } else if (parsedMetadata.stream_status === 'complete') { + // Flush any pending content before completing + flushPendingContent(); - allReconstructedToolCalls.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); - - // Update streamingToolCall to include this completed tool with its result - const updatedMessageWithResults = { - ...message, - metadata: JSON.stringify({ - ...toolMetadata, - tool_calls: allReconstructedToolCalls, - }), - }; - - // Force update to streamingToolCall state React.startTransition(() => { - setToolCall(updatedMessageWithResults); + setTextContent([]); + setToolCall(null); }); - - // Also call the callback to notify downstream handlers - callbacksRef.current.onToolCallChunk?.(updatedMessageWithResults); + // Clear accumulated tool call deltas and previous state when assistant message completes + clearAccumulator(accumulatorRef.current); + previousToolCallStateRef.current = null; + lastToolCallUpdateTimeRef.current = 0; + if (message.message_id) callbacksRef.current.onMessage(message); + } else if (!parsedMetadata.stream_status) { + // Handle non-chunked assistant messages if needed + callbacksRef.current.onAssistantStart?.(); + if (message.message_id) callbacksRef.current.onMessage(message); } - } catch (e) { - // Ignore parsing errors + } + break; + case 'tool': + // Handle tool result using shared utilities + const reconstructedToolCallsFromResult = handleToolResult( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCallsFromResult) { + // Update streamingToolCall to include this completed tool with its result + const updatedMessageWithResults = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCallsFromResult + ); + + // Force update to streamingToolCall state + React.startTransition(() => { + setToolCall(updatedMessageWithResults); + }); + + // Also call the callback to notify downstream handlers + callbacksRef.current.onToolCallChunk?.(updatedMessageWithResults); } - // DO NOT clear accumulatedToolCallsRef - other tools may still be streaming - // Only clear when assistant message completes (handled in case 'assistant' with stream_status === 'complete') + // DO NOT clear accumulator - other tools may still be streaming + // Only clear when assistant message completes if (message.message_id) callbacksRef.current.onMessage(message); break; case 'status': @@ -1189,9 +972,7 @@ export function useAgentStream( setAgentRunId(runId); currentRunIdRef.current = runId; // Clear accumulated tool call deltas and previous state - accumulatedToolCallsRef.current.clear(); - completedToolCallIdsRef.current.clear(); - toolResultsRef.current.clear(); + clearAccumulator(accumulatorRef.current); previousToolCallStateRef.current = null; lastToolCallUpdateTimeRef.current = 0; // Clear tool tracking for new stream diff --git a/frontend/src/hooks/messages/useMessages.ts b/apps/frontend/src/hooks/messages/useMessages.ts similarity index 100% rename from frontend/src/hooks/messages/useMessages.ts rename to apps/frontend/src/hooks/messages/useMessages.ts diff --git a/frontend/src/hooks/messages/usePlaybackController.tsx b/apps/frontend/src/hooks/messages/usePlaybackController.tsx similarity index 100% rename from frontend/src/hooks/messages/usePlaybackController.tsx rename to apps/frontend/src/hooks/messages/usePlaybackController.tsx diff --git a/apps/frontend/src/hooks/messages/useSmoothText.ts b/apps/frontend/src/hooks/messages/useSmoothText.ts new file mode 100644 index 0000000000..96abff6695 --- /dev/null +++ b/apps/frontend/src/hooks/messages/useSmoothText.ts @@ -0,0 +1,134 @@ +import { useState, useEffect, useRef, useMemo } from 'react'; + +export interface SmoothTextResult { + /** The currently displayed portion of the text */ + text: string; + /** Whether animation is still in progress (text not fully revealed) */ + isAnimating: boolean; +} + +/** + * Hook that gradually reveals text character-by-character for a smooth typewriter effect. + * Automatically catches up when new content arrives faster than the display rate. + * + * @param targetText - The full text to reveal + * @param charsPerSecond - Characters to reveal per second (default: 120) + * @param enabled - Whether to enable smooth streaming (default: true) + * @returns Object with `text` (displayed portion) and `isAnimating` (whether animation is in progress) + */ +export function useSmoothText( + targetText: string, + charsPerSecond: number = 120, + enabled: boolean = true +): SmoothTextResult { + const [displayedLength, setDisplayedLength] = useState(0); + const rafRef = useRef(null); + const lastUpdateTimeRef = useRef(null); + const lastTargetLengthRef = useRef(0); + const displayedLengthRef = useRef(0); + const targetTextRef = useRef(targetText); + + // Keep target text ref updated for use in animation callback + useEffect(() => { + targetTextRef.current = targetText; + }, [targetText]); + + useEffect(() => { + // Reset if target text shrinks (stream reset) + if (targetText.length < lastTargetLengthRef.current) { + displayedLengthRef.current = 0; + setDisplayedLength(0); + lastUpdateTimeRef.current = null; + } + lastTargetLengthRef.current = targetText.length; + }, [targetText]); + + useEffect(() => { + if (!enabled || !targetText) { + setDisplayedLength(targetText.length); + displayedLengthRef.current = targetText.length; + return; + } + + // If we've already displayed everything, no need to animate + if (displayedLengthRef.current >= targetText.length) { + return; + } + + // Initialize last update time on first render (don't reset if animation is already running) + if (lastUpdateTimeRef.current === null) { + lastUpdateTimeRef.current = performance.now(); + } + + const animate = (currentTime: number) => { + if (lastUpdateTimeRef.current === null) { + lastUpdateTimeRef.current = currentTime; + rafRef.current = requestAnimationFrame(animate); + return; + } + + const deltaTime = (currentTime - lastUpdateTimeRef.current) / 1000; // Convert to seconds + lastUpdateTimeRef.current = currentTime; + + // Use ref to get latest target text length + const currentTargetLength = targetTextRef.current.length; + + // Calculate how many characters to reveal based on delta time + const charsToReveal = deltaTime * charsPerSecond; + + // Calculate catch-up speed: if we're more than 100 chars behind, speed up 4x + const charsBehind = currentTargetLength - displayedLengthRef.current; + const effectiveSpeed = charsBehind > 100 ? charsPerSecond * 4 : charsPerSecond; + const catchUpChars = deltaTime * effectiveSpeed; + + // Use the higher of the two to ensure we catch up when needed + const charsToAdd = Math.max(charsToReveal, catchUpChars); + const newLength = Math.min( + displayedLengthRef.current + charsToAdd, + currentTargetLength + ); + + if (newLength > displayedLengthRef.current) { + displayedLengthRef.current = Math.floor(newLength); + setDisplayedLength(displayedLengthRef.current); + } + + // Continue animating if there's more content to reveal + if (displayedLengthRef.current < currentTargetLength) { + rafRef.current = requestAnimationFrame(animate); + } else { + rafRef.current = null; + // Reset timing when we reach the end - will be re-initialized if new content arrives + lastUpdateTimeRef.current = null; + } + }; + + // Start animation if not already running + if (!rafRef.current) { + rafRef.current = requestAnimationFrame(animate); + } + + return () => { + if (rafRef.current !== null) { + cancelAnimationFrame(rafRef.current); + rafRef.current = null; + } + // Note: We intentionally don't reset lastUpdateTimeRef here to allow smooth continuation + }; + }, [targetText, charsPerSecond, enabled]); + + // Update ref when state changes (for accurate tracking) + useEffect(() => { + displayedLengthRef.current = displayedLength; + }, [displayedLength]); + + // Memoize the result object to prevent unnecessary re-renders + const result = useMemo((): SmoothTextResult => { + const text = enabled ? targetText.slice(0, displayedLength) : targetText; + const isAnimating = enabled && displayedLength < targetText.length; + return { text, isAnimating }; + }, [enabled, targetText, displayedLength]); + + return result; +} + diff --git a/frontend/src/hooks/messages/useThreadToolCalls.ts b/apps/frontend/src/hooks/messages/useThreadToolCalls.ts similarity index 100% rename from frontend/src/hooks/messages/useThreadToolCalls.ts rename to apps/frontend/src/hooks/messages/useThreadToolCalls.ts diff --git a/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx b/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx similarity index 88% rename from frontend/src/hooks/messages/utils/assistant-message-renderer.tsx rename to apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx index c41085f1b1..b9a8186c97 100644 --- a/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx +++ b/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx @@ -8,7 +8,9 @@ import React from 'react'; import { Clock } from 'lucide-react'; import { UnifiedMessage, ParsedMetadata } from '@/components/thread/types'; -import { safeJsonParse, getToolIcon, getUserFriendlyToolName } from '@/components/thread/utils'; +import { safeJsonParse, getToolIcon } from '@/components/thread/utils'; +import { getUserFriendlyToolName } from '@agentpress/shared/tools'; +import { normalizeArrayValue, normalizeAttachments } from '@agentpress/shared/utils'; import { ComposioUrlDetector } from '@/components/thread/content/composio-url-detector'; import { FileAttachmentGrid, FileAttachment } from '@/components/thread/file-attachment'; import { TaskCompletedFeedback } from '@/components/thread/tool-views/shared/TaskCompletedFeedback'; @@ -31,58 +33,7 @@ export interface AssistantMessageRendererProps { onPromptFill?: (message: string) => void; } -/** - * Normalizes an array value that might be a string, array, or other type - */ -function normalizeArrayValue(value: unknown): string[] { - if (Array.isArray(value)) { - return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); - } - - if (typeof value === 'string') { - try { - const parsed = JSON.parse(value); - if (Array.isArray(parsed)) { - return parsed.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); - } - } catch { - // If parsing fails, treat as comma-separated string - return value.split(',').map(a => a.trim()).filter(a => a.length > 0); - } - } - - return []; -} - -/** - * Normalizes attachments value (can be string, array, or empty) - */ -function normalizeAttachments(attachments: unknown): string[] { - if (Array.isArray(attachments)) { - return attachments; - } - - if (typeof attachments === 'string') { - // Try parsing as JSON first (handles JSON stringified arrays like "[\"file1.json\", \"file2.json\"]") - const trimmed = attachments.trim(); - if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || - (trimmed.startsWith('{') && trimmed.endsWith('}'))) { - try { - const parsed = JSON.parse(trimmed); - if (Array.isArray(parsed)) { - return parsed.filter((a: any) => a && typeof a === 'string' && a.trim().length > 0); - } - } catch { - // Not valid JSON, fall through to comma-separated parsing - } - } - - // Fallback to comma-separated string parsing - return attachments.split(',').map(a => a.trim()).filter(a => a.length > 0); - } - - return []; -} +// normalizeArrayValue and normalizeAttachments are now imported from @agentpress/shared/utils /** * Extracts a display parameter from tool call arguments diff --git a/frontend/src/hooks/messages/utils/index.ts b/apps/frontend/src/hooks/messages/utils/index.ts similarity index 79% rename from frontend/src/hooks/messages/utils/index.ts rename to apps/frontend/src/hooks/messages/utils/index.ts index e650cf1c28..fab653c3de 100644 --- a/frontend/src/hooks/messages/utils/index.ts +++ b/apps/frontend/src/hooks/messages/utils/index.ts @@ -1,22 +1,28 @@ /** * Message and streaming utility functions - * All exports are portable and can be used in both web and mobile apps + * Re-exports from @agentpress/shared plus local extensions */ -// Types (portable) +// Types from shared package export type { UnifiedMessage, ParsedContent, ParsedMetadata, + MessageGroup, + AgentStatus, + StreamingToolCall, + StreamingMetadata, +} from '@agentpress/shared'; + +// Local type extensions +export type { ToolCallData, ToolResultData, - MessageGroup, StreamingState, - AgentStatus, ToolCallDisplayInfo, } from './types'; -// Streaming utilities (portable) +// Streaming utilities from shared package export { extractTextFromPartialJson, extractTextFromStreamingAskComplete, @@ -26,9 +32,7 @@ export { findAskOrCompleteTool, extractStreamingAskCompleteContent, shouldSkipStreamingRender, - type StreamingToolCall, - type StreamingMetadata, -} from './streaming-utils'; +} from '@agentpress/shared'; // Tool call utilities (portable) export { diff --git a/frontend/src/hooks/messages/utils/tool-call-utils.ts b/apps/frontend/src/hooks/messages/utils/tool-call-utils.ts similarity index 99% rename from frontend/src/hooks/messages/utils/tool-call-utils.ts rename to apps/frontend/src/hooks/messages/utils/tool-call-utils.ts index c3870fd90f..97c3a644d4 100644 --- a/frontend/src/hooks/messages/utils/tool-call-utils.ts +++ b/apps/frontend/src/hooks/messages/utils/tool-call-utils.ts @@ -3,7 +3,7 @@ * These are portable and can be used in both web and mobile apps */ -import { StreamingToolCall } from './streaming-utils'; +import type { StreamingToolCall } from '@agentpress/shared'; /** * Tool result data structure from metadata diff --git a/frontend/src/hooks/messages/utils/types.ts b/apps/frontend/src/hooks/messages/utils/types.ts similarity index 100% rename from frontend/src/hooks/messages/utils/types.ts rename to apps/frontend/src/hooks/messages/utils/types.ts diff --git a/frontend/src/hooks/onboarding/index.ts b/apps/frontend/src/hooks/onboarding/index.ts similarity index 100% rename from frontend/src/hooks/onboarding/index.ts rename to apps/frontend/src/hooks/onboarding/index.ts diff --git a/frontend/src/hooks/onboarding/use-onboarding.ts b/apps/frontend/src/hooks/onboarding/use-onboarding.ts similarity index 100% rename from frontend/src/hooks/onboarding/use-onboarding.ts rename to apps/frontend/src/hooks/onboarding/use-onboarding.ts diff --git a/frontend/src/hooks/referrals/use-referrals.ts b/apps/frontend/src/hooks/referrals/use-referrals.ts similarity index 100% rename from frontend/src/hooks/referrals/use-referrals.ts rename to apps/frontend/src/hooks/referrals/use-referrals.ts diff --git a/frontend/src/hooks/secure-mcp/use-secure-mcp.ts b/apps/frontend/src/hooks/secure-mcp/use-secure-mcp.ts similarity index 100% rename from frontend/src/hooks/secure-mcp/use-secure-mcp.ts rename to apps/frontend/src/hooks/secure-mcp/use-secure-mcp.ts diff --git a/frontend/src/hooks/sidebar/use-sidebar.ts b/apps/frontend/src/hooks/sidebar/use-sidebar.ts similarity index 100% rename from frontend/src/hooks/sidebar/use-sidebar.ts rename to apps/frontend/src/hooks/sidebar/use-sidebar.ts diff --git a/apps/frontend/src/hooks/streaming/types.ts b/apps/frontend/src/hooks/streaming/types.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/frontend/src/hooks/streaming/use-agent-stream.ts b/apps/frontend/src/hooks/streaming/use-agent-stream.ts new file mode 100644 index 0000000000..a723fede1e --- /dev/null +++ b/apps/frontend/src/hooks/streaming/use-agent-stream.ts @@ -0,0 +1,63 @@ +import { useState, useCallback } from 'react'; +import { UnifiedMessage } from '@/components/thread/types'; +import { useStreamConnection } from './use-stream-connection'; +import { useStreamState } from './use-stream-state'; +import { useStreamMessages, AgentStreamCallbacks } from './use-stream-messages'; +import { useToolCallAccumulator } from './use-tool-call-accumulator'; +import { stopAgent } from '@/lib/api/agents'; + +export interface UseAgentStreamResult { + status: string; + textContent: string; + toolCall: UnifiedMessage | null; + error: string | null; + agentRunId: string | null; + startStreaming: (runId: string) => Promise; + stopStreaming: () => Promise; +} + +export function useAgentStream( + callbacks: AgentStreamCallbacks, + threadId: string, + setMessages: (messages: UnifiedMessage[]) => void, + agentId?: string, +): UseAgentStreamResult { + const state = useStreamState(); + const toolCalls = useToolCallAccumulator(); + const messages = useStreamMessages(callbacks, state, toolCalls); + const connection = useStreamConnection( + messages.handleMessage, + messages.handleError, + messages.handleClose, + ); + + const [agentRunId, setAgentRunId] = useState(null); + + const startStreaming = useCallback(async (runId: string) => { + state.reset(); + toolCalls.reset(); + setAgentRunId(runId); + await connection.connect(runId); + }, [state, toolCalls, connection]); + + const stopStreaming = useCallback(async () => { + if (agentRunId) { + connection.disconnect(); + try { + await stopAgent(agentRunId); + } catch (error) { + console.error('Failed to stop agent:', error); + } + } + }, [agentRunId, connection]); + + return { + status: state.status, + textContent: state.orderedContent, + toolCall: toolCalls.current, + error: state.error, + agentRunId, + startStreaming, + stopStreaming, + }; +} diff --git a/apps/frontend/src/hooks/streaming/use-stream-connection.ts b/apps/frontend/src/hooks/streaming/use-stream-connection.ts new file mode 100644 index 0000000000..4e9b843f8b --- /dev/null +++ b/apps/frontend/src/hooks/streaming/use-stream-connection.ts @@ -0,0 +1,101 @@ +import { useState, useRef, useCallback } from "react"; +import { createClient } from "@/lib/supabase/client"; + +const SESSION_STORAGE_KEY = "agent-stream-sessions"; + +function getSessionId(agentRunId: string): string { + if (typeof window === "undefined") return ""; + + try { + const sessions = JSON.parse(localStorage.getItem(SESSION_STORAGE_KEY) || "{}"); + if (!sessions[agentRunId]) { + sessions[agentRunId] = crypto.randomUUID().slice(0, 8); + localStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(sessions)); + } + return sessions[agentRunId]; + } catch { + return crypto.randomUUID().slice(0, 8); + } +} + +async function getAccessToken(): Promise { + const supabase = createClient(); + const { + data: { session }, + } = await supabase.auth.getSession(); + + if (!session?.access_token) { + throw new Error("No access token available"); + } + + return session.access_token; +} + +export interface UseStreamConnectionResult { + state: "idle" | "connecting" | "connected" | "error"; + connect: (agentRunId: string) => Promise; + disconnect: () => void; +} + +export function useStreamConnection( + onMessage: (data: string) => void, + onError: (error: Error) => void, + onClose: () => void, +): UseStreamConnectionResult { + const eventSourceRef = useRef(null); + const [state, setState] = useState<"idle" | "connecting" | "connected" | "error">("idle"); + + const connect = useCallback(async (agentRunId: string) => { + if (eventSourceRef.current) { + eventSourceRef.current.close(); + } + + setState("connecting"); + + try { + const sessionId = getSessionId(agentRunId); + const token = await getAccessToken(); + + const API_URL = process.env.NEXT_PUBLIC_BACKEND_URL || ""; + const url = new URL(`${API_URL}/v1/streaming/${agentRunId}`); + url.searchParams.set("session_id", sessionId); + url.searchParams.set("token", token); + + const es = new EventSource(url.toString()); + eventSourceRef.current = es; + + es.onopen = () => { + setState("connected"); + }; + + es.onmessage = (event) => { + if (event.data) { + if (event.data.startsWith("data: ")) { + onMessage(event.data); + } else { + onMessage(`data: ${event.data}`); + } + } + }; + + es.onerror = () => { + setState("error"); + onError(new Error("Stream connection failed")); + }; + } catch (error) { + setState("error"); + onError(error instanceof Error ? error : new Error("Failed to connect to stream")); + } + }, [onMessage, onError]); + + const disconnect = useCallback(() => { + if (eventSourceRef.current) { + eventSourceRef.current.close(); + eventSourceRef.current = null; + } + setState("idle"); + onClose(); + }, [onClose]); + + return { state, connect, disconnect }; +} diff --git a/apps/frontend/src/hooks/streaming/use-stream-messages.ts b/apps/frontend/src/hooks/streaming/use-stream-messages.ts new file mode 100644 index 0000000000..463dda77fc --- /dev/null +++ b/apps/frontend/src/hooks/streaming/use-stream-messages.ts @@ -0,0 +1,127 @@ +import { useCallback, useRef } from "react"; +import { validateMessage, ChunkMessage, StatusMessage, ToolCallMessage, ToolOutputMessage, MessageType } from "./types"; +import { UnifiedMessage } from "@/components/thread/types"; +import { UseStreamStateResult } from "./use-stream-state"; +import { UseToolCallAccumulatorResult } from "./use-tool-call-accumulator"; + +export interface AgentStreamCallbacks { + onMessage: (message: UnifiedMessage) => void; + onStatusChange?: (status: string) => void; + onError?: (error: string) => void; + onClose?: (finalStatus: string) => void; + onAssistantStart?: () => void; + onAssistantChunk?: (chunk: { content: string }) => void; + onToolCallChunk?: (message: UnifiedMessage) => void; + onToolOutputStream?: (data: { tool_call_id: string; tool_name: string; output: string; is_final: boolean }) => void; +} + +export interface UseStreamMessagesResult { + handleMessage: (data: string) => void; + handleError: (error: Error) => void; + handleClose: () => void; +} + +export function useStreamMessages( + callbacks: AgentStreamCallbacks, + state: UseStreamStateResult, + toolCalls: UseToolCallAccumulatorResult, +): UseStreamMessagesResult { + const callbacksRef = useRef(callbacks); + callbacksRef.current = callbacks; + + const handleMessage = useCallback((data: string) => { + try { + let jsonData: any; + if (data.startsWith("data: ")) { + jsonData = JSON.parse(data.slice(6)); + } else { + jsonData = JSON.parse(data); + } + + const message = validateMessage(jsonData); + if (!message) { + if (jsonData.type === "assistant" && jsonData.content) { + const contentObj = typeof jsonData.content === "string" ? JSON.parse(jsonData.content) : jsonData.content; + if (contentObj.content) { + const chunk: ChunkMessage = { + type: MessageType.CHUNK, + content: contentObj.content, + thread_id: jsonData.thread_id || "", + sequence: jsonData.sequence, + }; + state.appendChunk(chunk); + callbacksRef.current.onAssistantChunk?.({ content: contentObj.content }); + } + } + return; + } + + switch (message.type) { + case MessageType.CHUNK: + const chunk = message as ChunkMessage; + state.appendChunk(chunk); + callbacksRef.current.onAssistantChunk?.({ content: chunk.content }); + state.setStatus("streaming"); + break; + + case MessageType.STATUS: + const statusMsg = message as StatusMessage; + state.setStatus(statusMsg.status); + callbacksRef.current.onStatusChange?.(statusMsg.status); + + if (["completed", "stopped", "failed", "error"].includes(statusMsg.status)) { + callbacksRef.current.onClose?.(statusMsg.status); + } + break; + + case MessageType.TOOL_CALL: + const toolCallMsg = message as ToolCallMessage; + toolCalls.handleToolCallDelta(toolCallMsg); + if (toolCalls.current) { + callbacksRef.current.onToolCallChunk?.(toolCalls.current); + } + break; + + case MessageType.TOOL_OUTPUT: + const toolOutputMsg = message as ToolOutputMessage; + toolCalls.handleToolOutput(toolOutputMsg); + callbacksRef.current.onToolOutputStream?.({ + tool_call_id: toolOutputMsg.tool_call_id, + tool_name: toolOutputMsg.tool_name, + output: toolOutputMsg.output, + is_final: toolOutputMsg.is_final ?? false, + }); + break; + + case MessageType.LLM_RESPONSE_START: + callbacksRef.current.onAssistantStart?.(); + break; + + case MessageType.ERROR: + const errorMsg = message as any; + state.setError(errorMsg.error || errorMsg.message || "Unknown error"); + state.setStatus("error"); + callbacksRef.current.onError?.(errorMsg.error || errorMsg.message || "Unknown error"); + break; + + case MessageType.PING: + break; + } + } catch (error) { + console.error("Error parsing stream message:", error); + callbacksRef.current.onError?.(error instanceof Error ? error.message : "Failed to parse message"); + } + }, [state, toolCalls]); + + const handleError = useCallback((error: Error) => { + state.setError(error.message); + state.setStatus("error"); + callbacksRef.current.onError?.(error.message); + }, [state]); + + const handleClose = useCallback(() => { + callbacksRef.current.onClose?.("disconnected"); + }, []); + + return { handleMessage, handleError, handleClose }; +} diff --git a/apps/frontend/src/hooks/streaming/use-stream-state.ts b/apps/frontend/src/hooks/streaming/use-stream-state.ts new file mode 100644 index 0000000000..745dd02055 --- /dev/null +++ b/apps/frontend/src/hooks/streaming/use-stream-state.ts @@ -0,0 +1,69 @@ +import { useState, useRef, useCallback, useMemo } from "react"; +import { ChunkMessage } from "./types"; + +type StreamStatus = "idle" | "connecting" | "streaming" | "completed" | "stopped" | "failed" | "error"; + +export interface UseStreamStateResult { + status: StreamStatus; + setStatus: (status: StreamStatus) => void; + orderedContent: string; + error: string | null; + setError: (error: string | null) => void; + appendChunk: (chunk: ChunkMessage) => void; + reset: () => void; +} + +export function useStreamState(): UseStreamStateResult { + const [status, setStatus] = useState("idle"); + const [chunks, setChunks] = useState([]); + const [error, setError] = useState(null); + + const pendingRef = useRef([]); + const rafRef = useRef(null); + + const flush = useCallback(() => { + if (pendingRef.current.length > 0) { + const pending = pendingRef.current; + pendingRef.current = []; + setChunks(prev => { + const combined = [...prev, ...pending]; + const deduplicated = new Map(); + for (const chunk of combined) { + const seq = chunk.sequence ?? 0; + if (!deduplicated.has(seq) || (deduplicated.get(seq)?.sequence ?? 0) < seq) { + deduplicated.set(seq, chunk); + } + } + return Array.from(deduplicated.values()).sort((a, b) => + (a.sequence ?? 0) - (b.sequence ?? 0) + ); + }); + } + rafRef.current = null; + }, []); + + const appendChunk = useCallback((chunk: ChunkMessage) => { + pendingRef.current.push(chunk); + if (!rafRef.current) { + rafRef.current = requestAnimationFrame(flush); + } + }, [flush]); + + const orderedContent = useMemo(() => + chunks.map(c => c.content).join(""), + [chunks] + ); + + const reset = useCallback(() => { + if (rafRef.current) { + cancelAnimationFrame(rafRef.current); + rafRef.current = null; + } + pendingRef.current = []; + setChunks([]); + setStatus("idle"); + setError(null); + }, []); + + return { status, setStatus, orderedContent, error, setError, appendChunk, reset }; +} diff --git a/frontend/src/hooks/threads/index.ts b/apps/frontend/src/hooks/threads/index.ts similarity index 100% rename from frontend/src/hooks/threads/index.ts rename to apps/frontend/src/hooks/threads/index.ts diff --git a/frontend/src/hooks/threads/keys.ts b/apps/frontend/src/hooks/threads/keys.ts similarity index 100% rename from frontend/src/hooks/threads/keys.ts rename to apps/frontend/src/hooks/threads/keys.ts diff --git a/frontend/src/hooks/threads/page/index.ts b/apps/frontend/src/hooks/threads/page/index.ts similarity index 100% rename from frontend/src/hooks/threads/page/index.ts rename to apps/frontend/src/hooks/threads/page/index.ts diff --git a/frontend/src/hooks/threads/page/use-thread-data.ts b/apps/frontend/src/hooks/threads/page/use-thread-data.ts similarity index 100% rename from frontend/src/hooks/threads/page/use-thread-data.ts rename to apps/frontend/src/hooks/threads/page/use-thread-data.ts diff --git a/frontend/src/hooks/threads/page/use-thread-keyboard-shortcuts.ts b/apps/frontend/src/hooks/threads/page/use-thread-keyboard-shortcuts.ts similarity index 100% rename from frontend/src/hooks/threads/page/use-thread-keyboard-shortcuts.ts rename to apps/frontend/src/hooks/threads/page/use-thread-keyboard-shortcuts.ts diff --git a/frontend/src/hooks/threads/use-agent-run.ts b/apps/frontend/src/hooks/threads/use-agent-run.ts similarity index 100% rename from frontend/src/hooks/threads/use-agent-run.ts rename to apps/frontend/src/hooks/threads/use-agent-run.ts diff --git a/frontend/src/hooks/threads/use-optimistic-agent-start.ts b/apps/frontend/src/hooks/threads/use-optimistic-agent-start.ts similarity index 99% rename from frontend/src/hooks/threads/use-optimistic-agent-start.ts rename to apps/frontend/src/hooks/threads/use-optimistic-agent-start.ts index 654447bbd3..95cbeb106a 100644 --- a/frontend/src/hooks/threads/use-optimistic-agent-start.ts +++ b/apps/frontend/src/hooks/threads/use-optimistic-agent-start.ts @@ -23,7 +23,6 @@ export interface OptimisticAgentStartOptions { fileIds?: string[]; modelName?: string; agentId?: string; - memoryEnabled?: boolean; } export interface OptimisticAgentStartResult { @@ -138,7 +137,7 @@ export function useOptimisticAgentStart( const startAgent = useCallback(async ( options: OptimisticAgentStartOptions ): Promise => { - const { message, files = [], fileIds = [], modelName, agentId, memoryEnabled = true } = options; + const { message, files = [], fileIds = [], modelName, agentId } = options; const trimmedMessage = message.trim(); if (!trimmedMessage && files.length === 0 && fileIds.length === 0) { @@ -197,7 +196,6 @@ export function useOptimisticAgentStart( file_ids: fileIds.length > 0 ? fileIds : undefined, model_name: modelName, agent_id: agentId || undefined, - memory_enabled: memoryEnabled, }).then((response) => { console.log('[OptimisticAgentStart] API succeeded, response:', response); // Invalidate all relevant queries so the thread page picks up the new data diff --git a/frontend/src/hooks/threads/use-project.ts b/apps/frontend/src/hooks/threads/use-project.ts similarity index 100% rename from frontend/src/hooks/threads/use-project.ts rename to apps/frontend/src/hooks/threads/use-project.ts diff --git a/frontend/src/hooks/threads/use-thread-agent-status.ts b/apps/frontend/src/hooks/threads/use-thread-agent-status.ts similarity index 100% rename from frontend/src/hooks/threads/use-thread-agent-status.ts rename to apps/frontend/src/hooks/threads/use-thread-agent-status.ts diff --git a/frontend/src/hooks/threads/use-thread-mutations.ts b/apps/frontend/src/hooks/threads/use-thread-mutations.ts similarity index 100% rename from frontend/src/hooks/threads/use-thread-mutations.ts rename to apps/frontend/src/hooks/threads/use-thread-mutations.ts diff --git a/frontend/src/hooks/threads/use-threads.ts b/apps/frontend/src/hooks/threads/use-threads.ts similarity index 100% rename from frontend/src/hooks/threads/use-threads.ts rename to apps/frontend/src/hooks/threads/use-threads.ts diff --git a/frontend/src/hooks/threads/useProjectRealtime.ts b/apps/frontend/src/hooks/threads/useProjectRealtime.ts similarity index 100% rename from frontend/src/hooks/threads/useProjectRealtime.ts rename to apps/frontend/src/hooks/threads/useProjectRealtime.ts diff --git a/frontend/src/hooks/threads/utils.ts b/apps/frontend/src/hooks/threads/utils.ts similarity index 100% rename from frontend/src/hooks/threads/utils.ts rename to apps/frontend/src/hooks/threads/utils.ts diff --git a/frontend/src/hooks/tools/use-tools-metadata.ts b/apps/frontend/src/hooks/tools/use-tools-metadata.ts similarity index 100% rename from frontend/src/hooks/tools/use-tools-metadata.ts rename to apps/frontend/src/hooks/tools/use-tools-metadata.ts diff --git a/frontend/src/hooks/transcription/use-transcription.ts b/apps/frontend/src/hooks/transcription/use-transcription.ts similarity index 100% rename from frontend/src/hooks/transcription/use-transcription.ts rename to apps/frontend/src/hooks/transcription/use-transcription.ts diff --git a/frontend/src/hooks/triggers/index.ts b/apps/frontend/src/hooks/triggers/index.ts similarity index 100% rename from frontend/src/hooks/triggers/index.ts rename to apps/frontend/src/hooks/triggers/index.ts diff --git a/frontend/src/hooks/triggers/use-agent-triggers.ts b/apps/frontend/src/hooks/triggers/use-agent-triggers.ts similarity index 100% rename from frontend/src/hooks/triggers/use-agent-triggers.ts rename to apps/frontend/src/hooks/triggers/use-agent-triggers.ts diff --git a/frontend/src/hooks/triggers/use-all-triggers.ts b/apps/frontend/src/hooks/triggers/use-all-triggers.ts similarity index 100% rename from frontend/src/hooks/triggers/use-all-triggers.ts rename to apps/frontend/src/hooks/triggers/use-all-triggers.ts diff --git a/frontend/src/hooks/triggers/use-oauth-integrations.ts b/apps/frontend/src/hooks/triggers/use-oauth-integrations.ts similarity index 100% rename from frontend/src/hooks/triggers/use-oauth-integrations.ts rename to apps/frontend/src/hooks/triggers/use-oauth-integrations.ts diff --git a/frontend/src/hooks/triggers/use-trigger-executions.ts b/apps/frontend/src/hooks/triggers/use-trigger-executions.ts similarity index 100% rename from frontend/src/hooks/triggers/use-trigger-executions.ts rename to apps/frontend/src/hooks/triggers/use-trigger-executions.ts diff --git a/frontend/src/hooks/triggers/use-trigger-providers.ts b/apps/frontend/src/hooks/triggers/use-trigger-providers.ts similarity index 100% rename from frontend/src/hooks/triggers/use-trigger-providers.ts rename to apps/frontend/src/hooks/triggers/use-trigger-providers.ts diff --git a/frontend/src/hooks/usage/use-health.ts b/apps/frontend/src/hooks/usage/use-health.ts similarity index 100% rename from frontend/src/hooks/usage/use-health.ts rename to apps/frontend/src/hooks/usage/use-health.ts diff --git a/frontend/src/hooks/use-file-data.ts b/apps/frontend/src/hooks/use-file-data.ts similarity index 100% rename from frontend/src/hooks/use-file-data.ts rename to apps/frontend/src/hooks/use-file-data.ts diff --git a/frontend/src/hooks/use-language.ts b/apps/frontend/src/hooks/use-language.ts similarity index 100% rename from frontend/src/hooks/use-language.ts rename to apps/frontend/src/hooks/use-language.ts diff --git a/frontend/src/hooks/use-presence.ts b/apps/frontend/src/hooks/use-presence.ts similarity index 100% rename from frontend/src/hooks/use-presence.ts rename to apps/frontend/src/hooks/use-presence.ts diff --git a/frontend/src/hooks/use-user-currency.ts b/apps/frontend/src/hooks/use-user-currency.ts similarity index 100% rename from frontend/src/hooks/use-user-currency.ts rename to apps/frontend/src/hooks/use-user-currency.ts diff --git a/frontend/src/hooks/utils/index.ts b/apps/frontend/src/hooks/utils/index.ts similarity index 100% rename from frontend/src/hooks/utils/index.ts rename to apps/frontend/src/hooks/utils/index.ts diff --git a/frontend/src/hooks/utils/use-github-stars.ts b/apps/frontend/src/hooks/utils/use-github-stars.ts similarity index 100% rename from frontend/src/hooks/utils/use-github-stars.ts rename to apps/frontend/src/hooks/utils/use-github-stars.ts diff --git a/frontend/src/hooks/utils/use-holiday-promo.ts b/apps/frontend/src/hooks/utils/use-holiday-promo.ts similarity index 100% rename from frontend/src/hooks/utils/use-holiday-promo.ts rename to apps/frontend/src/hooks/utils/use-holiday-promo.ts diff --git a/frontend/src/hooks/utils/use-leading-debounced-callback.ts b/apps/frontend/src/hooks/utils/use-leading-debounced-callback.ts similarity index 100% rename from frontend/src/hooks/utils/use-leading-debounced-callback.ts rename to apps/frontend/src/hooks/utils/use-leading-debounced-callback.ts diff --git a/frontend/src/hooks/utils/use-media-query.ts b/apps/frontend/src/hooks/utils/use-media-query.ts similarity index 100% rename from frontend/src/hooks/utils/use-media-query.ts rename to apps/frontend/src/hooks/utils/use-media-query.ts diff --git a/frontend/src/hooks/utils/use-mobile.ts b/apps/frontend/src/hooks/utils/use-mobile.ts similarity index 100% rename from frontend/src/hooks/utils/use-mobile.ts rename to apps/frontend/src/hooks/utils/use-mobile.ts diff --git a/frontend/src/hooks/utils/use-promo.ts b/apps/frontend/src/hooks/utils/use-promo.ts similarity index 100% rename from frontend/src/hooks/utils/use-promo.ts rename to apps/frontend/src/hooks/utils/use-promo.ts diff --git a/frontend/src/hooks/utils/use-suna-modes-persistence.ts b/apps/frontend/src/hooks/utils/use-suna-modes-persistence.ts similarity index 100% rename from frontend/src/hooks/utils/use-suna-modes-persistence.ts rename to apps/frontend/src/hooks/utils/use-suna-modes-persistence.ts diff --git a/frontend/src/i18n/config.ts b/apps/frontend/src/i18n/config.ts similarity index 100% rename from frontend/src/i18n/config.ts rename to apps/frontend/src/i18n/config.ts diff --git a/frontend/src/i18n/request.ts b/apps/frontend/src/i18n/request.ts similarity index 100% rename from frontend/src/i18n/request.ts rename to apps/frontend/src/i18n/request.ts diff --git a/frontend/src/lib/analytics/gtm.ts b/apps/frontend/src/lib/analytics/gtm.ts similarity index 100% rename from frontend/src/lib/analytics/gtm.ts rename to apps/frontend/src/lib/analytics/gtm.ts diff --git a/frontend/src/lib/api-client.ts b/apps/frontend/src/lib/api-client.ts similarity index 100% rename from frontend/src/lib/api-client.ts rename to apps/frontend/src/lib/api-client.ts diff --git a/frontend/src/lib/api/agents.ts b/apps/frontend/src/lib/api/agents.ts similarity index 100% rename from frontend/src/lib/api/agents.ts rename to apps/frontend/src/lib/api/agents.ts diff --git a/frontend/src/lib/api/api-keys.ts b/apps/frontend/src/lib/api/api-keys.ts similarity index 100% rename from frontend/src/lib/api/api-keys.ts rename to apps/frontend/src/lib/api/api-keys.ts diff --git a/frontend/src/lib/api/billing.ts b/apps/frontend/src/lib/api/billing.ts similarity index 100% rename from frontend/src/lib/api/billing.ts rename to apps/frontend/src/lib/api/billing.ts diff --git a/frontend/src/lib/api/errors.ts b/apps/frontend/src/lib/api/errors.ts similarity index 100% rename from frontend/src/lib/api/errors.ts rename to apps/frontend/src/lib/api/errors.ts diff --git a/frontend/src/lib/api/health.ts b/apps/frontend/src/lib/api/health.ts similarity index 100% rename from frontend/src/lib/api/health.ts rename to apps/frontend/src/lib/api/health.ts diff --git a/frontend/src/lib/api/memory.ts b/apps/frontend/src/lib/api/memory.ts similarity index 100% rename from frontend/src/lib/api/memory.ts rename to apps/frontend/src/lib/api/memory.ts diff --git a/frontend/src/lib/api/notifications.ts b/apps/frontend/src/lib/api/notifications.ts similarity index 100% rename from frontend/src/lib/api/notifications.ts rename to apps/frontend/src/lib/api/notifications.ts diff --git a/frontend/src/lib/api/phone-verification.ts b/apps/frontend/src/lib/api/phone-verification.ts similarity index 100% rename from frontend/src/lib/api/phone-verification.ts rename to apps/frontend/src/lib/api/phone-verification.ts diff --git a/frontend/src/lib/api/referrals.ts b/apps/frontend/src/lib/api/referrals.ts similarity index 100% rename from frontend/src/lib/api/referrals.ts rename to apps/frontend/src/lib/api/referrals.ts diff --git a/frontend/src/lib/api/sandbox.ts b/apps/frontend/src/lib/api/sandbox.ts similarity index 100% rename from frontend/src/lib/api/sandbox.ts rename to apps/frontend/src/lib/api/sandbox.ts diff --git a/frontend/src/lib/api/streaming.ts b/apps/frontend/src/lib/api/streaming.ts similarity index 100% rename from frontend/src/lib/api/streaming.ts rename to apps/frontend/src/lib/api/streaming.ts diff --git a/frontend/src/lib/api/threads.ts b/apps/frontend/src/lib/api/threads.ts similarity index 100% rename from frontend/src/lib/api/threads.ts rename to apps/frontend/src/lib/api/threads.ts diff --git a/frontend/src/lib/api/transcription.ts b/apps/frontend/src/lib/api/transcription.ts similarity index 100% rename from frontend/src/lib/api/transcription.ts rename to apps/frontend/src/lib/api/transcription.ts diff --git a/frontend/src/lib/api/usage.ts b/apps/frontend/src/lib/api/usage.ts similarity index 100% rename from frontend/src/lib/api/usage.ts rename to apps/frontend/src/lib/api/usage.ts diff --git a/frontend/src/lib/config.ts b/apps/frontend/src/lib/config.ts similarity index 100% rename from frontend/src/lib/config.ts rename to apps/frontend/src/lib/config.ts diff --git a/frontend/src/lib/constants/upload-limits.ts b/apps/frontend/src/lib/constants/upload-limits.ts similarity index 100% rename from frontend/src/lib/constants/upload-limits.ts rename to apps/frontend/src/lib/constants/upload-limits.ts diff --git a/frontend/src/lib/edge-flags.ts b/apps/frontend/src/lib/edge-flags.ts similarity index 100% rename from frontend/src/lib/edge-flags.ts rename to apps/frontend/src/lib/edge-flags.ts diff --git a/frontend/src/lib/empty-module.ts b/apps/frontend/src/lib/empty-module.ts similarity index 100% rename from frontend/src/lib/empty-module.ts rename to apps/frontend/src/lib/empty-module.ts diff --git a/frontend/src/lib/error-handler.ts b/apps/frontend/src/lib/error-handler.ts similarity index 100% rename from frontend/src/lib/error-handler.ts rename to apps/frontend/src/lib/error-handler.ts diff --git a/frontend/src/lib/feature-flags.ts b/apps/frontend/src/lib/feature-flags.ts similarity index 100% rename from frontend/src/lib/feature-flags.ts rename to apps/frontend/src/lib/feature-flags.ts diff --git a/apps/frontend/src/lib/icons/tool-icons.ts b/apps/frontend/src/lib/icons/tool-icons.ts new file mode 100644 index 0000000000..956755b894 --- /dev/null +++ b/apps/frontend/src/lib/icons/tool-icons.ts @@ -0,0 +1,85 @@ +/** + * Tool icon resolver for frontend (lucide-react) + * Uses shared icon keys but resolves to actual React components + */ + +import type { ElementType } from 'react'; +import { getToolIconKey } from '@agentpress/shared'; +import type { ToolIconKey } from '@agentpress/shared'; +import { + Globe, + FileEdit, + FileSearch, + FilePlus, + FileText, + FileX, + List, + ListTodo, + Terminal, + Computer, + Search, + ExternalLink, + Network, + Table2, + Code, + Phone, + PhoneOff, + MessageCircleQuestion, + CheckCircle2, + Wrench, + BookOpen, + Plug, + Clock, + Presentation, + ImageIcon, + Pencil, + Hammer, +} from 'lucide-react'; + +/** + * Map icon keys to lucide-react components + */ +const ICON_MAP: Record = { + 'globe': Globe, + 'file-edit': FileEdit, + 'file-search': FileSearch, + 'file-plus': FilePlus, + 'file-text': FileText, + 'file-x': FileX, + 'list': List, + 'list-todo': ListTodo, + 'terminal': Terminal, + 'computer': Computer, + 'search': Search, + 'external-link': ExternalLink, + 'network': Network, + 'table': Table2, + 'code': Code, + 'phone': Phone, + 'phone-off': PhoneOff, + 'message-question': MessageCircleQuestion, + 'check-circle': CheckCircle2, + 'wrench': Wrench, + 'book-open': BookOpen, + 'plug': Plug, + 'clock': Clock, + 'presentation': Presentation, + 'image': ImageIcon, + 'pencil': Pencil, + 'hammer': Hammer, +}; + +/** + * Get the icon component for a tool name + * + * @param toolName - The tool name + * @returns The React component for the icon + */ +export function getToolIcon(toolName: string): ElementType { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} + +// Re-export the icon key function for type checking +export { getToolIconKey, type ToolIconKey }; + diff --git a/frontend/src/lib/mermaid-utils.ts b/apps/frontend/src/lib/mermaid-utils.ts similarity index 100% rename from frontend/src/lib/mermaid-utils.ts rename to apps/frontend/src/lib/mermaid-utils.ts diff --git a/frontend/src/lib/model-provider-icons.tsx b/apps/frontend/src/lib/model-provider-icons.tsx similarity index 100% rename from frontend/src/lib/model-provider-icons.tsx rename to apps/frontend/src/lib/model-provider-icons.tsx diff --git a/frontend/src/lib/polyfills.ts b/apps/frontend/src/lib/polyfills.ts similarity index 100% rename from frontend/src/lib/polyfills.ts rename to apps/frontend/src/lib/polyfills.ts diff --git a/frontend/src/lib/pricing-config.ts b/apps/frontend/src/lib/pricing-config.ts similarity index 100% rename from frontend/src/lib/pricing-config.ts rename to apps/frontend/src/lib/pricing-config.ts diff --git a/frontend/src/lib/site-config.ts b/apps/frontend/src/lib/site-config.ts similarity index 100% rename from frontend/src/lib/site-config.ts rename to apps/frontend/src/lib/site-config.ts diff --git a/frontend/src/lib/site-metadata.ts b/apps/frontend/src/lib/site-metadata.ts similarity index 100% rename from frontend/src/lib/site-metadata.ts rename to apps/frontend/src/lib/site-metadata.ts diff --git a/frontend/src/lib/supabase/client.ts b/apps/frontend/src/lib/supabase/client.ts similarity index 100% rename from frontend/src/lib/supabase/client.ts rename to apps/frontend/src/lib/supabase/client.ts diff --git a/frontend/src/lib/supabase/handle-edge-error.ts b/apps/frontend/src/lib/supabase/handle-edge-error.ts similarity index 100% rename from frontend/src/lib/supabase/handle-edge-error.ts rename to apps/frontend/src/lib/supabase/handle-edge-error.ts diff --git a/frontend/src/lib/supabase/mfa.ts b/apps/frontend/src/lib/supabase/mfa.ts similarity index 100% rename from frontend/src/lib/supabase/mfa.ts rename to apps/frontend/src/lib/supabase/mfa.ts diff --git a/frontend/src/lib/supabase/server.ts b/apps/frontend/src/lib/supabase/server.ts similarity index 100% rename from frontend/src/lib/supabase/server.ts rename to apps/frontend/src/lib/supabase/server.ts diff --git a/frontend/src/lib/utils.ts b/apps/frontend/src/lib/utils.ts similarity index 100% rename from frontend/src/lib/utils.ts rename to apps/frontend/src/lib/utils.ts diff --git a/frontend/src/lib/utils/clear-local-storage.ts b/apps/frontend/src/lib/utils/clear-local-storage.ts similarity index 100% rename from frontend/src/lib/utils/clear-local-storage.ts rename to apps/frontend/src/lib/utils/clear-local-storage.ts diff --git a/frontend/src/lib/utils/credit-formatter.ts b/apps/frontend/src/lib/utils/credit-formatter.ts similarity index 100% rename from frontend/src/lib/utils/credit-formatter.ts rename to apps/frontend/src/lib/utils/credit-formatter.ts diff --git a/frontend/src/lib/utils/currency.ts b/apps/frontend/src/lib/utils/currency.ts similarity index 100% rename from frontend/src/lib/utils/currency.ts rename to apps/frontend/src/lib/utils/currency.ts diff --git a/frontend/src/lib/utils/date-formatting.ts b/apps/frontend/src/lib/utils/date-formatting.ts similarity index 100% rename from frontend/src/lib/utils/date-formatting.ts rename to apps/frontend/src/lib/utils/date-formatting.ts diff --git a/frontend/src/lib/utils/dirty-string-parser.ts b/apps/frontend/src/lib/utils/dirty-string-parser.ts similarity index 100% rename from frontend/src/lib/utils/dirty-string-parser.ts rename to apps/frontend/src/lib/utils/dirty-string-parser.ts diff --git a/frontend/src/lib/utils/document-export.ts b/apps/frontend/src/lib/utils/document-export.ts similarity index 100% rename from frontend/src/lib/utils/document-export.ts rename to apps/frontend/src/lib/utils/document-export.ts diff --git a/frontend/src/lib/utils/file-types.ts b/apps/frontend/src/lib/utils/file-types.ts similarity index 100% rename from frontend/src/lib/utils/file-types.ts rename to apps/frontend/src/lib/utils/file-types.ts diff --git a/frontend/src/lib/utils/file-utils.ts b/apps/frontend/src/lib/utils/file-utils.ts similarity index 100% rename from frontend/src/lib/utils/file-utils.ts rename to apps/frontend/src/lib/utils/file-utils.ts diff --git a/frontend/src/lib/utils/geo-detection-server.ts b/apps/frontend/src/lib/utils/geo-detection-server.ts similarity index 100% rename from frontend/src/lib/utils/geo-detection-server.ts rename to apps/frontend/src/lib/utils/geo-detection-server.ts diff --git a/frontend/src/lib/utils/geo-detection.ts b/apps/frontend/src/lib/utils/geo-detection.ts similarity index 100% rename from frontend/src/lib/utils/geo-detection.ts rename to apps/frontend/src/lib/utils/geo-detection.ts diff --git a/frontend/src/lib/utils/google-docs-utils.ts b/apps/frontend/src/lib/utils/google-docs-utils.ts similarity index 100% rename from frontend/src/lib/utils/google-docs-utils.ts rename to apps/frontend/src/lib/utils/google-docs-utils.ts diff --git a/frontend/src/lib/utils/icon-utils.ts b/apps/frontend/src/lib/utils/icon-utils.ts similarity index 100% rename from frontend/src/lib/utils/icon-utils.ts rename to apps/frontend/src/lib/utils/icon-utils.ts diff --git a/frontend/src/lib/utils/is-electron.ts b/apps/frontend/src/lib/utils/is-electron.ts similarity index 100% rename from frontend/src/lib/utils/is-electron.ts rename to apps/frontend/src/lib/utils/is-electron.ts diff --git a/frontend/src/lib/utils/is-mobile-device.ts b/apps/frontend/src/lib/utils/is-mobile-device.ts similarity index 100% rename from frontend/src/lib/utils/is-mobile-device.ts rename to apps/frontend/src/lib/utils/is-mobile-device.ts diff --git a/frontend/src/lib/utils/tool-parser.ts b/apps/frontend/src/lib/utils/tool-parser.ts similarity index 100% rename from frontend/src/lib/utils/tool-parser.ts rename to apps/frontend/src/lib/utils/tool-parser.ts diff --git a/frontend/src/lib/utils/unicode.ts b/apps/frontend/src/lib/utils/unicode.ts similarity index 100% rename from frontend/src/lib/utils/unicode.ts rename to apps/frontend/src/lib/utils/unicode.ts diff --git a/frontend/src/lib/utils/url-autolink.ts b/apps/frontend/src/lib/utils/url-autolink.ts similarity index 100% rename from frontend/src/lib/utils/url-autolink.ts rename to apps/frontend/src/lib/utils/url-autolink.ts diff --git a/frontend/src/lib/utils/url.ts b/apps/frontend/src/lib/utils/url.ts similarity index 100% rename from frontend/src/lib/utils/url.ts rename to apps/frontend/src/lib/utils/url.ts diff --git a/frontend/src/lib/validation.ts b/apps/frontend/src/lib/validation.ts similarity index 100% rename from frontend/src/lib/validation.ts rename to apps/frontend/src/lib/validation.ts diff --git a/frontend/src/middleware.ts b/apps/frontend/src/middleware.ts similarity index 100% rename from frontend/src/middleware.ts rename to apps/frontend/src/middleware.ts diff --git a/frontend/src/stores/agent-selection-store.ts b/apps/frontend/src/stores/agent-selection-store.ts similarity index 100% rename from frontend/src/stores/agent-selection-store.ts rename to apps/frontend/src/stores/agent-selection-store.ts diff --git a/frontend/src/stores/agent-version-store.ts b/apps/frontend/src/stores/agent-version-store.ts similarity index 100% rename from frontend/src/stores/agent-version-store.ts rename to apps/frontend/src/stores/agent-version-store.ts diff --git a/frontend/src/stores/announcement-store.ts b/apps/frontend/src/stores/announcement-store.ts similarity index 100% rename from frontend/src/stores/announcement-store.ts rename to apps/frontend/src/stores/announcement-store.ts diff --git a/frontend/src/stores/auth-tracking.ts b/apps/frontend/src/stores/auth-tracking.ts similarity index 100% rename from frontend/src/stores/auth-tracking.ts rename to apps/frontend/src/stores/auth-tracking.ts diff --git a/frontend/src/stores/context-usage-store.ts b/apps/frontend/src/stores/context-usage-store.ts similarity index 100% rename from frontend/src/stores/context-usage-store.ts rename to apps/frontend/src/stores/context-usage-store.ts diff --git a/frontend/src/stores/delete-operation-store.ts b/apps/frontend/src/stores/delete-operation-store.ts similarity index 100% rename from frontend/src/stores/delete-operation-store.ts rename to apps/frontend/src/stores/delete-operation-store.ts diff --git a/frontend/src/stores/kortix-computer-store.ts b/apps/frontend/src/stores/kortix-computer-store.ts similarity index 100% rename from frontend/src/stores/kortix-computer-store.ts rename to apps/frontend/src/stores/kortix-computer-store.ts diff --git a/frontend/src/stores/message-queue-store.ts b/apps/frontend/src/stores/message-queue-store.ts similarity index 100% rename from frontend/src/stores/message-queue-store.ts rename to apps/frontend/src/stores/message-queue-store.ts diff --git a/frontend/src/stores/model-store.ts b/apps/frontend/src/stores/model-store.ts similarity index 100% rename from frontend/src/stores/model-store.ts rename to apps/frontend/src/stores/model-store.ts diff --git a/frontend/src/stores/optimistic-files-store.ts b/apps/frontend/src/stores/optimistic-files-store.ts similarity index 100% rename from frontend/src/stores/optimistic-files-store.ts rename to apps/frontend/src/stores/optimistic-files-store.ts diff --git a/frontend/src/stores/presentation-viewer-store.tsx b/apps/frontend/src/stores/presentation-viewer-store.tsx similarity index 100% rename from frontend/src/stores/presentation-viewer-store.tsx rename to apps/frontend/src/stores/presentation-viewer-store.tsx diff --git a/frontend/src/stores/pricing-modal-store.ts b/apps/frontend/src/stores/pricing-modal-store.ts similarity index 100% rename from frontend/src/stores/pricing-modal-store.ts rename to apps/frontend/src/stores/pricing-modal-store.ts diff --git a/frontend/src/stores/referral-dialog.ts b/apps/frontend/src/stores/referral-dialog.ts similarity index 100% rename from frontend/src/stores/referral-dialog.ts rename to apps/frontend/src/stores/referral-dialog.ts diff --git a/frontend/src/stores/spreadsheet-store.ts b/apps/frontend/src/stores/spreadsheet-store.ts similarity index 100% rename from frontend/src/stores/spreadsheet-store.ts rename to apps/frontend/src/stores/spreadsheet-store.ts diff --git a/frontend/src/stores/subscription-store.tsx b/apps/frontend/src/stores/subscription-store.tsx similarity index 100% rename from frontend/src/stores/subscription-store.tsx rename to apps/frontend/src/stores/subscription-store.tsx diff --git a/frontend/src/stores/suna-modes-store.ts b/apps/frontend/src/stores/suna-modes-store.ts similarity index 100% rename from frontend/src/stores/suna-modes-store.ts rename to apps/frontend/src/stores/suna-modes-store.ts diff --git a/frontend/src/stores/tool-stream-store.ts b/apps/frontend/src/stores/tool-stream-store.ts similarity index 100% rename from frontend/src/stores/tool-stream-store.ts rename to apps/frontend/src/stores/tool-stream-store.ts diff --git a/frontend/src/stores/use-document-modal-store.ts b/apps/frontend/src/stores/use-document-modal-store.ts similarity index 100% rename from frontend/src/stores/use-document-modal-store.ts rename to apps/frontend/src/stores/use-document-modal-store.ts diff --git a/frontend/src/stores/use-editor-store.ts b/apps/frontend/src/stores/use-editor-store.ts similarity index 100% rename from frontend/src/stores/use-editor-store.ts rename to apps/frontend/src/stores/use-editor-store.ts diff --git a/frontend/src/stores/welcome-banner-store.ts b/apps/frontend/src/stores/welcome-banner-store.ts similarity index 100% rename from frontend/src/stores/welcome-banner-store.ts rename to apps/frontend/src/stores/welcome-banner-store.ts diff --git a/frontend/translations/de.json b/apps/frontend/translations/de.json similarity index 100% rename from frontend/translations/de.json rename to apps/frontend/translations/de.json diff --git a/frontend/translations/en.json b/apps/frontend/translations/en.json similarity index 100% rename from frontend/translations/en.json rename to apps/frontend/translations/en.json diff --git a/frontend/translations/es.json b/apps/frontend/translations/es.json similarity index 100% rename from frontend/translations/es.json rename to apps/frontend/translations/es.json diff --git a/frontend/translations/fr.json b/apps/frontend/translations/fr.json similarity index 100% rename from frontend/translations/fr.json rename to apps/frontend/translations/fr.json diff --git a/frontend/translations/it.json b/apps/frontend/translations/it.json similarity index 100% rename from frontend/translations/it.json rename to apps/frontend/translations/it.json diff --git a/frontend/translations/ja.json b/apps/frontend/translations/ja.json similarity index 100% rename from frontend/translations/ja.json rename to apps/frontend/translations/ja.json diff --git a/frontend/translations/pt.json b/apps/frontend/translations/pt.json similarity index 100% rename from frontend/translations/pt.json rename to apps/frontend/translations/pt.json diff --git a/frontend/translations/zh.json b/apps/frontend/translations/zh.json similarity index 100% rename from frontend/translations/zh.json rename to apps/frontend/translations/zh.json diff --git a/frontend/tsconfig.json b/apps/frontend/tsconfig.json similarity index 91% rename from frontend/tsconfig.json rename to apps/frontend/tsconfig.json index 8d85892c52..31e48ab7a4 100644 --- a/frontend/tsconfig.json +++ b/apps/frontend/tsconfig.json @@ -35,7 +35,8 @@ ".next/types/**/*.ts", "next-env.d.ts", "./.next/types/**/*.ts", - ".next/dev/types/**/*.ts" + ".next/dev/types/**/*.ts", + "../../packages/shared/src/**/*.ts" ], "exclude": [ "node_modules" diff --git a/frontend/vercel.json b/apps/frontend/vercel.json similarity index 100% rename from frontend/vercel.json rename to apps/frontend/vercel.json diff --git a/apps/mobile/api/types.ts b/apps/mobile/api/types.ts index dda10fe44c..8276476a41 100644 --- a/apps/mobile/api/types.ts +++ b/apps/mobile/api/types.ts @@ -2,10 +2,22 @@ * API Type Definitions * * Centralized TypeScript types for all API models and responses + * Re-exports shared types for convenience */ +// Re-export core message types from shared package +export type { + UnifiedMessage, + ParsedContent, + ParsedMetadata, + MessageGroup, + AgentStatus, + StreamingToolCall, + StreamingMetadata, +} from '@agentpress/shared'; + // ============================================================================ -// Chat & Messages +// Chat & Messages (API-specific) // ============================================================================ export interface Message { @@ -19,30 +31,6 @@ export interface Message { updated_at: string; } -// Core unified message type matching backend (used for streaming) -export interface UnifiedMessage { - message_id: string | null; // null for transient stream chunks - thread_id: string; - type: - | 'user' - | 'assistant' - | 'tool' - | 'system' - | 'status' - | 'browser_state' - | 'image_context' - | 'llm_response_end' - | 'llm_response_start'; - is_llm_message: boolean; - content: string; // JSON string from backend - metadata: string; // JSON string from backend - created_at: string; - updated_at: string; - agent_id?: string; - sequence?: number; - sandbox_id?: string; -} - export interface Thread { thread_id: string; project_id: string; @@ -69,45 +57,7 @@ export interface AgentRun { metadata?: Record; } -// Parsed content structure (from message.content JSON string) -export interface ParsedContent { - role?: 'user' | 'assistant' | 'tool' | 'system'; - content?: string; // The actual text content - status_type?: string; // For status messages: 'tool_started', 'tool_completed', 'thread_run_end', etc. - function_name?: string; // For tool calls - xml_tag_name?: string; // XML tag for tool - arguments?: any; // Tool arguments - tool_index?: number; // Index of tool in sequence - result?: any; // For tool results - is_error?: boolean; // Tool execution error - message?: string; // Error/status messages - name?: string; // Tool name - [key: string]: any; -} - -// Parsed metadata structure (from message.metadata JSON string) -export interface ParsedMetadata { - stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; // Streaming status for assistant messages - thread_run_id?: string; - llm_response_id?: string; - tool_calls?: Array<{ - tool_call_id: string; - function_name: string; - arguments: Record | string; // String when partial JSON, object when complete - source: 'native' | 'xml'; - }>; - // Tool message metadata fields - function_name?: string; // Tool function name - tool_call_id?: string; // Tool call ID - result?: { - output: any; - success: boolean; - error?: string | null; - }; - return_format?: 'native' | 'xml'; - assistant_message_id?: string; // Link tool result back to assistant message - [key: string]: any; -} +// Note: ParsedContent, ParsedMetadata now re-exported from @agentpress/shared/types export interface StreamEvent { event: string; diff --git a/apps/mobile/components/chat/StreamingToolCard.tsx b/apps/mobile/components/chat/StreamingToolCard.tsx index eca700aefd..9e0337f319 100644 --- a/apps/mobile/components/chat/StreamingToolCard.tsx +++ b/apps/mobile/components/chat/StreamingToolCard.tsx @@ -3,7 +3,8 @@ import { View, ScrollView, NativeScrollEvent, NativeSyntheticEvent } from 'react import { Text } from '@/components/ui/text'; import { Icon } from '@/components/ui/icon'; import { CircleDashed, CheckCircle2 } from 'lucide-react-native'; -import { getToolIcon, getUserFriendlyToolName } from '@/lib/utils/tool-display'; +import { getUserFriendlyToolName } from '@agentpress/shared'; +import { getToolIcon } from '@/lib/icons/tool-icons'; const STREAMABLE_TOOLS = { FILE_OPERATIONS: new Set([ diff --git a/apps/mobile/components/chat/ThreadContent.tsx b/apps/mobile/components/chat/ThreadContent.tsx index 42cbc15b4a..bd6dfcd8a5 100644 --- a/apps/mobile/components/chat/ThreadContent.tsx +++ b/apps/mobile/components/chat/ThreadContent.tsx @@ -13,23 +13,26 @@ if (Platform.OS !== 'web') { } import { Text } from '@/components/ui/text'; import { Icon } from '@/components/ui/icon'; -import type { UnifiedMessage, ParsedContent, ParsedMetadata } from '@/api/types'; -import { safeJsonParse } from '@/lib/utils/message-grouping'; -import { - parseXmlToolCalls, - isNewXmlFormat, - parseToolMessage, - formatToolOutput, - HIDE_STREAMING_XML_TAGS, -} from '@/lib/utils/tool-parser'; -import { getToolIcon, getUserFriendlyToolName } from '@/lib/utils/tool-display'; +import type { UnifiedMessage, ParsedContent, ParsedMetadata } from '@agentpress/shared'; import { + safeJsonParse, + getUserFriendlyToolName, extractTextFromPartialJson, extractTextFromArguments, isAskOrCompleteTool, findAskOrCompleteTool, shouldSkipStreamingRender, -} from '@/lib/utils/streaming-utils'; +} from '@agentpress/shared'; +import { + parseXmlToolCalls, + isNewXmlFormat, + parseToolMessage, + formatToolOutput, +} from '@agentpress/shared/tools'; +import { HIDE_STREAMING_XML_TAGS } from '@agentpress/shared/tools'; +import { groupMessagesWithStreaming } from '@agentpress/shared/utils'; +import { preprocessTextOnlyTools } from '@agentpress/shared/tools'; +import { getToolIcon } from '@/lib/icons/tool-icons'; import { useColorScheme } from 'nativewind'; import { SelectableMarkdownText } from '@/components/ui/selectable-markdown'; import { autoLinkUrls } from '@/lib/utils/url-autolink'; @@ -78,66 +81,8 @@ function renderStandaloneAttachments( ); } -function preprocessTextOnlyToolsLocal(content: string): string { - if (!content || typeof content !== 'string') { - return content || ''; - } - - content = content.replace( - /\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, - (match) => { - if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, - '$1' - ); - } - ); - - content = content.replace( - /\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, - (match) => { - if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, - '$1' - ); - } - ); - - content = content.replace( - /\s*\s*([\s\S]*?)$/gi, - (match) => { - if (match.includes('\s*\s*([\s\S]*?)$/gi, - '$1' - ); - } - ); - - content = content.replace( - /\s*\s*([\s\S]*?)$/gi, - (match) => { - if (match.includes('\s*\s*([\s\S]*?)$/gi, - '$1' - ); - } - ); - - content = content.replace(/]*>([\s\S]*?)<\/ask>/gi, (match) => { - if (match.match(/]*attachments=/i)) return match; - return match.replace(/]*>([\s\S]*?)<\/ask>/gi, '$1'); - }); - - content = content.replace(/]*>([\s\S]*?)<\/complete>/gi, (match) => { - if (match.match(/]*attachments=/i)) return match; - return match.replace(/]*>([\s\S]*?)<\/complete>/gi, '$1'); - }); - return content; -} +// Use shared preprocessTextOnlyTools function (imported above) +const preprocessTextOnlyToolsLocal = preprocessTextOnlyTools; interface MarkdownContentProps { content: string; @@ -786,150 +731,13 @@ export const ThreadContent: React.FC = React.memo( }, [messages]); const groupedMessages = useMemo(() => { - const groups: MessageGroup[] = []; - let currentGroup: MessageGroup | null = null; - let assistantGroupCounter = 0; - - displayMessages.forEach((message, index) => { - const messageType = message.type; - const key = message.message_id || `msg-${index}`; - - if (messageType === 'user') { - if (currentGroup) { - groups.push(currentGroup); - currentGroup = null; - } - groups.push({ type: 'user', messages: [message], key }); - } else if ( - messageType === 'assistant' || - messageType === 'tool' || - messageType === 'browser_state' - ) { - const canAddToExistingGroup = - currentGroup && - currentGroup.type === 'assistant_group' && - (() => { - if (messageType === 'assistant') { - const lastAssistantMsg = currentGroup.messages.findLast( - (m) => m.type === 'assistant' - ); - if (!lastAssistantMsg) return true; - - const currentAgentId = message.agent_id; - const lastAgentId = lastAssistantMsg.agent_id; - return currentAgentId === lastAgentId; - } - return true; - })(); - - if (canAddToExistingGroup) { - currentGroup?.messages.push(message); - } else { - if (currentGroup) { - groups.push(currentGroup); - } - assistantGroupCounter++; - currentGroup = { - type: 'assistant_group', - messages: [message], - key: `assistant-group-${assistantGroupCounter}`, - }; - } - } else if (messageType !== 'status') { - if (currentGroup) { - groups.push(currentGroup); - currentGroup = null; - } - } + return groupMessagesWithStreaming(displayMessages, { + streamingTextContent, + streamingToolCall, + readOnly: false, + streamingText: undefined, + isStreamingText: false, }); - - if (currentGroup) { - groups.push(currentGroup); - } - - const mergedGroups: MessageGroup[] = []; - let currentMergedGroup: MessageGroup | null = null; - - groups.forEach((group) => { - if (group.type === 'assistant_group') { - if (currentMergedGroup && currentMergedGroup.type === 'assistant_group') { - currentMergedGroup.messages.push(...group.messages); - } else { - if (currentMergedGroup) { - mergedGroups.push(currentMergedGroup); - } - currentMergedGroup = { ...group }; - } - } else { - if (currentMergedGroup) { - mergedGroups.push(currentMergedGroup); - currentMergedGroup = null; - } - mergedGroups.push(group); - } - }); - - if (currentMergedGroup) { - mergedGroups.push(currentMergedGroup); - } - - const finalGroupedMessages = mergedGroups; - - if (streamingTextContent) { - const lastGroup = finalGroupedMessages.at(-1); - if (!lastGroup || lastGroup.type === 'user') { - assistantGroupCounter++; - finalGroupedMessages.push({ - type: 'assistant_group', - messages: [ - { - content: streamingTextContent, - type: 'assistant', - message_id: 'streamingTextContent', - metadata: 'streamingTextContent', - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), - is_llm_message: true, - thread_id: 'streamingTextContent', - sequence: Infinity, - }, - ], - key: `assistant-group-${assistantGroupCounter}-streaming`, - }); - } else if (lastGroup.type === 'assistant_group') { - const lastMessage = lastGroup.messages[lastGroup.messages.length - 1]; - if (lastMessage.message_id !== 'streamingTextContent') { - lastGroup.messages.push({ - content: streamingTextContent, - type: 'assistant', - message_id: 'streamingTextContent', - metadata: 'streamingTextContent', - created_at: new Date().toISOString(), - updated_at: new Date().toISOString(), - is_llm_message: true, - thread_id: 'streamingTextContent', - sequence: Infinity, - }); - } - } - } - - // Handle streaming tool call (e.g., ask/complete) - ensure there's a group to render in - // This is needed because native tool calls have no text content, only metadata - if (streamingToolCall && !streamingTextContent) { - const lastGroup = finalGroupedMessages.at(-1); - if (!lastGroup || lastGroup.type === 'user') { - // Create new empty assistant group so streaming tool call can render - assistantGroupCounter++; - finalGroupedMessages.push({ - type: 'assistant_group', - messages: [], - key: `assistant-group-${assistantGroupCounter}-streaming-tool`, - }); - } - } - - return finalGroupedMessages; }, [displayMessages, streamingTextContent, streamingToolCall]); if ( diff --git a/apps/mobile/components/chat/assistant-message-renderer.tsx b/apps/mobile/components/chat/assistant-message-renderer.tsx index bf98f941b7..6fd09acd7d 100644 --- a/apps/mobile/components/chat/assistant-message-renderer.tsx +++ b/apps/mobile/components/chat/assistant-message-renderer.tsx @@ -11,17 +11,17 @@ import { View, Pressable, Text as RNText } from 'react-native'; import { Text } from '@/components/ui/text'; import { Icon } from '@/components/ui/icon'; import { Clock } from 'lucide-react-native'; -import type { UnifiedMessage, ParsedMetadata, ParsedContent } from '@/api/types'; -import { safeJsonParse } from '@/lib/utils/message-grouping'; -import { getToolIcon, getUserFriendlyToolName } from '@/lib/utils/tool-display'; -import { isAskOrCompleteTool, extractTextFromArguments } from '@/lib/utils/streaming-utils'; +import type { UnifiedMessage, ParsedMetadata, ParsedContent } from '@agentpress/shared'; +import { safeJsonParse, getUserFriendlyToolName, isAskOrCompleteTool, extractTextFromArguments } from '@agentpress/shared'; +import { getToolIcon } from '@/lib/icons/tool-icons'; import { SelectableMarkdownText } from '@/components/ui/selectable-markdown'; import { autoLinkUrls } from '@/lib/utils/url-autolink'; import { Linking } from 'react-native'; import { FileAttachmentsGrid } from './FileAttachmentRenderer'; import { TaskCompletedFeedback } from './tool-views/complete-tool/TaskCompletedFeedback'; import { PromptExamples } from '@/components/shared'; -import { parseXmlToolCalls, preprocessTextOnlyTools } from '@/lib/utils/tool-parser'; +import { parseXmlToolCalls, preprocessTextOnlyTools } from '@agentpress/shared/tools'; +import { normalizeArrayValue, normalizeAttachments } from '@agentpress/shared/utils'; export interface AssistantMessageRendererProps { message: UnifiedMessage; @@ -36,58 +36,7 @@ export interface AssistantMessageRendererProps { isDark?: boolean; // Pass color scheme from parent to avoid hooks violation } -/** - * Normalizes an array value that might be a string, array, or other type - */ -function normalizeArrayValue(value: unknown): string[] { - if (Array.isArray(value)) { - return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); - } - - if (typeof value === 'string') { - try { - const parsed = JSON.parse(value); - if (Array.isArray(parsed)) { - return parsed.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); - } - } catch { - // If parsing fails, treat as comma-separated string - return value.split(',').map(a => a.trim()).filter(a => a.length > 0); - } - } - - return []; -} - -/** - * Normalizes attachments value (can be string, array, or empty) - */ -function normalizeAttachments(attachments: unknown): string[] { - if (Array.isArray(attachments)) { - return attachments; - } - - if (typeof attachments === 'string') { - // Try parsing as JSON first (handles JSON stringified arrays like "[\"file1.json\", \"file2.json\"]") - const trimmed = attachments.trim(); - if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || - (trimmed.startsWith('{') && trimmed.endsWith('}'))) { - try { - const parsed = JSON.parse(trimmed); - if (Array.isArray(parsed)) { - return parsed.filter((a: any) => a && typeof a === 'string' && a.trim().length > 0); - } - } catch { - // Not valid JSON, fall through to comma-separated parsing - } - } - - // Fallback to comma-separated string parsing - return attachments.split(',').map(a => a.trim()).filter(a => a.length > 0); - } - - return []; -} +// normalizeArrayValue and normalizeAttachments are now imported from @agentpress/shared/utils /** * Extracts a display parameter from tool call arguments diff --git a/apps/mobile/components/chat/tool-views/web-search-tool/DeepSearchLoadingState.tsx b/apps/mobile/components/chat/tool-views/web-search-tool/DeepSearchLoadingState.tsx new file mode 100644 index 0000000000..5b773846ca --- /dev/null +++ b/apps/mobile/components/chat/tool-views/web-search-tool/DeepSearchLoadingState.tsx @@ -0,0 +1,255 @@ +import React, { useState, useEffect } from 'react'; +import { View, ScrollView } from 'react-native'; +import { Text } from '@/components/ui/text'; +import { Icon } from '@/components/ui/icon'; +import { Search, Loader2, Check, Circle } from 'lucide-react-native'; +import { useColorScheme } from 'nativewind'; +import Animated, { + useAnimatedStyle, + withTiming, + withRepeat, + withSequence, + useSharedValue, + interpolate, + Easing, + FadeIn, + FadeInDown, + SlideInRight, +} from 'react-native-reanimated'; + +interface DeepSearchLoadingStateProps { + queries: string[]; +} + +function QueryRow({ + query, + index, + isActive, + isCompleted, +}: { + query: string; + index: number; + isActive: boolean; + isCompleted: boolean; +}) { + const pulseAnim = useSharedValue(0); + + useEffect(() => { + if (isActive) { + pulseAnim.value = withRepeat( + withSequence( + withTiming(1, { duration: 800, easing: Easing.inOut(Easing.ease) }), + withTiming(0.4, { duration: 800, easing: Easing.inOut(Easing.ease) }) + ), + -1, + false + ); + } else { + pulseAnim.value = withTiming(isCompleted ? 1 : 0.4, { duration: 200 }); + } + }, [isActive, isCompleted]); + + const opacityStyle = useAnimatedStyle(() => ({ + opacity: interpolate(pulseAnim.value, [0, 1], [0.5, 1]), + })); + + const dotStyle = useAnimatedStyle(() => ({ + transform: [{ scale: isActive ? interpolate(pulseAnim.value, [0.4, 1], [0.9, 1.1]) : 1 }], + })); + + return ( + + {/* Status dot */} + + {isCompleted ? ( + + + + ) : isActive ? ( + + + + ) : ( + + + + )} + + + {/* Query text */} + + {query} + + + ); +} + +export function DeepSearchLoadingState({ queries }: DeepSearchLoadingStateProps) { + const { colorScheme } = useColorScheme(); + const isDark = colorScheme === 'dark'; + + const [activeIndex, setActiveIndex] = useState(0); + const [completedIndices, setCompletedIndices] = useState>(new Set()); + + const progressValue = useSharedValue(0); + const glowAnim = useSharedValue(0); + + // Parse queries - handle various formats + const parsedQueries = React.useMemo(() => { + if (!queries) return []; + if (Array.isArray(queries)) { + return queries.filter(q => typeof q === 'string' && q.trim().length > 0); + } + if (typeof queries === 'string') { + try { + const parsed = JSON.parse(queries); + if (Array.isArray(parsed)) { + return parsed.filter(q => typeof q === 'string' && q.trim().length > 0); + } + return [queries]; + } catch { + return [queries]; + } + } + return []; + }, [queries]); + + useEffect(() => { + if (parsedQueries.length === 0) return; + + // Glow animation + glowAnim.value = withRepeat( + withSequence( + withTiming(1, { duration: 1500, easing: Easing.inOut(Easing.ease) }), + withTiming(0, { duration: 1500, easing: Easing.inOut(Easing.ease) }) + ), + -1, + false + ); + + // Progress animation + progressValue.value = withTiming(95, { + duration: parsedQueries.length * 2000, + easing: Easing.out(Easing.quad) + }); + + // Cycle through queries + const interval = setInterval(() => { + setActiveIndex((prev) => { + if (prev < parsedQueries.length - 1) { + setCompletedIndices((completed) => new Set([...completed, prev])); + return prev + 1; + } + return prev; + }); + }, 2000); + + return () => clearInterval(interval); + }, [parsedQueries.length]); + + const progressStyle = useAnimatedStyle(() => ({ + width: `${progressValue.value}%`, + })); + + const glowStyle = useAnimatedStyle(() => ({ + opacity: interpolate(glowAnim.value, [0, 1], [0.3, 0.8]), + })); + + if (parsedQueries.length === 0) { + return null; + } + + const completedCount = completedIndices.size; + const progressPercent = Math.round((completedCount / parsedQueries.length) * 100); + + return ( + + {/* Header */} + + {/* Animated icon */} + + + + + + + + + + Deep Research + + + {completedCount} of {parsedQueries.length} queries completed + + + + {/* Percentage */} + + + {progressPercent}% + + + + + {/* Progress bar */} + + + + + {/* Queries list */} + + + {parsedQueries.map((query, index) => ( + + ))} + + + + {/* Footer status */} + + + + Analyzing search results... + + + + ); +} diff --git a/apps/mobile/components/chat/tool-views/web-search-tool/WebSearchToolView.tsx b/apps/mobile/components/chat/tool-views/web-search-tool/WebSearchToolView.tsx index 7ba00e4f10..ecb6ec6142 100644 --- a/apps/mobile/components/chat/tool-views/web-search-tool/WebSearchToolView.tsx +++ b/apps/mobile/components/chat/tool-views/web-search-tool/WebSearchToolView.tsx @@ -1,12 +1,13 @@ import React, { useState, useEffect } from 'react'; -import { View, ScrollView, Linking, Pressable, Image as RNImage, ActivityIndicator } from 'react-native'; +import { View, ScrollView, Linking, Pressable, Image as RNImage } from 'react-native'; import { Text } from '@/components/ui/text'; import { Icon } from '@/components/ui/icon'; import { Search, ExternalLink, Globe, CheckCircle2, AlertCircle, ImageIcon, ChevronLeft, ChevronRight } from 'lucide-react-native'; import type { ToolViewProps } from '../types'; -import { extractWebSearchData, cleanUrl, getFavicon } from './_utils'; +import { extractWebSearchData, cleanUrl, getFavicon, extractQueriesFromToolCall } from './_utils'; import { ToolViewCard, StatusBadge, LoadingState } from '../shared'; import { getToolMetadata } from '../tool-metadata'; +import { DeepSearchLoadingState } from './DeepSearchLoadingState'; import * as Haptics from 'expo-haptics'; // Utility functions @@ -22,8 +23,22 @@ function formatTimestamp(isoString?: string): string { export function WebSearchToolView({ toolCall, toolResult, isSuccess = true, isStreaming, assistantTimestamp, toolTimestamp }: ToolViewProps) { const { query, results, images, success, isBatch, batchResults } = extractWebSearchData(toolCall, toolResult, isSuccess); + const queriesArray = extractQueriesFromToolCall(toolCall); const isLoading = isStreaming && results.length === 0 && images.length === 0; const [currentQueryIndex, setCurrentQueryIndex] = useState(0); + + // Log for debugging + console.log('[WebSearchToolView] Data:', { + query, + queryType: typeof query, + queriesArray, + queriesArrayLength: queriesArray.length, + isBatch, + batchResultsLength: batchResults?.length, + isLoading, + isStreaming, + toolCallArgs: toolCall?.arguments, + }); if (!toolCall) { return null; @@ -56,6 +71,26 @@ export function WebSearchToolView({ toolCall, toolResult, isSuccess = true, isSt : query; if (isLoading) { + // Check for batch queries - either from queriesArray or from query being a JSON array + let effectiveQueries = queriesArray; + + // Also check if query itself is a JSON array string + if (effectiveQueries.length <= 1 && query && typeof query === 'string') { + const trimmed = query.trim(); + if (trimmed.startsWith('[') && trimmed.endsWith(']')) { + try { + const parsed = JSON.parse(trimmed); + if (Array.isArray(parsed) && parsed.length > 1) { + effectiveQueries = parsed.filter((q: any) => typeof q === 'string' && q.trim().length > 0); + } + } catch { + // Not valid JSON + } + } + } + + const hasBatchQueries = effectiveQueries.length > 1; + return ( , + rightContent: ( + + ), }} > - + {hasBatchQueries ? ( + + ) : ( + + )} ); diff --git a/apps/mobile/components/chat/tool-views/web-search-tool/_utils.ts b/apps/mobile/components/chat/tool-views/web-search-tool/_utils.ts index aae1b0d7c5..c3165271b5 100644 --- a/apps/mobile/components/chat/tool-views/web-search-tool/_utils.ts +++ b/apps/mobile/components/chat/tool-views/web-search-tool/_utils.ts @@ -130,6 +130,51 @@ export function cleanUrl(url: string): string { return url.replace(/^https?:\/\//, '').replace(/\/$/, ''); } +export function extractQueriesFromToolCall(toolCall: ToolCallData): string[] { + if (!toolCall?.arguments) return []; + + let args: Record = {}; + if (typeof toolCall.arguments === 'object' && toolCall.arguments !== null) { + args = toolCall.arguments; + } else if (typeof toolCall.arguments === 'string') { + try { + args = JSON.parse(toolCall.arguments); + } catch { + return []; + } + } + + // Check for queries array (batch mode) + if (args?.queries && Array.isArray(args.queries)) { + return args.queries.filter((q: any) => typeof q === 'string' && q.trim().length > 0); + } + + // Check for single query that might be an array + if (args?.query) { + // If query is already an array + if (Array.isArray(args.query)) { + return args.query.filter((q: any) => typeof q === 'string' && q.trim().length > 0); + } + // If query is a string that looks like a JSON array + if (typeof args.query === 'string') { + const trimmed = args.query.trim(); + if (trimmed.startsWith('[') && trimmed.endsWith(']')) { + try { + const parsed = JSON.parse(trimmed); + if (Array.isArray(parsed)) { + return parsed.filter((q: any) => typeof q === 'string' && q.trim().length > 0); + } + } catch { + // Not valid JSON, treat as single query + } + } + return [args.query]; + } + } + + return []; +} + export function getFavicon(url: string): string | null { try { const domain = new URL(url).hostname; diff --git a/apps/mobile/components/ui/button.tsx b/apps/mobile/components/ui/button.tsx index a1dd8c0f48..650fe29bca 100644 --- a/apps/mobile/components/ui/button.tsx +++ b/apps/mobile/components/ui/button.tsx @@ -2,11 +2,8 @@ import { TextClassContext } from '@/components/ui/text'; import { cn } from '@/lib/utils'; import { cva, type VariantProps } from 'class-variance-authority'; import { Platform, Pressable } from 'react-native'; -import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated'; import * as React from 'react'; -const AnimatedPressable = Animated.createAnimatedComponent(Pressable); - // Android hit slop for better touch targets const ANDROID_HIT_SLOP = Platform.OS === 'android' ? { top: 8, bottom: 8, left: 8, right: 8 } : undefined; @@ -101,40 +98,24 @@ type ButtonProps = React.ComponentProps & React.RefAttributes & VariantProps; -function Button({ className, variant, size, onPressIn, onPressOut, ...props }: ButtonProps) { - const scale = useSharedValue(1); - const opacity = useSharedValue(1); - - // Initialize opacity based on disabled state - React.useEffect(() => { - opacity.value = props.disabled ? 0.5 : 1; - }, [props.disabled, opacity]); - - const animatedStyle = useAnimatedStyle(() => ({ - transform: [{ scale: scale.value }], - opacity: opacity.value, - })); - - const handlePressIn = (e: any) => { - if (!props.disabled) { - scale.value = withSpring(0.98, { damping: 15, stiffness: 400 }); - } - onPressIn?.(e); - }; +function Button({ className, variant, size, ...props }: ButtonProps) { + // Memoize computed values to prevent re-computation during render + const textClassValue = React.useMemo( + () => buttonTextVariants({ variant, size }), + [variant, size] + ); - const handlePressOut = (e: any) => { - scale.value = withSpring(1, { damping: 15, stiffness: 400 }); - onPressOut?.(e); - }; + const buttonClassName = React.useMemo( + () => cn(buttonVariants({ variant, size }), className), + [variant, size, className] + ); return ( - - + ('idle'); - const [textContent, setTextContent] = useState< - { content: string; sequence?: number }[] - >([]); + const [textContent, setTextContent] = useState([]); // Throttled state updates for smoother streaming const throttleRef = useRef | null>(null); @@ -102,54 +119,10 @@ export function useAgentStream( const startStreamingRef = useRef<((runId: string) => void) | null>(null); // DELTA STREAMING: Track accumulated tool call arguments with sequence numbers - // Structure: Map }> - interface AccumulatedToolCall { - metadata: { - tool_call_id: string; - function_name: string; - index?: number; - [key: string]: any; - }; - chunks: Array<{sequence: number, delta: string}>; - } - const accumulatedToolCallsRef = useRef>(new Map()); - - // Track completed tool call IDs (tools that have received results) - const completedToolCallIdsRef = useRef>(new Set()); - - // Track tool results by tool_call_id for merging with streaming tool calls - const toolResultsRef = useRef>(new Map()); + const accumulatorRef = useRef(createAccumulatorState()); const orderedTextContent = useMemo(() => { - if (textContent.length === 0) return ''; - - // Only sort if sequences are out of order (optimization) - let needsSorting = false; - for (let i = 1; i < textContent.length; i++) { - const prevSeq = textContent[i - 1].sequence ?? 0; - const currSeq = textContent[i].sequence ?? 0; - if (currSeq < prevSeq) { - needsSorting = true; - break; - } - } - - // If already sorted, just concatenate - if (!needsSorting) { - let result = ''; - for (let i = 0; i < textContent.length; i++) { - result += textContent[i].content; - } - return result; - } - - // Only sort if necessary - const sorted = textContent.slice().sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0)); - let result = ''; - for (let i = 0; i < sorted.length; i++) { - result += sorted[i].content; - } - return result; + return orderContentBySequence(textContent); }, [textContent]); // Refs to capture current state for persistence @@ -190,9 +163,7 @@ export function useAgentStream( setAgentRunId(null); currentRunIdRef.current = null; // Clear accumulated tool call deltas and previous state - accumulatedToolCallsRef.current.clear(); - completedToolCallIdsRef.current.clear(); - toolResultsRef.current.clear(); + clearAccumulator(accumulatorRef.current); if (retryTimeoutRef.current) { clearTimeout(retryTimeoutRef.current); @@ -207,19 +178,7 @@ export function useAgentStream( setMessagesRef.current = setMessages; }, [setMessages]); - // Helper function to map backend status to frontend status string - const mapAgentStatus = (backendStatus: string): string => { - switch (backendStatus) { - case 'completed': - return 'completed'; - case 'stopped': - return 'stopped'; - case 'failed': - return 'failed'; - default: - return 'error'; - } - }; + // Use shared mapAgentStatus function (imported above) // Internal function to update status and notify consumer const updateStatus = useCallback( @@ -315,24 +274,11 @@ export function useAgentStream( (rawData: string) => { if (!isMountedRef.current) return; - let processedData = rawData; - if (processedData.startsWith('data: ')) { - processedData = processedData.substring(6).trim(); - } + const processedData = preprocessStreamData(rawData); if (!processedData) return; - // Early exit for non-JSON completion messages - if ( - processedData === - '{"type": "status", "status": "completed", "message": "Worker run completed successfully"}' - ) { - finalizeStream('completed', currentRunIdRef.current); - return; - } - if ( - processedData.includes('Run data not available for streaming') || - processedData.includes('Stream ended with status: completed') - ) { + // Early exit for completion messages + if (isCompletionMessage(processedData)) { finalizeStream('completed', currentRunIdRef.current); return; } @@ -398,10 +344,7 @@ export function useAgentStream( } // Process JSON messages - const message = safeJsonParse( - processedData, - null, - ) as UnifiedMessage | null; + const message = parseStreamingMessage(processedData); if (!message) { console.warn( '[useAgentStream] Failed to parse streamed message:', @@ -424,271 +367,90 @@ export function useAgentStream( switch (message.type) { case 'assistant': if (parsedMetadata.stream_status === 'tool_call_chunk') { - // Handle tool call chunks - extract from metadata.tool_calls - const toolCalls = parsedMetadata.tool_calls || []; - if (toolCalls.length > 0) { - // DELTA STREAMING: Accumulate deltas into full tool calls with sequence ordering - // First, update the accumulator with new deltas from this chunk - for (const tc of toolCalls as any[]) { - const toolCallId = tc.tool_call_id || 'unknown'; - const sequence = message.sequence ?? 0; - - // Get or create the accumulated entry for this tool call - let accumulated = accumulatedToolCallsRef.current.get(toolCallId); - const isNewToolCall = !accumulated; - if (!accumulated) { - console.log(`[useAgentStream] 🆕 New tool call detected: ${toolCallId} (${tc.function_name})`); - accumulated = { - metadata: { - tool_call_id: tc.tool_call_id, - function_name: tc.function_name, - index: tc.index, - }, - chunks: [], - }; - accumulatedToolCallsRef.current.set(toolCallId, accumulated); - } - - // Update metadata if we have newer info (function_name might come later) - if (tc.function_name) { - accumulated.metadata.function_name = tc.function_name; - } - if (tc.index !== undefined) { - accumulated.metadata.index = tc.index; - } - - if (tc.is_delta && tc.arguments_delta) { - // This is a delta update - store it with sequence number - const existingIndex = accumulated.chunks.findIndex(c => c.sequence === sequence); - if (existingIndex >= 0) { - accumulated.chunks[existingIndex].delta = tc.arguments_delta; - } else { - accumulated.chunks.push({ sequence, delta: tc.arguments_delta }); - } - // Sort chunks by sequence number - accumulated.chunks.sort((a, b) => a.sequence - b.sequence); - } else if (tc.arguments) { - // Full arguments (non-delta) - replace all chunks with single full argument - const argsStr = typeof tc.arguments === 'string' ? tc.arguments : JSON.stringify(tc.arguments); - accumulated.chunks = [{ sequence, delta: argsStr }]; - } - } - - // Now reconstruct ALL accumulated tool calls (not just from this message) - // Merge streaming tool calls with completed tool results - const allReconstructedToolCalls = Array.from(accumulatedToolCallsRef.current.values()) - .sort((a, b) => (a.metadata.index ?? 0) - (b.metadata.index ?? 0)) - .map(accumulated => { - // Merge all chunks for this tool call - let mergedArgs = ''; - for (const chunk of accumulated.chunks) { - mergedArgs += chunk.delta; - } - - const toolCallId = accumulated.metadata.tool_call_id; - const isCompleted = completedToolCallIdsRef.current.has(toolCallId); - const toolResult = toolResultsRef.current.get(toolCallId); - - // Don't log status on every chunk - too verbose - // Status is already logged when result is received - - return { - tool_call_id: toolCallId, - function_name: accumulated.metadata.function_name, - index: accumulated.metadata.index, - arguments: mergedArgs, - is_delta: false, // Mark as assembled - completed: isCompleted, - tool_result: toolResult ? safeJsonParse(toolResult.metadata, {}).result : undefined, - }; - }); - - // Also include completed tools that may have results but aren't in accumulated ref - // (edge case: result arrives before tool call is fully streamed) - toolResultsRef.current.forEach((resultMessage, toolCallId) => { - if (!accumulatedToolCallsRef.current.has(toolCallId)) { - const toolMetadata = safeJsonParse(resultMessage.metadata, {}); - const functionName = toolMetadata.function_name; - if (functionName) { - // Add to reconstructed calls if not already present - const existing = allReconstructedToolCalls.find(tc => tc.tool_call_id === toolCallId); - if (!existing) { - allReconstructedToolCalls.push({ - tool_call_id: toolCallId, - function_name: functionName, - index: toolMetadata.index, - arguments: '{}', - is_delta: false, - completed: true, - tool_result: toolMetadata.result, - }); - } - } - } - }); - - // Re-sort after adding any missing completed tools - allReconstructedToolCalls.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); - - // Create updated message with ALL reconstructed tool calls - const updatedMessage = { - ...message, - metadata: JSON.stringify({ - ...parsedMetadata, - tool_calls: allReconstructedToolCalls, - }), - }; - - // Only log state updates when there's a meaningful change (new tool call or result added) - // Too verbose to log on every chunk update - logs are already present when results arrive + // Handle tool call chunks using shared utilities + const reconstructedToolCalls = handleToolCallChunk( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCalls) { + // Create updated message with reconstructed tool calls + const updatedMessage = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCalls + ); // Set toolCall state with ALL reconstructed tool calls setToolCall(updatedMessage); // Call the callback with the reconstructed message callbacks.onToolCallChunk?.(updatedMessage); } - } else if ( - parsedMetadata.stream_status === 'chunk' && - parsedContent.content - ) { - if (retryCountRef.current > 0) { - console.log('[useAgentStream] Successfully connected, resetting retry counter'); - retryCountRef.current = 0; - } - - - // Use throttled approach for smoother streaming - addContentThrottled({ - sequence: message.sequence, - content: parsedContent.content, - }); - callbacks.onAssistantChunk?.({ content: parsedContent.content }); - } else if (parsedMetadata.stream_status === 'complete') { - // Flush any pending content before completing - flushPendingContent(); - - console.log(`[useAgentStream] 🏁 Assistant message complete - clearing tool call state`, { - accumulatedToolCalls: accumulatedToolCallsRef.current.size, - completedToolCalls: completedToolCallIdsRef.current.size, - toolResults: toolResultsRef.current.size, - completedToolCallIds: Array.from(completedToolCallIdsRef.current), - }); - - setTextContent([]); - setToolCall(null); - // Clear accumulated tool call deltas and previous state when assistant message completes - accumulatedToolCallsRef.current.clear(); - completedToolCallIdsRef.current.clear(); - toolResultsRef.current.clear(); - if (message.message_id) callbacks.onMessage(message); - } else if (!parsedMetadata.stream_status) { - // Handle non-chunked assistant messages if needed - callbacks.onAssistantStart?.(); - if (message.message_id) callbacks.onMessage(message); - } - break; - case 'tool': - // Don't clear toolCall state here - other tools may still be streaming - // Mark this tool as completed and store its result, but keep other tools in accumulated ref - - // Process tool result - try { - const toolMetadata = safeJsonParse(message.metadata, {}); - const toolCallId = toolMetadata.tool_call_id; - const functionName = toolMetadata.function_name; - if (toolCallId && functionName) { - console.log(`[useAgentStream] 🎯 Received tool result for: ${toolCallId} (${functionName})`, { - hasResult: !!toolMetadata.result, - resultType: toolMetadata.result ? typeof toolMetadata.result : 'none', - resultKeys: toolMetadata.result && typeof toolMetadata.result === 'object' - ? Object.keys(toolMetadata.result) - : null, - }); - - // Mark this tool call as completed - completedToolCallIdsRef.current.add(toolCallId); - console.log(`[useAgentStream] ✅ Marked tool call as completed: ${toolCallId}`); - - // Store the tool result for merging with streaming tool calls - toolResultsRef.current.set(toolCallId, message); - console.log(`[useAgentStream] 💾 Stored tool result in toolResultsRef: ${toolCallId}`); - - // Trigger an update to streamingToolCall to include this completed tool with its result - // Reconstruct all tool calls including this completed one - const allReconstructedToolCalls = Array.from(accumulatedToolCallsRef.current.values()) - .sort((a, b) => (a.metadata.index ?? 0) - (b.metadata.index ?? 0)) - .map(accumulated => { - let mergedArgs = ''; - for (const chunk of accumulated.chunks) { - mergedArgs += chunk.delta; - } - - const tcId = accumulated.metadata.tool_call_id; - const isCompleted = completedToolCallIdsRef.current.has(tcId); - const toolResult = toolResultsRef.current.get(tcId); - - return { - tool_call_id: tcId, - function_name: accumulated.metadata.function_name, - index: accumulated.metadata.index, - arguments: mergedArgs, - is_delta: false, - completed: isCompleted, - tool_result: toolResult ? safeJsonParse(toolResult.metadata, {}).result : undefined, - }; - }); - - // Include completed tools that may not be in accumulated ref - toolResultsRef.current.forEach((resultMsg, tcId) => { - if (!accumulatedToolCallsRef.current.has(tcId)) { - const resultMetadata = safeJsonParse(resultMsg.metadata, {}); - const fnName = resultMetadata.function_name; - if (fnName) { - const existing = allReconstructedToolCalls.find(tc => tc.tool_call_id === tcId); - if (!existing) { - allReconstructedToolCalls.push({ - tool_call_id: tcId, - function_name: fnName, - index: resultMetadata.index, - arguments: '{}', - is_delta: false, - completed: true, - tool_result: resultMetadata.result, - }); - } - } - } - }); - - allReconstructedToolCalls.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); - - // Update streamingToolCall to include this completed tool with its result - const updatedMessageWithResults = { - ...message, - metadata: JSON.stringify({ - ...toolMetadata, - tool_calls: allReconstructedToolCalls, - }), - }; + } else { + // Handle text chunks + const chunkContent = handleAssistantChunk(message, parsedContent, parsedMetadata); + if (chunkContent) { + if (retryCountRef.current > 0) { + console.log('[useAgentStream] Successfully connected, resetting retry counter'); + retryCountRef.current = 0; + } - console.log(`[useAgentStream] 🔄 Updating tool call state with result for ${toolCallId}`, { - totalToolCalls: allReconstructedToolCalls.length, - completedCount: allReconstructedToolCalls.filter((tc: any) => tc.completed).length, - toolCallsWithResults: allReconstructedToolCalls.filter((tc: any) => tc.tool_result).length, + // Use throttled approach for smoother streaming + addContentThrottled({ + sequence: message.sequence, + content: chunkContent, }); + callbacks.onAssistantChunk?.({ content: chunkContent }); + } else if (parsedMetadata.stream_status === 'complete') { + // Flush any pending content before completing + flushPendingContent(); - // Force update to streamingToolCall state - setToolCall(updatedMessageWithResults); + console.log(`[useAgentStream] 🏁 Assistant message complete - clearing tool call state`); - // Also call the callback to notify downstream handlers - callbacks.onToolCallChunk?.(updatedMessageWithResults); + setTextContent([]); + setToolCall(null); + // Clear accumulated tool call deltas and previous state when assistant message completes + clearAccumulator(accumulatorRef.current); + if (message.message_id) callbacks.onMessage(message); + } else if (!parsedMetadata.stream_status) { + // Handle non-chunked assistant messages if needed + callbacks.onAssistantStart?.(); + if (message.message_id) callbacks.onMessage(message); } - } catch (e) { - // Ignore parsing errors + } + break; + case 'tool': + // Handle tool result using shared utilities + const reconstructedToolCallsFromResult = handleToolResult( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCallsFromResult) { + // Update streamingToolCall to include this completed tool with its result + const updatedMessageWithResults = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCallsFromResult + ); + + console.log(`[useAgentStream] 🔄 Updating tool call state with result`, { + totalToolCalls: reconstructedToolCallsFromResult.length, + completedCount: reconstructedToolCallsFromResult.filter((tc: any) => tc.completed).length, + toolCallsWithResults: reconstructedToolCallsFromResult.filter((tc: any) => tc.tool_result).length, + }); + + // Force update to streamingToolCall state + setToolCall(updatedMessageWithResults); + + // Also call the callback to notify downstream handlers + callbacks.onToolCallChunk?.(updatedMessageWithResults); } - // DO NOT clear accumulatedToolCallsRef - other tools may still be streaming - // Only clear when assistant message completes (handled in case 'assistant' with stream_status === 'complete') + // DO NOT clear accumulator - other tools may still be streaming + // Only clear when assistant message completes if (message.message_id) callbacks.onMessage(message); break; case 'status': @@ -698,9 +460,9 @@ export function useAgentStream( case 'tool_error': console.log(`[useAgentStream] 📊 Status message: ${parsedContent.status_type}`, { message: parsedContent.message, - accumulatedToolCalls: accumulatedToolCallsRef.current.size, - completedToolCalls: completedToolCallIdsRef.current.size, - toolResults: toolResultsRef.current.size, + accumulatedToolCalls: accumulatorRef.current.accumulatedToolCalls.size, + completedToolCalls: accumulatorRef.current.completedToolCallIds.size, + toolResults: accumulatorRef.current.toolResults.size, }); // Don't clear toolCall state here - other tools may still be streaming // Individual tool completion is handled by useThreadToolCalls via the messages array diff --git a/apps/mobile/ios/Kortix.xcodeproj/project.pbxproj b/apps/mobile/ios/Kortix.xcodeproj/project.pbxproj index c684b20edf..e7172711b0 100644 --- a/apps/mobile/ios/Kortix.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Kortix.xcodeproj/project.pbxproj @@ -286,25 +286,25 @@ "${PODS_CONFIGURATION_BUILD_DIR}/PurchasesHybridCommon/PurchasesHybridCommon.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Brands.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Regular.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/FontAwesome6_Solid.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons/Fonts/Zocial.ttf", "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", @@ -539,7 +539,7 @@ LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; SWIFT_ENABLE_EXPLICIT_MODULES = NO; @@ -607,7 +607,7 @@ ); LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; MTL_ENABLE_DEBUG_INFO = NO; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ENABLE_EXPLICIT_MODULES = NO; USE_HERMES = true; diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock index e3bc725aa8..bae9d107a7 100644 --- a/apps/mobile/ios/Podfile.lock +++ b/apps/mobile/ios/Podfile.lock @@ -1,22 +1,22 @@ PODS: - - EASClient (1.0.7): + - EASClient (1.0.8): - ExpoModulesCore - - EXApplication (7.0.7): + - EXApplication (7.0.8): - ExpoModulesCore - - EXAV (16.0.7): + - EXAV (16.0.8): - ExpoModulesCore - ReactCommon/turbomodule/core - - EXConstants (18.0.10): + - EXConstants (18.0.12): - ExpoModulesCore - EXImageLoader (6.0.0): - ExpoModulesCore - React-Core - EXJSONUtils (0.15.0) - - EXManifests (1.0.9): + - EXManifests (1.0.10): - ExpoModulesCore - - EXNotifications (0.32.13): + - EXNotifications (0.32.15): - ExpoModulesCore - - Expo (54.0.25): + - Expo (54.0.30): - ExpoModulesCore - hermes-engine - RCTRequired @@ -41,15 +41,15 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - expo-dev-client (6.0.18): + - expo-dev-client (6.0.20): - EXManifests - expo-dev-launcher - expo-dev-menu - expo-dev-menu-interface - EXUpdatesInterface - - expo-dev-launcher (6.0.18): + - expo-dev-launcher (6.0.20): - EXManifests - - expo-dev-launcher/Main (= 6.0.18) + - expo-dev-launcher/Main (= 6.0.20) - expo-dev-menu - expo-dev-menu-interface - ExpoModulesCore @@ -78,7 +78,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - expo-dev-launcher/Main (6.0.18): + - expo-dev-launcher/Main (6.0.20): - EXManifests - expo-dev-launcher/Unsafe - expo-dev-menu @@ -109,7 +109,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - expo-dev-launcher/Unsafe (6.0.18): + - expo-dev-launcher/Unsafe (6.0.20): - EXManifests - expo-dev-menu - expo-dev-menu-interface @@ -139,9 +139,9 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - expo-dev-menu (7.0.17): - - expo-dev-menu/Main (= 7.0.17) - - expo-dev-menu/ReactNativeCompatibles (= 7.0.17) + - expo-dev-menu (7.0.18): + - expo-dev-menu/Main (= 7.0.18) + - expo-dev-menu/ReactNativeCompatibles (= 7.0.18) - hermes-engine - RCTRequired - RCTTypeSafety @@ -164,7 +164,7 @@ PODS: - ReactNativeDependencies - Yoga - expo-dev-menu-interface (2.0.0) - - expo-dev-menu/Main (7.0.17): + - expo-dev-menu/Main (7.0.18): - EXManifests - expo-dev-menu-interface - ExpoModulesCore @@ -191,7 +191,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - expo-dev-menu/ReactNativeCompatibles (7.0.17): + - expo-dev-menu/ReactNativeCompatibles (7.0.18): - hermes-engine - RCTRequired - RCTTypeSafety @@ -213,40 +213,40 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - ExpoAppleAuthentication (8.0.7): + - ExpoAppleAuthentication (8.0.8): - ExpoModulesCore - - ExpoAsset (12.0.10): + - ExpoAsset (12.0.12): - ExpoModulesCore - - ExpoAudio (1.0.15): + - ExpoAudio (1.1.1): - ExpoModulesCore - - ExpoBlur (15.0.7): + - ExpoBlur (15.0.8): - ExpoModulesCore - ExpoClipboard (8.0.8): - ExpoModulesCore - - ExpoCrypto (15.0.7): + - ExpoCrypto (15.0.8): - ExpoModulesCore - - ExpoDevice (8.0.9): + - ExpoDevice (8.0.10): - ExpoModulesCore - - ExpoDocumentPicker (14.0.7): + - ExpoDocumentPicker (14.0.8): - ExpoModulesCore - - ExpoFileSystem (19.0.19): + - ExpoFileSystem (19.0.21): - ExpoModulesCore - - ExpoFont (14.0.9): + - ExpoFont (14.0.10): - ExpoModulesCore - ExpoHaptics (15.0.8): - ExpoModulesCore - - ExpoHead (6.0.15): + - ExpoHead (6.0.21): - ExpoModulesCore - RNScreens - - ExpoImagePicker (17.0.8): + - ExpoImagePicker (17.0.10): - ExpoModulesCore - - ExpoKeepAwake (15.0.7): + - ExpoKeepAwake (15.0.8): - ExpoModulesCore - - ExpoLinearGradient (15.0.7): + - ExpoLinearGradient (15.0.8): - ExpoModulesCore - - ExpoLinking (8.0.9): + - ExpoLinking (8.0.11): - ExpoModulesCore - - ExpoModulesCore (3.0.26): + - ExpoModulesCore (3.0.29): - hermes-engine - RCTRequired - RCTTypeSafety @@ -271,18 +271,18 @@ PODS: - Yoga - ExpoSharing (14.0.8): - ExpoModulesCore - - ExpoSplashScreen (31.0.11): + - ExpoSplashScreen (31.0.13): - ExpoModulesCore - - ExpoSystemUI (6.0.8): + - ExpoSystemUI (6.0.9): - ExpoModulesCore - - ExpoTrackingTransparency (6.0.7): + - ExpoTrackingTransparency (6.0.8): - ExpoModulesCore - - ExpoWebBrowser (15.0.9): + - ExpoWebBrowser (15.0.10): - ExpoModulesCore - EXStructuredHeaders (5.0.0) - ExtensionStorage (1.0.0): - ExpoModulesCore - - EXUpdates (29.0.13): + - EXUpdates (29.0.15): - EASClient - EXManifests - ExpoModulesCore @@ -340,11 +340,11 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - PurchasesHybridCommon (17.19.1): - - RevenueCat (= 5.48.0) - - PurchasesHybridCommonUI (17.19.1): - - PurchasesHybridCommon (= 17.19.1) - - RevenueCatUI (= 5.48.0) + - PurchasesHybridCommon (17.26.0): + - RevenueCat (= 5.52.0) + - PurchasesHybridCommonUI (17.26.0): + - PurchasesHybridCommon (= 17.26.0) + - RevenueCatUI (= 5.52.0) - RCTDeprecation (0.81.5) - RCTRequired (0.81.5) - RCTTypeSafety (0.81.5): @@ -1627,7 +1627,7 @@ PODS: - ReactNativeDependencies - react-native-context-menu-view (1.21.0): - React - - react-native-keyboard-controller (1.20.2): + - react-native-keyboard-controller (1.20.3): - hermes-engine - RCTRequired - RCTTypeSafety @@ -1639,7 +1639,7 @@ PODS: - React-graphics - React-ImageManager - React-jsi - - react-native-keyboard-controller/common (= 1.20.2) + - react-native-keyboard-controller/common (= 1.20.3) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1650,7 +1650,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - react-native-keyboard-controller/common (1.20.2): + - react-native-keyboard-controller/common (1.20.3): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2113,9 +2113,9 @@ PODS: - React-utils (= 0.81.5) - ReactNativeDependencies - ReactNativeDependencies (0.81.5) - - RevenueCat (5.48.0) - - RevenueCatUI (5.48.0): - - RevenueCat (= 5.48.0) + - RevenueCat (5.52.0) + - RevenueCatUI (5.52.0): + - RevenueCat (= 5.52.0) - RNCAsyncStorage (2.2.0): - hermes-engine - RCTRequired @@ -2205,7 +2205,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNLiveMarkdown (0.1.317): + - RNLiveMarkdown (0.1.319): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2230,13 +2230,13 @@ PODS: - ReactNativeDependencies - RNWorklets - Yoga - - RNPaywalls (9.6.7): - - PurchasesHybridCommonUI (= 17.19.1) + - RNPaywalls (9.6.13): + - PurchasesHybridCommonUI (= 17.26.0) - React-Core - - RNPurchases (9.6.7): - - PurchasesHybridCommon (= 17.19.1) + - RNPurchases (9.6.13): + - PurchasesHybridCommon (= 17.26.0) - React-Core - - RNReanimated (4.1.5): + - RNReanimated (4.1.6): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2258,10 +2258,10 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - RNReanimated/reanimated (= 4.1.5) + - RNReanimated/reanimated (= 4.1.6) - RNWorklets - Yoga - - RNReanimated/reanimated (4.1.5): + - RNReanimated/reanimated (4.1.6): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2283,10 +2283,10 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - ReactNativeDependencies - - RNReanimated/reanimated/apple (= 4.1.5) + - RNReanimated/reanimated/apple (= 4.1.6) - RNWorklets - Yoga - - RNReanimated/reanimated/apple (4.1.5): + - RNReanimated/reanimated/apple (4.1.6): - hermes-engine - RCTRequired - RCTTypeSafety @@ -2500,131 +2500,131 @@ PODS: - Yoga (0.0.0) DEPENDENCIES: - - EASClient (from `../node_modules/expo-eas-client/ios`) - - EXApplication (from `../node_modules/expo-application/ios`) - - EXAV (from `../node_modules/expo-av/ios`) - - EXConstants (from `../node_modules/expo-constants/ios`) - - EXImageLoader (from `../node_modules/expo-image-loader/ios`) - - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) - - EXManifests (from `../node_modules/expo-manifests/ios`) - - EXNotifications (from `../node_modules/expo-notifications/ios`) - - Expo (from `../node_modules/expo`) - - expo-dev-client (from `../node_modules/expo-dev-client/ios`) - - expo-dev-launcher (from `../node_modules/expo-dev-launcher`) - - expo-dev-menu (from `../node_modules/expo-dev-menu`) - - expo-dev-menu-interface (from `../node_modules/expo-dev-menu-interface/ios`) - - ExpoAppleAuthentication (from `../node_modules/expo-apple-authentication/ios`) - - ExpoAsset (from `../node_modules/expo-asset/ios`) - - ExpoAudio (from `../node_modules/expo-audio/ios`) - - ExpoBlur (from `../node_modules/expo-blur/ios`) - - ExpoClipboard (from `../node_modules/expo-clipboard/ios`) - - ExpoCrypto (from `../node_modules/expo-auth-session/node_modules/expo-crypto/ios`) - - ExpoDevice (from `../node_modules/expo-device/ios`) - - ExpoDocumentPicker (from `../node_modules/expo-document-picker/ios`) - - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - - ExpoFont (from `../node_modules/expo-font/ios`) - - ExpoHaptics (from `../node_modules/expo-haptics/ios`) - - ExpoHead (from `../node_modules/expo-router/ios`) - - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) - - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - - ExpoLinking (from `../node_modules/expo-linking/ios`) - - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - ExpoSharing (from `../node_modules/expo-sharing/ios`) - - ExpoSplashScreen (from `../node_modules/expo-splash-screen/ios`) - - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`) - - ExpoTrackingTransparency (from `../node_modules/expo-tracking-transparency/ios`) - - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`) - - "ExtensionStorage (from `../node_modules/@bacons/apple-targets/ios`)" - - EXUpdates (from `../node_modules/expo-updates/ios`) - - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - lottie-react-native (from `../node_modules/lottie-react-native`) - - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../node_modules/react-native/`) - - React-Core-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) - - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) - - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) - - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) - - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - - react-native-context-menu-view (from `../node_modules/react-native-context-menu-view`) - - react-native-keyboard-controller (from `../node_modules/react-native-keyboard-controller`) - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - react-native-webview (from `../node_modules/react-native-webview`) - - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../node_modules/react-native/React`) - - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - "EASClient (from `../../../node_modules/.pnpm/expo-eas-client@1.0.8/node_modules/expo-eas-client/ios`)" + - "EXApplication (from `../../../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.30/node_modules/expo-application/ios`)" + - "EXAV (from `../../../node_modules/.pnpm/expo-av@16.0.8_expo@54.0.30_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/expo-av/ios`)" + - "EXConstants (from `../../../node_modules/.pnpm/expo-constants@18.0.12_expo@54.0.30_react-native@0.81.5/node_modules/expo-constants/ios`)" + - "EXImageLoader (from `../../../node_modules/.pnpm/expo-image-loader@6.0.0_expo@54.0.30/node_modules/expo-image-loader/ios`)" + - "EXJSONUtils (from `../../../node_modules/.pnpm/expo-json-utils@0.15.0/node_modules/expo-json-utils/ios`)" + - "EXManifests (from `../../../node_modules/.pnpm/expo-manifests@1.0.10_expo@54.0.30/node_modules/expo-manifests/ios`)" + - "EXNotifications (from `../../../node_modules/.pnpm/expo-notifications@0.32.15_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-notifications/ios`)" + - "Expo (from `../../../node_modules/.pnpm/expo@54.0.30_@babel+core@7.28.5_@expo+metro-runtime@6.1.2_expo-router@6.0.21_react-native-web_agmyp56yc3loox4z2nblrhjnzm/node_modules/expo`)" + - "expo-dev-client (from `../../../node_modules/.pnpm/expo-dev-client@6.0.20_expo@54.0.30/node_modules/expo-dev-client/ios`)" + - "expo-dev-launcher (from `../../../node_modules/.pnpm/expo-dev-launcher@6.0.20_expo@54.0.30/node_modules/expo-dev-launcher`)" + - "expo-dev-menu (from `../../../node_modules/.pnpm/expo-dev-menu@7.0.18_expo@54.0.30/node_modules/expo-dev-menu`)" + - "expo-dev-menu-interface (from `../../../node_modules/.pnpm/expo-dev-menu-interface@2.0.0_expo@54.0.30/node_modules/expo-dev-menu-interface/ios`)" + - "ExpoAppleAuthentication (from `../../../node_modules/.pnpm/expo-apple-authentication@8.0.8_expo@54.0.30_react-native@0.81.5/node_modules/expo-apple-authentication/ios`)" + - "ExpoAsset (from `../../../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-asset/ios`)" + - "ExpoAudio (from `../../../node_modules/.pnpm/expo-audio@1.1.1_expo-asset@12.0.12_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-audio/ios`)" + - "ExpoBlur (from `../../../node_modules/.pnpm/expo-blur@15.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-blur/ios`)" + - "ExpoClipboard (from `../../../node_modules/.pnpm/expo-clipboard@8.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-clipboard/ios`)" + - "ExpoCrypto (from `../../../node_modules/.pnpm/expo-crypto@15.0.8_expo@54.0.30/node_modules/expo-crypto/ios`)" + - "ExpoDevice (from `../../../node_modules/.pnpm/expo-device@8.0.10_expo@54.0.30/node_modules/expo-device/ios`)" + - "ExpoDocumentPicker (from `../../../node_modules/.pnpm/expo-document-picker@14.0.8_expo@54.0.30/node_modules/expo-document-picker/ios`)" + - "ExpoFileSystem (from `../../../node_modules/.pnpm/expo-file-system@19.0.21_expo@54.0.30_react-native@0.81.5/node_modules/expo-file-system/ios`)" + - "ExpoFont (from `../../../node_modules/.pnpm/expo-font@14.0.10_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-font/ios`)" + - "ExpoHaptics (from `../../../node_modules/.pnpm/expo-haptics@15.0.8_expo@54.0.30/node_modules/expo-haptics/ios`)" + - "ExpoHead (from `../../../node_modules/.pnpm/expo-router@6.0.21_@expo+metro-runtime@6.1.2_@react-native-masked-view+masked-view@0.3.2_@typ_grqnyeluelcm3n6ghvqs6yktiy/node_modules/expo-router/ios`)" + - "ExpoImagePicker (from `../../../node_modules/.pnpm/expo-image-picker@17.0.10_expo@54.0.30/node_modules/expo-image-picker/ios`)" + - "ExpoKeepAwake (from `../../../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.30_react@19.1.0/node_modules/expo-keep-awake/ios`)" + - "ExpoLinearGradient (from `../../../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-linear-gradient/ios`)" + - "ExpoLinking (from `../../../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-linking/ios`)" + - "ExpoModulesCore (from `../../../node_modules/.pnpm/expo-modules-core@3.0.29_react-native@0.81.5_react@19.1.0/node_modules/expo-modules-core`)" + - "ExpoSharing (from `../../../node_modules/.pnpm/expo-sharing@14.0.8_expo@54.0.30/node_modules/expo-sharing/ios`)" + - "ExpoSplashScreen (from `../../../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.30/node_modules/expo-splash-screen/ios`)" + - "ExpoSystemUI (from `../../../node_modules/.pnpm/expo-system-ui@6.0.9_expo@54.0.30_react-native-web@0.21.2_react-native@0.81.5/node_modules/expo-system-ui/ios`)" + - "ExpoTrackingTransparency (from `../../../node_modules/.pnpm/expo-tracking-transparency@6.0.8_expo@54.0.30_react-native@0.81.5/node_modules/expo-tracking-transparency/ios`)" + - "ExpoWebBrowser (from `../../../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.30_react-native@0.81.5/node_modules/expo-web-browser/ios`)" + - "EXStructuredHeaders (from `../../../node_modules/.pnpm/expo-structured-headers@5.0.0/node_modules/expo-structured-headers/ios`)" + - "ExtensionStorage (from `../../../node_modules/.pnpm/@bacons+apple-targets@3.0.6/node_modules/@bacons/apple-targets/ios`)" + - "EXUpdates (from `../../../node_modules/.pnpm/expo-updates@29.0.15_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-updates/ios`)" + - "EXUpdatesInterface (from `../../../node_modules/.pnpm/expo-updates-interface@2.0.0_expo@54.0.30/node_modules/expo-updates-interface/ios`)" + - "FBLazyVector (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector`)" + - "hermes-engine (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)" + - "lottie-react-native (from `../../../node_modules/.pnpm/lottie-react-native@7.3.4_@lottiefiles+dotlottie-react@0.13.5_react-native@0.81.5_react@19.1.0/node_modules/lottie-react-native`)" + - "RCTDeprecation (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)" + - "RCTRequired (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Required`)" + - "RCTTypeSafety (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/TypeSafety`)" + - "React (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/`)" + - "React-callinvoker (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/callinvoker`)" + - "React-Core (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/`)" + - "React-Core-prebuilt (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React-Core-prebuilt.podspec`)" + - "React-Core/RCTWebSocket (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/`)" + - "React-CoreModules (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React/CoreModules`)" + - "React-cxxreact (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/cxxreact`)" + - "React-debug (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/debug`)" + - "React-defaultsnativemodule (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/defaults`)" + - "React-domnativemodule (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/dom`)" + - "React-Fabric (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)" + - "React-FabricComponents (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)" + - "React-FabricImage (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)" + - "React-featureflags (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/featureflags`)" + - "React-featureflagsnativemodule (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)" + - "React-graphics (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/graphics`)" + - "React-hermes (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/hermes`)" + - "React-idlecallbacksnativemodule (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)" + - "React-ImageManager (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)" + - "React-jserrorhandler (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jserrorhandler`)" + - "React-jsi (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsi`)" + - "React-jsiexecutor (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsiexecutor`)" + - "React-jsinspector (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern`)" + - "React-jsinspectorcdp (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/cdp`)" + - "React-jsinspectornetwork (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/network`)" + - "React-jsinspectortracing (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/tracing`)" + - "React-jsitooling (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsitooling`)" + - "React-jsitracing (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/hermes/executor/`)" + - "React-logger (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/logger`)" + - "React-Mapbuffer (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)" + - "React-microtasksnativemodule (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)" + - "react-native-context-menu-view (from `../../../node_modules/.pnpm/react-native-context-menu-view@1.21.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-context-menu-view`)" + - "react-native-keyboard-controller (from `../../../node_modules/.pnpm/react-native-keyboard-controller@1.20.3_react-native-reanimated@4.1.6_react-native@0.81.5_react@19.1.0/node_modules/react-native-keyboard-controller`)" + - "react-native-safe-area-context (from `../../../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-safe-area-context`)" + - "react-native-webview (from `../../../node_modules/.pnpm/react-native-webview@13.16.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-webview`)" + - "React-NativeModulesApple (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)" + - "React-oscompat (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/oscompat`)" + - "React-perflogger (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/reactperflogger`)" + - "React-performancetimeline (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/performance/timeline`)" + - "React-RCTActionSheet (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/ActionSheetIOS`)" + - "React-RCTAnimation (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/NativeAnimation`)" + - "React-RCTAppDelegate (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/AppDelegate`)" + - "React-RCTBlob (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Blob`)" + - "React-RCTFabric (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React`)" + - "React-RCTFBReactNativeSpec (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React`)" + - "React-RCTImage (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Image`)" + - "React-RCTLinking (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/LinkingIOS`)" + - "React-RCTNetwork (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Network`)" + - "React-RCTRuntime (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React/Runtime`)" + - "React-RCTSettings (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Settings`)" + - "React-RCTText (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Text`)" + - "React-RCTVibration (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Vibration`)" + - "React-rendererconsistency (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/consistency`)" + - "React-renderercss (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/css`)" + - "React-rendererdebug (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/debug`)" + - "React-RuntimeApple (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime/platform/ios`)" + - "React-RuntimeCore (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime`)" + - "React-runtimeexecutor (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/runtimeexecutor`)" + - "React-RuntimeHermes (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime`)" + - "React-runtimescheduler (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)" + - "React-timing (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/timing`)" + - "React-utils (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/utils`)" - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" - - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - "RNLiveMarkdown (from `../node_modules/@expensify/react-native-live-markdown`)" - - RNPaywalls (from `../node_modules/react-native-purchases-ui`) - - RNPurchases (from `../node_modules/react-native-purchases`) - - RNReanimated (from `../node_modules/react-native-reanimated`) - - RNScreens (from `../node_modules/react-native-screens`) - - RNSoundLevel (from `../node_modules/react-native-sound-level`) - - RNSVG (from `../node_modules/react-native-svg`) - - RNVectorIcons (from `../node_modules/react-native-vector-icons`) - - RNWorklets (from `../node_modules/react-native-worklets`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + - "ReactCommon/turbomodule/core (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon`)" + - "ReactNativeDependencies (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`)" + - "RNCAsyncStorage (from `../../../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5/node_modules/@react-native-async-storage/async-storage`)" + - "RNCMaskedView (from `../../../node_modules/.pnpm/@react-native-masked-view+masked-view@0.3.2_react-native@0.81.5_react@19.1.0/node_modules/@react-native-masked-view/masked-view`)" + - "RNCPicker (from `../../../node_modules/.pnpm/@react-native-picker+picker@2.11.1_react-native@0.81.5_react@19.1.0/node_modules/@react-native-picker/picker`)" + - "RNGestureHandler (from `../../../node_modules/.pnpm/react-native-gesture-handler@2.28.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-gesture-handler`)" + - "RNLiveMarkdown (from `../../../node_modules/.pnpm/@expensify+react-native-live-markdown@0.1.319_expensify-common@2.0.169_react-native-worklets@_zjc3wossqxzrafxit6ffgatrdq/node_modules/@expensify/react-native-live-markdown`)" + - "RNPaywalls (from `../../../node_modules/.pnpm/react-native-purchases-ui@9.6.13_react-native-purchases@9.6.13_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-purchases-ui`)" + - "RNPurchases (from `../../../node_modules/.pnpm/react-native-purchases@9.6.13_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-purchases`)" + - "RNReanimated (from `../../../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.5_react-native-worklets@0.6.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-reanimated`)" + - "RNScreens (from `../../../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-screens`)" + - "RNSoundLevel (from `../../../node_modules/.pnpm/react-native-sound-level@1.3.0/node_modules/react-native-sound-level`)" + - "RNSVG (from `../../../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_react@19.1.0/node_modules/react-native-svg`)" + - "RNVectorIcons (from `../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons`)" + - "RNWorklets (from `../../../node_modules/.pnpm/react-native-worklets@0.6.0_@babel+core@7.28.5_react-native@0.81.5_react@19.1.0/node_modules/react-native-worklets`)" + - "Yoga (from `../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga`)" SPEC REPOS: trunk: @@ -2637,301 +2637,301 @@ SPEC REPOS: EXTERNAL SOURCES: EASClient: - :path: "../node_modules/expo-eas-client/ios" + :path: "../../../node_modules/.pnpm/expo-eas-client@1.0.8/node_modules/expo-eas-client/ios" EXApplication: - :path: "../node_modules/expo-application/ios" + :path: "../../../node_modules/.pnpm/expo-application@7.0.8_expo@54.0.30/node_modules/expo-application/ios" EXAV: - :path: "../node_modules/expo-av/ios" + :path: "../../../node_modules/.pnpm/expo-av@16.0.8_expo@54.0.30_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/expo-av/ios" EXConstants: - :path: "../node_modules/expo-constants/ios" + :path: "../../../node_modules/.pnpm/expo-constants@18.0.12_expo@54.0.30_react-native@0.81.5/node_modules/expo-constants/ios" EXImageLoader: - :path: "../node_modules/expo-image-loader/ios" + :path: "../../../node_modules/.pnpm/expo-image-loader@6.0.0_expo@54.0.30/node_modules/expo-image-loader/ios" EXJSONUtils: - :path: "../node_modules/expo-json-utils/ios" + :path: "../../../node_modules/.pnpm/expo-json-utils@0.15.0/node_modules/expo-json-utils/ios" EXManifests: - :path: "../node_modules/expo-manifests/ios" + :path: "../../../node_modules/.pnpm/expo-manifests@1.0.10_expo@54.0.30/node_modules/expo-manifests/ios" EXNotifications: - :path: "../node_modules/expo-notifications/ios" + :path: "../../../node_modules/.pnpm/expo-notifications@0.32.15_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-notifications/ios" Expo: - :path: "../node_modules/expo" + :path: "../../../node_modules/.pnpm/expo@54.0.30_@babel+core@7.28.5_@expo+metro-runtime@6.1.2_expo-router@6.0.21_react-native-web_agmyp56yc3loox4z2nblrhjnzm/node_modules/expo" expo-dev-client: - :path: "../node_modules/expo-dev-client/ios" + :path: "../../../node_modules/.pnpm/expo-dev-client@6.0.20_expo@54.0.30/node_modules/expo-dev-client/ios" expo-dev-launcher: - :path: "../node_modules/expo-dev-launcher" + :path: "../../../node_modules/.pnpm/expo-dev-launcher@6.0.20_expo@54.0.30/node_modules/expo-dev-launcher" expo-dev-menu: - :path: "../node_modules/expo-dev-menu" + :path: "../../../node_modules/.pnpm/expo-dev-menu@7.0.18_expo@54.0.30/node_modules/expo-dev-menu" expo-dev-menu-interface: - :path: "../node_modules/expo-dev-menu-interface/ios" + :path: "../../../node_modules/.pnpm/expo-dev-menu-interface@2.0.0_expo@54.0.30/node_modules/expo-dev-menu-interface/ios" ExpoAppleAuthentication: - :path: "../node_modules/expo-apple-authentication/ios" + :path: "../../../node_modules/.pnpm/expo-apple-authentication@8.0.8_expo@54.0.30_react-native@0.81.5/node_modules/expo-apple-authentication/ios" ExpoAsset: - :path: "../node_modules/expo-asset/ios" + :path: "../../../node_modules/.pnpm/expo-asset@12.0.12_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-asset/ios" ExpoAudio: - :path: "../node_modules/expo-audio/ios" + :path: "../../../node_modules/.pnpm/expo-audio@1.1.1_expo-asset@12.0.12_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-audio/ios" ExpoBlur: - :path: "../node_modules/expo-blur/ios" + :path: "../../../node_modules/.pnpm/expo-blur@15.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-blur/ios" ExpoClipboard: - :path: "../node_modules/expo-clipboard/ios" + :path: "../../../node_modules/.pnpm/expo-clipboard@8.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-clipboard/ios" ExpoCrypto: - :path: "../node_modules/expo-auth-session/node_modules/expo-crypto/ios" + :path: "../../../node_modules/.pnpm/expo-crypto@15.0.8_expo@54.0.30/node_modules/expo-crypto/ios" ExpoDevice: - :path: "../node_modules/expo-device/ios" + :path: "../../../node_modules/.pnpm/expo-device@8.0.10_expo@54.0.30/node_modules/expo-device/ios" ExpoDocumentPicker: - :path: "../node_modules/expo-document-picker/ios" + :path: "../../../node_modules/.pnpm/expo-document-picker@14.0.8_expo@54.0.30/node_modules/expo-document-picker/ios" ExpoFileSystem: - :path: "../node_modules/expo-file-system/ios" + :path: "../../../node_modules/.pnpm/expo-file-system@19.0.21_expo@54.0.30_react-native@0.81.5/node_modules/expo-file-system/ios" ExpoFont: - :path: "../node_modules/expo-font/ios" + :path: "../../../node_modules/.pnpm/expo-font@14.0.10_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-font/ios" ExpoHaptics: - :path: "../node_modules/expo-haptics/ios" + :path: "../../../node_modules/.pnpm/expo-haptics@15.0.8_expo@54.0.30/node_modules/expo-haptics/ios" ExpoHead: - :path: "../node_modules/expo-router/ios" + :path: "../../../node_modules/.pnpm/expo-router@6.0.21_@expo+metro-runtime@6.1.2_@react-native-masked-view+masked-view@0.3.2_@typ_grqnyeluelcm3n6ghvqs6yktiy/node_modules/expo-router/ios" ExpoImagePicker: - :path: "../node_modules/expo-image-picker/ios" + :path: "../../../node_modules/.pnpm/expo-image-picker@17.0.10_expo@54.0.30/node_modules/expo-image-picker/ios" ExpoKeepAwake: - :path: "../node_modules/expo-keep-awake/ios" + :path: "../../../node_modules/.pnpm/expo-keep-awake@15.0.8_expo@54.0.30_react@19.1.0/node_modules/expo-keep-awake/ios" ExpoLinearGradient: - :path: "../node_modules/expo-linear-gradient/ios" + :path: "../../../node_modules/.pnpm/expo-linear-gradient@15.0.8_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-linear-gradient/ios" ExpoLinking: - :path: "../node_modules/expo-linking/ios" + :path: "../../../node_modules/.pnpm/expo-linking@8.0.11_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-linking/ios" ExpoModulesCore: - :path: "../node_modules/expo-modules-core" + :path: "../../../node_modules/.pnpm/expo-modules-core@3.0.29_react-native@0.81.5_react@19.1.0/node_modules/expo-modules-core" ExpoSharing: - :path: "../node_modules/expo-sharing/ios" + :path: "../../../node_modules/.pnpm/expo-sharing@14.0.8_expo@54.0.30/node_modules/expo-sharing/ios" ExpoSplashScreen: - :path: "../node_modules/expo-splash-screen/ios" + :path: "../../../node_modules/.pnpm/expo-splash-screen@31.0.13_expo@54.0.30/node_modules/expo-splash-screen/ios" ExpoSystemUI: - :path: "../node_modules/expo-system-ui/ios" + :path: "../../../node_modules/.pnpm/expo-system-ui@6.0.9_expo@54.0.30_react-native-web@0.21.2_react-native@0.81.5/node_modules/expo-system-ui/ios" ExpoTrackingTransparency: - :path: "../node_modules/expo-tracking-transparency/ios" + :path: "../../../node_modules/.pnpm/expo-tracking-transparency@6.0.8_expo@54.0.30_react-native@0.81.5/node_modules/expo-tracking-transparency/ios" ExpoWebBrowser: - :path: "../node_modules/expo-web-browser/ios" + :path: "../../../node_modules/.pnpm/expo-web-browser@15.0.10_expo@54.0.30_react-native@0.81.5/node_modules/expo-web-browser/ios" EXStructuredHeaders: - :path: "../node_modules/expo-structured-headers/ios" + :path: "../../../node_modules/.pnpm/expo-structured-headers@5.0.0/node_modules/expo-structured-headers/ios" ExtensionStorage: - :path: "../node_modules/@bacons/apple-targets/ios" + :path: "../../../node_modules/.pnpm/@bacons+apple-targets@3.0.6/node_modules/@bacons/apple-targets/ios" EXUpdates: - :path: "../node_modules/expo-updates/ios" + :path: "../../../node_modules/.pnpm/expo-updates@29.0.15_expo@54.0.30_react-native@0.81.5_react@19.1.0/node_modules/expo-updates/ios" EXUpdatesInterface: - :path: "../node_modules/expo-updates-interface/ios" + :path: "../../../node_modules/.pnpm/expo-updates-interface@2.0.0_expo@54.0.30/node_modules/expo-updates-interface/ios" FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/FBLazyVector" hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :podspec: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782 lottie-react-native: - :path: "../node_modules/lottie-react-native" + :path: "../../../node_modules/.pnpm/lottie-react-native@7.3.4_@lottiefiles+dotlottie-react@0.13.5_react-native@0.81.5_react@19.1.0/node_modules/lottie-react-native" RCTDeprecation: - :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../node_modules/react-native/Libraries/Required" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Required" RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/TypeSafety" React: - :path: "../node_modules/react-native/" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/" React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/callinvoker" React-Core: - :path: "../node_modules/react-native/" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/" React-Core-prebuilt: - :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" + :podspec: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React-Core-prebuilt.podspec" React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React/CoreModules" React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/cxxreact" React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/defaults" React-domnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon" React-FabricComponents: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon" React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon" React-featureflags: - :path: "../node_modules/react-native/ReactCommon/react/featureflags" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/featureflags" React-featureflagsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern" React-jsinspectorcdp: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/cdp" React-jsinspectornetwork: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/network" React-jsinspectortracing: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsinspector-modern/tracing" React-jsitooling: - :path: "../node_modules/react-native/ReactCommon/jsitooling" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/jsitooling" React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/hermes/executor/" React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/logger" React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon" React-microtasksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/microtasks" react-native-context-menu-view: - :path: "../node_modules/react-native-context-menu-view" + :path: "../../../node_modules/.pnpm/react-native-context-menu-view@1.21.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-context-menu-view" react-native-keyboard-controller: - :path: "../node_modules/react-native-keyboard-controller" + :path: "../../../node_modules/.pnpm/react-native-keyboard-controller@1.20.3_react-native-reanimated@4.1.6_react-native@0.81.5_react@19.1.0/node_modules/react-native-keyboard-controller" react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" + :path: "../../../node_modules/.pnpm/react-native-safe-area-context@5.6.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-safe-area-context" react-native-webview: - :path: "../node_modules/react-native-webview" + :path: "../../../node_modules/.pnpm/react-native-webview@13.16.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-webview" React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-oscompat: - :path: "../node_modules/react-native/ReactCommon/oscompat" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/oscompat" React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: - :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Blob" React-RCTFabric: - :path: "../node_modules/react-native/React" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React" React-RCTFBReactNativeSpec: - :path: "../node_modules/react-native/React" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React" React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Image" React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Network" React-RCTRuntime: - :path: "../node_modules/react-native/React/Runtime" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/React/Runtime" React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Settings" React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Text" React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/Libraries/Vibration" React-rendererconsistency: - :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/consistency" React-renderercss: - :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/debug" React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/runtimeexecutor" React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-timing: - :path: "../node_modules/react-native/ReactCommon/react/timing" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/timing" React-utils: - :path: "../node_modules/react-native/ReactCommon/react/utils" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/react/utils" ReactAppDependencyProvider: :path: build/generated/ios ReactCodegen: :path: build/generated/ios ReactCommon: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon" ReactNativeDependencies: - :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" + :podspec: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" RNCAsyncStorage: - :path: "../node_modules/@react-native-async-storage/async-storage" + :path: "../../../node_modules/.pnpm/@react-native-async-storage+async-storage@2.2.0_react-native@0.81.5/node_modules/@react-native-async-storage/async-storage" RNCMaskedView: - :path: "../node_modules/@react-native-masked-view/masked-view" + :path: "../../../node_modules/.pnpm/@react-native-masked-view+masked-view@0.3.2_react-native@0.81.5_react@19.1.0/node_modules/@react-native-masked-view/masked-view" RNCPicker: - :path: "../node_modules/@react-native-picker/picker" + :path: "../../../node_modules/.pnpm/@react-native-picker+picker@2.11.1_react-native@0.81.5_react@19.1.0/node_modules/@react-native-picker/picker" RNGestureHandler: - :path: "../node_modules/react-native-gesture-handler" + :path: "../../../node_modules/.pnpm/react-native-gesture-handler@2.28.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-gesture-handler" RNLiveMarkdown: - :path: "../node_modules/@expensify/react-native-live-markdown" + :path: "../../../node_modules/.pnpm/@expensify+react-native-live-markdown@0.1.319_expensify-common@2.0.169_react-native-worklets@_zjc3wossqxzrafxit6ffgatrdq/node_modules/@expensify/react-native-live-markdown" RNPaywalls: - :path: "../node_modules/react-native-purchases-ui" + :path: "../../../node_modules/.pnpm/react-native-purchases-ui@9.6.13_react-native-purchases@9.6.13_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-purchases-ui" RNPurchases: - :path: "../node_modules/react-native-purchases" + :path: "../../../node_modules/.pnpm/react-native-purchases@9.6.13_react-native-web@0.21.2_react-native@0.81.5_react@19.1.0/node_modules/react-native-purchases" RNReanimated: - :path: "../node_modules/react-native-reanimated" + :path: "../../../node_modules/.pnpm/react-native-reanimated@4.1.6_@babel+core@7.28.5_react-native-worklets@0.6.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-reanimated" RNScreens: - :path: "../node_modules/react-native-screens" + :path: "../../../node_modules/.pnpm/react-native-screens@4.16.0_react-native@0.81.5_react@19.1.0/node_modules/react-native-screens" RNSoundLevel: - :path: "../node_modules/react-native-sound-level" + :path: "../../../node_modules/.pnpm/react-native-sound-level@1.3.0/node_modules/react-native-sound-level" RNSVG: - :path: "../node_modules/react-native-svg" + :path: "../../../node_modules/.pnpm/react-native-svg@15.12.1_react-native@0.81.5_react@19.1.0/node_modules/react-native-svg" RNVectorIcons: - :path: "../node_modules/react-native-vector-icons" + :path: "../../../node_modules/.pnpm/react-native-vector-icons@10.3.0/node_modules/react-native-vector-icons" RNWorklets: - :path: "../node_modules/react-native-worklets" + :path: "../../../node_modules/.pnpm/react-native-worklets@0.6.0_@babel+core@7.28.5_react-native@0.81.5_react@19.1.0/node_modules/react-native-worklets" Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" + :path: "../../../node_modules/.pnpm/react-native@0.81.5_@babel+core@7.28.5_@types+react@19.1.17_react@19.1.0/node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - EASClient: 68127f1248d2b25fdc82dbbfb17be95d1c4700be - EXApplication: 296622817d459f46b6c5fe8691f4aac44d2b79e7 - EXAV: e3fefaca88f14624bca01d9a128562a5f8e738f8 - EXConstants: fd688cef4e401dcf798a021cfb5d87c890c30ba3 + EASClient: 40dd9e740684782610c49becab2643782ea1a20c + EXApplication: 1e98d4b1dccdf30627f92917f4b2c5a53c330e5f + EXAV: b60fcf142fae6684d295bc28cd7cfcb3335570ea + EXConstants: 805f35b1b295c542ca6acce836f21a1f9ee104d5 EXImageLoader: 189e3476581efe3ad4d1d3fb4735b7179eb26f05 EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd - EXManifests: 26e15640538c3d5ef028077ebcaf004b744d4932 - EXNotifications: a62e1f8e3edd258dc3b155d3caa49f32920f1c6c - Expo: c347cdb69706ea3de83da97ce956042aafd8e62a - expo-dev-client: cc9491ad3e25a7a89f367c30f72884584c682b77 - expo-dev-launcher: 61322d7e368e7fa78e355b8882df90f5e8eafe93 - expo-dev-menu: 66daef3e1fce372ac93fd079ad8172a9c1206cc3 + EXManifests: a8d97683e5c7a3b026ffbd58559c64dc655b747b + EXNotifications: 983f04ad4ad879b181179e326bf220541e478386 + Expo: 1f4ad94ec8871303ed391aa21ff93e9cc69ac3f7 + expo-dev-client: 425ee077d6754a98cfe3a2e2410d29b440b24c9d + expo-dev-launcher: 2559cd405f6e69bd1f1794b4756e46b7f0f648ef + expo-dev-menu: cf3e52f2e4402e54e9a36a25c7b38569a82c2c54 expo-dev-menu-interface: 600df12ea01efecdd822daaf13cc0ac091775533 - ExpoAppleAuthentication: bc9de6e9ff3340604213ab9031d4c4f7f802623e - ExpoAsset: d839c8eae8124470332408427327e8f88beb2dfd - ExpoAudio: a435784a5da9c27649d5c585b47c65ee4e25ff2a - ExpoBlur: 2dd8f64aa31f5d405652c21d3deb2d2588b1852f + ExpoAppleAuthentication: 9413ae9a5e631a424cc04c1b13b0694dbab7d594 + ExpoAsset: f867e55ceb428aab99e1e8c082b5aee7c159ea18 + ExpoAudio: e4cfe3a2f3317b8487460685385a9867a07fb4fb + ExpoBlur: b90747a3f22a8b6ceffd9cb0dc41a4184efdc656 ExpoClipboard: b36b287d8356887844bb08ed5c84b5979bb4dd1e - ExpoCrypto: c1fbce112d1b6b79652bbe380b4fd4cc91676595 - ExpoDevice: 148accb4071873d19fba80a2506c58ffa433d620 - ExpoDocumentPicker: 2200eefc2817f19315fa18f0147e0b80ece86926 - ExpoFileSystem: 77157a101e03150a4ea4f854b4dd44883c93ae0a - ExpoFont: cf9d90ec1d3b97c4f513211905724c8171f82961 + ExpoCrypto: b6105ebaa15d6b38a811e71e43b52cd934945322 + ExpoDevice: 6327c3c200816795708885adf540d26ecab83d1a + ExpoDocumentPicker: 7cd9e71a0f66fb19eb0a586d6f26eee1284692e0 + ExpoFileSystem: 858a44267a3e6e9057e0888ad7c7cfbf55d52063 + ExpoFont: 35ac6191ed86bbf56b3ebd2d9154eda9fad5b509 ExpoHaptics: d3a6375d8dcc3a1083d003bc2298ff654fafb536 - ExpoHead: 95a6ee0be1142320bccf07961d6a1502ded5d6ac - ExpoImagePicker: d251aab45a1b1857e4156fed88511b278b4eee1c - ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe - ExpoLinearGradient: a464898cb95153125e3b81894fd479bcb1c7dd27 - ExpoLinking: 77455aa013e9b6a3601de03ecfab09858ee1b031 - ExpoModulesCore: 9460546192590b0ed13493d9b01bed256d3440b0 + ExpoHead: 9719a74953454fac328e90f34eea55ebbb3bbbf9 + ExpoImagePicker: 1af3e4e31512d2f34c95c2a3018a3edc40aee748 + ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296 + ExpoLinearGradient: 809102bdb979f590083af49f7fa4805cd931bd58 + ExpoLinking: 8f0aaf69aa56f832913030503b6263dc6f647f37 + ExpoModulesCore: 031cf9b42fab2e84dcf34087dbd12ae666c100e0 ExpoSharing: 0d983394ed4a80334bab5a0d5384f75710feb7e8 - ExpoSplashScreen: 268b2f128dc04284c21010540a6c4dd9f95003e3 - ExpoSystemUI: 2761aa6875849af83286364811d46e8ed8ea64c7 - ExpoTrackingTransparency: f9ad2b1955c71085aa9208ed180721301614bac9 - ExpoWebBrowser: b973e1351fdcf5fec0c400997b1851f5a8219ec3 + ExpoSplashScreen: bc3cffefca2716e5f22350ca109badd7e50ec14d + ExpoSystemUI: 2ad325f361a2fcd96a464e8574e19935c461c9cc + ExpoTrackingTransparency: 4f823a38ff7c0efea4cac722ecbc0589278ff548 + ExpoWebBrowser: 17b064c621789e41d4816c95c93f429b84971f52 EXStructuredHeaders: c951e77f2d936f88637421e9588c976da5827368 ExtensionStorage: 5796de20bf181317c376d693fedb64c6781a33ba - EXUpdates: 9b61bfe4fbc0188ed61e406ee13bfacecb9328cf + EXUpdates: f20abbc8a9f4e150656fe88126d52f52d4e7793f EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734 FBLazyVector: e95a291ad2dadb88e42b06e0c5fb8262de53ec12 hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172 lottie-ios: a881093fab623c467d3bce374367755c272bdd59 lottie-react-native: c34a02df495e2002c36ea2f682ae1c1ef2e11ce7 - PurchasesHybridCommon: a4837eebc889b973668af685d6c23b89a038461d - PurchasesHybridCommonUI: bf5566763f906429584534a117a7862537b92c0c + PurchasesHybridCommon: 93399cb2ba29164dbab79d6398e79f7723b41653 + PurchasesHybridCommonUI: ebbb750fc4592418a15a16c88061dd8734a509db RCTDeprecation: 943572d4be82d480a48f4884f670135ae30bf990 RCTRequired: 8f3cfc90cc25cf6e420ddb3e7caaaabc57df6043 RCTTypeSafety: 16a4144ca3f959583ab019b57d5633df10b5e97c @@ -2967,7 +2967,7 @@ SPEC CHECKSUMS: React-Mapbuffer: 0164bc6ba0866e6314d86851620e6f1f95a1b4fb React-microtasksnativemodule: f5972fb404f7c363ff34b2292e72a716956c590c react-native-context-menu-view: da39a4612c1294d651907162529cfba8421e9b89 - react-native-keyboard-controller: 9fb875b771b2719ec7322a2dc8151094103bf467 + react-native-keyboard-controller: 216386164f7f7536c135761aab67baee48405688 react-native-safe-area-context: c5d42c4294aa175415947e23c2ac956253abfc7d react-native-webview: 6b41d44f853c7f8dd8b685d8d289fe33349e4e1b React-NativeModulesApple: 8969913947d5b576de4ed371a939455a8daf28aa @@ -2998,24 +2998,24 @@ SPEC CHECKSUMS: React-timing: 32f695c27e3896d6f1bef77de042781b1bc999b3 React-utils: 9f498dae9ce2da37772ab680a37ba516a4ea0a7e ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79 - ReactCodegen: 9a5f0d4c80fe9bb1ff29309a76392825aabe68c7 + ReactCodegen: a6c996b1b22ed70a47724d3d066d1cf520ee5853 ReactCommon: 08810150b1206cc44aecf5f6ae19af32f29151a8 ReactNativeDependencies: 71ce9c28beb282aa720ea7b46980fff9669f428a - RevenueCat: 1e61140a343a77dc286f171b3ffab99ca09a4b57 - RevenueCatUI: 625b2b2f4ee8c052d2e9939c2b906cdaecded253 + RevenueCat: 946aceaf97c1eee083dd7fad65a0e0d0c64c837e + RevenueCatUI: 9e4a7e2ccff6b4fc9becd72b7efc9476c458e936 RNCAsyncStorage: c8407cc394627a3a4cf56b457d594bfa822b6ab8 RNCMaskedView: ee2fc4739eb35be50bcf4f95daca19f316b5d50c RNCPicker: e77543f719cf823e13dcf8080336d633101b098e RNGestureHandler: c3831b3b1b5014c6afab7fff7e4171394a3419ab - RNLiveMarkdown: 110f267fb6d1eb0d6185d94bc5f547cb86d692af - RNPaywalls: d9f17bc5cab8555a7c0b395f5c0bdc3256b42c2a - RNPurchases: 5f3cd4fea5ef2b3914c925b2201dd5cecd31922f - RNReanimated: 2a5413dfcf429c7c9ce3f0030e3b7a010c2f9565 + RNLiveMarkdown: 93fafa5e8630943c19e2812e886168d01260ef08 + RNPaywalls: 3d5665fe648b73c4d7d10d9d42eba56aaf840c37 + RNPurchases: 049c027cded681054a37b4aea87d904626174c76 + RNReanimated: 808852eea63ab721650eefa448d81fdb08cc5ea5 RNScreens: 33bbd1d0f86ed957557620dc94054b71db0a94ee RNSoundLevel: a48da8668fbde4f792c0bea948e27ab793bee7e1 RNSVG: ac3047fdd9c0ebac9d0b731a352bddf216af6242 RNVectorIcons: 1db72384402bc567e995855056b8c5d7a9888780 - RNWorklets: e2f21d10699f21634e4b9583c10e3596e6d3b353 + RNWorklets: 4299397bcbd06e58e6c5542d973cd4bd2968a1ec Yoga: 65431d43277b661ebc7289c6c5d82f64ce42cfe0 PODFILE CHECKSUM: 19257a90c1108320bf652a885989f1815b4fa281 diff --git a/apps/mobile/lib/icons/tool-icons.ts b/apps/mobile/lib/icons/tool-icons.ts new file mode 100644 index 0000000000..f212734484 --- /dev/null +++ b/apps/mobile/lib/icons/tool-icons.ts @@ -0,0 +1,85 @@ +/** + * Tool icon resolver for mobile (lucide-react-native) + * Uses shared icon keys but resolves to actual React Native components + */ + +import { getToolIconKey } from '@agentpress/shared'; +import type { ToolIconKey } from '@agentpress/shared'; +import { + Globe, + FileEdit, + FileSearch, + FilePlus, + FileText, + FileX, + List, + ListTodo, + Terminal, + Computer, + Search, + ExternalLink, + Network, + Table2, + Code, + Phone, + PhoneOff, + MessageCircleQuestion, + CheckCircle2, + Wrench, + BookOpen, + Plug, + Clock, + Presentation, + ImageIcon, + Pencil, + HammerIcon, + type LucideIcon, +} from 'lucide-react-native'; + +/** + * Map icon keys to lucide-react-native components + */ +const ICON_MAP: Record = { + 'globe': Globe, + 'file-edit': FileEdit, + 'file-search': FileSearch, + 'file-plus': FilePlus, + 'file-text': FileText, + 'file-x': FileX, + 'list': List, + 'list-todo': ListTodo, + 'terminal': Terminal, + 'computer': Computer, + 'search': Search, + 'external-link': ExternalLink, + 'network': Network, + 'table': Table2, + 'code': Code, + 'phone': Phone, + 'phone-off': PhoneOff, + 'message-question': MessageCircleQuestion, + 'check-circle': CheckCircle2, + 'wrench': Wrench, + 'book-open': BookOpen, + 'plug': Plug, + 'clock': Clock, + 'presentation': Presentation, + 'image': ImageIcon, + 'pencil': Pencil, + 'hammer': HammerIcon, +}; + +/** + * Get the icon component for a tool name + * + * @param toolName - The tool name + * @returns The React Native component for the icon + */ +export function getToolIcon(toolName: string): LucideIcon { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} + +// Re-export the icon key function for type checking +export { getToolIconKey, type ToolIconKey }; + diff --git a/apps/mobile/lib/utils/index.ts b/apps/mobile/lib/utils/index.ts index 7ec62c71c6..d88f2b53a6 100644 --- a/apps/mobile/lib/utils/index.ts +++ b/apps/mobile/lib/utils/index.ts @@ -15,13 +15,13 @@ export * from './fonts'; export * from './icon-mapping'; // Parsing & formatting -export * from './message-grouping'; -export * from './tool-parser'; -export * from './tool-display'; +// message-grouping moved to @agentpress/shared/utils +// tool-parser moved to @agentpress/shared/tools +// tool-display moved to @agentpress/shared/tools export * from './credit-formatter'; // Streaming & tool call utilities (portable from frontend) -export * from './streaming-utils'; +// streaming-utils moved to @agentpress/shared/streaming export * from './tool-call-utils'; export * from './tool-data-extractor'; diff --git a/apps/mobile/lib/utils/message-grouping.ts b/apps/mobile/lib/utils/message-grouping.ts deleted file mode 100644 index 11e32d63d0..0000000000 --- a/apps/mobile/lib/utils/message-grouping.ts +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Message Grouping Utility - * - * Groups messages for rendering: user messages standalone, assistant+tool messages grouped together - */ - -import type { UnifiedMessage } from '@/api/types'; - -export type MessageGroup = - | { type: 'user'; message: UnifiedMessage; key: string } - | { type: 'assistant_group'; messages: UnifiedMessage[]; key: string }; - -/** - * Groups messages for display: - * - User messages: standalone - * - Assistant + following tools: grouped together - * - Consecutive assistant+tool sequences: merged into one group - * - * Example: - * [user, assistant, tool, tool, user, assistant, tool] - * → [user], [assistant+tool+tool], [user], [assistant+tool] - */ -export function groupMessages(messages: UnifiedMessage[]): MessageGroup[] { - const groups: MessageGroup[] = []; - let currentAssistantGroup: UnifiedMessage[] | null = null; - let assistantGroupCounter = 0; - - messages.forEach((message, index) => { - const key = message.message_id || `msg-${index}`; - - if (message.type === 'user') { - // Finalize any existing assistant group - if (currentAssistantGroup && currentAssistantGroup.length > 0) { - assistantGroupCounter++; - groups.push({ - type: 'assistant_group', - messages: currentAssistantGroup, - key: `assistant-group-${assistantGroupCounter}`, - }); - currentAssistantGroup = null; - } - - // Add standalone user message - groups.push({ - type: 'user', - message, - key, - }); - } else if (message.type === 'assistant' || message.type === 'tool' || message.type === 'browser_state') { - // Check if we can add to existing assistant group (same agent) - const canAddToExistingGroup = currentAssistantGroup !== null && (() => { - // For assistant messages, check if agent matches - if (message.type === 'assistant') { - const lastAssistantMsg = currentAssistantGroup.findLast(m => m.type === 'assistant'); - if (!lastAssistantMsg) return true; // No assistant message yet, can add - - // Compare agent info - both null/undefined should be treated as same (default agent) - const currentAgentId = message.agent_id; - const lastAgentId = lastAssistantMsg.agent_id; - return currentAgentId === lastAgentId; - } - // For tool/browser_state messages, always add to current group - return true; - })(); - - if (canAddToExistingGroup) { - // Add to existing assistant group - currentAssistantGroup!.push(message); - } else { - // Finalize any existing group - if (currentAssistantGroup && currentAssistantGroup.length > 0) { - assistantGroupCounter++; - groups.push({ - type: 'assistant_group', - messages: currentAssistantGroup, - key: `assistant-group-${assistantGroupCounter}`, - }); - } - - // Create a new assistant group - currentAssistantGroup = [message]; - } - } - // Skip 'status', 'system', and other types for now - }); - - // Finalize any remaining assistant group - if (currentAssistantGroup !== null && (currentAssistantGroup as UnifiedMessage[]).length > 0) { - assistantGroupCounter++; - groups.push({ - type: 'assistant_group', - messages: currentAssistantGroup as UnifiedMessage[], - key: `assistant-group-${assistantGroupCounter}`, - }); - } - - return groups; -} - -/** - * Safe JSON parse with fallback - * Handles both string JSON and pre-parsed objects from API - */ -export function safeJsonParse( - jsonString: string | Record | undefined | null, - defaultValue: T -): T { - if (!jsonString) { - return defaultValue; - } - - // Handle pre-parsed objects (from API) - if (typeof jsonString === 'object') { - return jsonString as T; - } - - // Handle string JSON - if (typeof jsonString !== 'string') { - return defaultValue; - } - - try { - const parsed = JSON.parse(jsonString); - - // Handle double-escaped JSON (rare but happens) - if (typeof parsed === 'string' && - (parsed.startsWith('{') || parsed.startsWith('['))) { - try { - return JSON.parse(parsed) as T; - } catch { - return parsed as unknown as T; - } - } - - return parsed as T; - } catch { - return defaultValue; - } -} - - diff --git a/apps/mobile/lib/utils/tool-call-utils.ts b/apps/mobile/lib/utils/tool-call-utils.ts index 0ca93ff7e0..abee50b640 100644 --- a/apps/mobile/lib/utils/tool-call-utils.ts +++ b/apps/mobile/lib/utils/tool-call-utils.ts @@ -1,238 +1,22 @@ /** * Tool call utilities for parsing and handling tool call data - * These are portable and can be used in both web and mobile apps - */ - -import { StreamingToolCall } from './streaming-utils'; - -/** - * Tool result data structure from metadata - */ -export interface ToolResultData { - success: boolean; - output: any; - error?: string | null; -} - -/** - * Parsed tool call data for display - */ -export interface ParsedToolCallData { - toolCallId: string; - functionName: string; - displayName: string; - source: 'native' | 'xml'; - arguments: Record; - // Common argument extractions - filePath?: string; - command?: string; - query?: string; - url?: string; - text?: string; -} - -/** - * Safe JSON parse with fallback - */ -export function safeJsonParse(json: string | undefined | null, fallback: T): T { - if (!json) return fallback; - try { - return JSON.parse(json) as T; - } catch { - return fallback; - } -} - -/** - * Parse tool call arguments from string or object - * - * @param args - Arguments (string JSON or object) - * @returns Parsed arguments object - */ -export function parseToolCallArguments(args: string | Record | undefined | null): Record { - if (!args) return {}; - - if (typeof args === 'string') { - try { - const parsed = JSON.parse(args); - return typeof parsed === 'object' && parsed !== null ? parsed : {}; - } catch { - // Partial JSON during streaming - return empty - return {}; - } - } - - if (typeof args === 'object' && args !== null) { - return args; - } - - return {}; -} - -/** - * Get user-friendly tool name from function name - * Converts snake_case or kebab-case to Title Case - * - * @param functionName - The raw function name - * @returns User-friendly display name - */ -export function getUserFriendlyToolName(functionName: string): string { - if (!functionName) return 'Unknown Tool'; - - return functionName - .replace(/_/g, '-') - .split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(' '); -} - -/** - * Normalize tool name to consistent format (kebab-case lowercase) - * - * @param functionName - The raw function name - * @returns Normalized name - */ -export function normalizeToolName(functionName: string): string { - if (!functionName) return ''; - return functionName.replace(/_/g, '-').toLowerCase(); -} - -/** - * Extract common display parameters from tool arguments - * Used for showing context in tool call buttons - * - * @param args - Parsed arguments object - * @returns Primary display value (file path, command, query, etc.) - */ -export function getToolDisplayParam(args: Record): string { - // Priority order for display - return ( - args.file_path || - args.path || - args.target_file || - args.command || - args.query || - args.url || - args.session_name || - '' - ); -} - -/** - * Parse a streaming tool call into display-ready data - * - * @param toolCall - The streaming tool call from metadata - * @returns Parsed tool call data for display - */ -export function parseToolCallForDisplay(toolCall: StreamingToolCall): ParsedToolCallData { - const args = parseToolCallArguments(toolCall.arguments); - const normalizedName = normalizeToolName(toolCall.function_name); - - return { - toolCallId: toolCall.tool_call_id, - functionName: toolCall.function_name, - displayName: getUserFriendlyToolName(toolCall.function_name), - source: toolCall.source, - arguments: args, - filePath: args.file_path || args.path || args.target_file, - command: args.command, - query: args.query, - url: args.url, - text: args.text, - }; -} - -/** - * Extract all tool calls from metadata and parse them - * - * @param metadata - The message metadata (string or parsed object) - * @returns Array of parsed tool call data - */ -export function extractAndParseToolCalls( - metadata: string | Record | undefined | null -): ParsedToolCallData[] { - if (!metadata) return []; - - const parsed = typeof metadata === 'string' - ? safeJsonParse>(metadata, {}) - : metadata; - - const toolCalls = parsed.tool_calls as StreamingToolCall[] | undefined; - if (!toolCalls || !Array.isArray(toolCalls)) return []; - - return toolCalls.map(parseToolCallForDisplay); -} - -/** - * Check if a tool call is a file operation - * - * @param functionName - The function name - * @returns true if it's a file operation tool - */ -export function isFileOperationTool(functionName: string): boolean { - const name = normalizeToolName(functionName); - const fileTools = [ - 'read-file', - 'write-file', - 'create-file', - 'edit-file', - 'str-replace-editor', - 'delete-file', - 'list-dir', - 'list-files', - ]; - return fileTools.includes(name); -} - -/** - * Check if a tool call is a command execution - * - * @param functionName - The function name - * @returns true if it's a command execution tool - */ -export function isCommandTool(functionName: string): boolean { - const name = normalizeToolName(functionName); - const commandTools = [ - 'execute-command', - 'run-command', - 'shell', - 'terminal', - ]; - return commandTools.includes(name); -} - -/** - * Check if a tool call is a web/browser operation - * - * @param functionName - The function name - * @returns true if it's a web operation tool - */ -export function isWebTool(functionName: string): boolean { - const name = normalizeToolName(functionName); - const webTools = [ - 'web-search', - 'web-scrape', - 'browse-web', - 'browser', - 'screenshot', - ]; - return webTools.includes(name); -} - -/** - * Get the category of a tool call - * - * @param functionName - The function name - * @returns Tool category - */ -export function getToolCategory(functionName: string): 'file' | 'command' | 'web' | 'communication' | 'other' { - const name = normalizeToolName(functionName); - - if (name === 'ask' || name === 'complete') return 'communication'; - if (isFileOperationTool(functionName)) return 'file'; - if (isCommandTool(functionName)) return 'command'; - if (isWebTool(functionName)) return 'web'; - - return 'other'; -} - + * Re-exports from @agentpress/shared for backward compatibility + */ + +// Re-export all tool call utilities from shared package +export { + parseToolCallArguments, + normalizeToolName, + getToolDisplayParam, + parseToolCallForDisplay, + extractAndParseToolCalls, + isFileOperationTool, + isCommandTool, + isWebTool, + getToolCategory, + type ToolCategory, + type ParsedToolCallData, +} from '@agentpress/shared/tools'; + +// Re-export ToolResultData type (without timestamp for backward compatibility) +export type { ToolResultData } from '@agentpress/shared/tools'; diff --git a/apps/mobile/lib/utils/tool-data-extractor.ts b/apps/mobile/lib/utils/tool-data-extractor.ts index 7c64b21ec0..a8ba168742 100644 --- a/apps/mobile/lib/utils/tool-data-extractor.ts +++ b/apps/mobile/lib/utils/tool-data-extractor.ts @@ -6,7 +6,7 @@ */ import type { UnifiedMessage, ParsedMetadata } from '@/api/types'; -import { safeJsonParse } from './message-grouping'; +import { safeJsonParse } from '@agentpress/shared/utils'; /** * Structured tool call data from metadata diff --git a/apps/mobile/lib/utils/tool-display.ts b/apps/mobile/lib/utils/tool-display.ts deleted file mode 100644 index 67e8a1cac0..0000000000 --- a/apps/mobile/lib/utils/tool-display.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { - Globe, - FileEdit, - FileSearch, - FilePlus, - FileText, - FileX, - List, - ListTodo, - Terminal, - Computer, - Search, - ExternalLink, - Network, - Table2, - Code, - Phone, - PhoneOff, - MessageCircleQuestion, - CheckCircle2, - Wrench, - BookOpen, - Plug, - Clock, - type LucideIcon, - Presentation, - ImageIcon, - Pencil, - HammerIcon, -} from 'lucide-react-native'; - -export const getToolIcon = (toolName: string): LucideIcon => { - switch (toolName?.toLowerCase()) { - case 'initialize-tools': - case 'initialize_tools': - return HammerIcon; - - case 'browser-navigate-to': - case 'browser-act': - case 'browser-extract-content': - case 'browser-screenshot': - case 'browser_navigate_to': - case 'browser_act': - case 'browser_extract_content': - case 'browser_screenshot': - return Globe; - - case 'create-tasks': - return ListTodo; - - case 'web-search': - case 'web_search': - return Globe; - case 'image-search': - case 'image_search': - return ImageIcon; - - case 'create-file': - return FileEdit; - case 'str-replace': - return FileSearch; - case 'full-file-rewrite': - return FilePlus; - case 'read-file': - return FileText; - case 'edit-file': - return FileEdit; - - case 'designer-create-or-edit': - return Pencil; - case 'image-edit-or-generate': - return Pencil; - - case 'parse-document': - case 'parse_document': - return FileText; - case 'create-document': - case 'create_document': - return FileEdit; - case 'update-document': - case 'update_document': - return FileEdit; - case 'read-document': - case 'read_document': - return FileText; - - case 'create-tasks': - case 'create_tasks': - return List; - case 'update-tasks': - case 'update_tasks': - return ListTodo; - - case 'execute-command': - case 'execute_command': - case 'check-command-output': - case 'check_command_output': - case 'terminate-command': - case 'terminate_command': - return Terminal; - - case 'expose-port': - case 'expose_port': - return Computer; - - case 'web-search': - case 'web_search': - case 'image-search': - case 'image_search': - return Search; - case 'crawl-webpage': - case 'crawl_webpage': - case 'scrape-webpage': - case 'scrape_webpage': - return Globe; - - - case 'create-sheet': - case 'create_sheet': - case 'update-sheet': - case 'update_sheet': - case 'view-sheet': - case 'view_sheet': - case 'analyze-sheet': - case 'analyze_sheet': - case 'visualize-sheet': - case 'visualize_sheet': - case 'format-sheet': - case 'format_sheet': - return Table2; - - case 'delete-file': - case 'delete_file': - return FileX; - - case 'execute-code': - case 'execute_code': - return Code; - - case 'make-phone-call': - case 'make_phone_call': - case 'get-call-details': - case 'get_call_details': - case 'list-calls': - case 'list_calls': - case 'monitor-call': - case 'monitor_call': - return Phone; - case 'end-call': - case 'end_call': - return PhoneOff; - case 'wait-for-call-completion': - case 'wait_for_call_completion': - return Clock; - - case 'ask': - return MessageCircleQuestion; - - case 'complete': - return CheckCircle2; - - case 'create-presentation-outline': - case 'create_presentation_outline': - return Presentation; - - case 'get-paper-details': - return BookOpen; - case 'search-authors': - return Search; - case 'get-author-details': - return BookOpen; - case 'get-author-papers': - return BookOpen; - case 'get-paper-citations': - return BookOpen; - case 'get-paper-references': - return BookOpen; - case 'paper-search': - return Search; - - case 'create-slide': - case 'create_slide': - return Presentation; - case 'load-template-design': - case 'load_template_design': - return Presentation; - case 'validate-slide': - case 'validate_slide': - return Presentation; - - default: - if (toolName?.startsWith('mcp_')) { - const parts = toolName.split('_'); - if (parts.length >= 3) { - const serverName = parts[1]; - const toolNamePart = parts.slice(2).join('_'); - - if (toolNamePart.includes('search') || toolNamePart.includes('web')) { - return Search; - } else if (toolNamePart.includes('research') || toolNamePart.includes('paper')) { - return BookOpen; - } else if (serverName === 'exa') { - return Search; - } - } - return Plug; - } - - return Wrench; - } -}; - -const TOOL_DISPLAY_NAMES = new Map([ - ['execute-command', 'Executing Command'], - ['check-command-output', 'Checking Command Output'], - ['terminate-command', 'Terminating Command'], - ['list-commands', 'Listing Commands'], - - ['create-file', 'Creating File'], - ['delete-file', 'Deleting File'], - ['full-file-rewrite', 'Rewriting File'], - ['str-replace', 'Editing Text'], - ['str_replace', 'Editing Text'], - ['edit_file', 'Editing File'], - ['edit-file', 'Editing File'], - ['upload-file', 'Uploading File'], - - ['create-document', 'Creating Document'], - ['update-document', 'Updating Document'], - ['read-document', 'Reading Document'], - ['list-documents', 'Listing Documents'], - ['delete-document', 'Deleting Document'], - - ['create-tasks', 'Creating Tasks'], - ['update-tasks', 'Updating Tasks'], - ['update_tasks', 'Updating Tasks'], - ['create_tasks', 'Creating Tasks'], - - ['browser_navigate_to', 'Navigating to Page'], - ['browser_act', 'Performing Action'], - ['browser_extract_content', 'Extracting Content'], - ['browser_screenshot', 'Taking Screenshot'], - ['browser-navigate-to', 'Navigating to Page'], - ['browser-act', 'Performing Action'], - ['browser-extract-content', 'Extracting Content'], - ['browser-screenshot', 'Taking Screenshot'], - - ['execute-data-provider-call', 'Calling data provider'], - ['execute_data-provider_call', 'Calling data provider'], - ['get-data-provider-endpoints', 'Getting endpoints'], - - ['ask', 'Ask'], - ['wait', 'Wait'], - ['complete', 'Completing Task'], - ['crawl-webpage', 'Crawling Website'], - ['expose-port', 'Exposing Port'], - ['scrape-webpage', 'Scraping Website'], - ['web-search', 'Searching Web'], - ['load-image', 'Loading Image'], - ['create-presentation-outline', 'Creating Presentation Outline'], - ['create-presentation', 'Creating Presentation'], - ['clear-images-from-context', 'Clearing Images from context'], - ['image-search', 'Searching Image'], - - ['create-sheet', 'Creating Sheet'], - ['update-sheet', 'Updating Sheet'], - ['view-sheet', 'Viewing Sheet'], - ['analyze-sheet', 'Analyzing Sheet'], - ['visualize-sheet', 'Visualizing Sheet'], - ['format-sheet', 'Formatting Sheet'], - - ['update-agent', 'Updating Worker'], - ['get-current-agent-config', 'Getting Worker Config'], - ['search-mcp-servers', 'Searching MCP Servers'], - ['get-mcp-server-tools', 'Getting MCP Server Tools'], - ['configure-mcp-server', 'Configuring MCP Server'], - ['get-popular-mcp-servers', 'Getting Popular MCP Servers'], - ['test-mcp-server-connection', 'Testing MCP Server Connection'], - ['list_app_event_triggers', 'Finding event triggers'], - ['list-app-event-triggers', 'Finding event triggers'], - ['create-event-trigger', 'Creating event trigger'], - ['create_event_trigger', 'Creating event trigger'], - - ['get-project-structure', 'Getting Project Structure'], - ['build-project', 'Building Project'], - - ['execute_command', 'Executing Command'], - ['check_command_output', 'Checking Command Output'], - ['terminate_command', 'Terminating Command'], - ['list_commands', 'Listing Commands'], - - ['create_file', 'Creating File'], - ['delete_file', 'Deleting File'], - ['full_file_rewrite', 'Rewriting File'], - ['str_replace', 'Editing Text'], - ['edit_file', 'Editing File'], - - - ['get-paper-details', 'Getting Paper Details'], - ['search-authors', 'Searching Authors'], - ['get-author-details', 'Getting Author Details'], - ['get-author-papers', 'Getting Author Papers'], - ['get-paper-citations', 'Getting Paper Citations'], - ['get-paper-references', 'Getting Paper References'], - ['paper-search', 'Searching for Papers'], - - ['crawl_webpage', 'Crawling Website'], - ['expose_port', 'Exposing Port'], - ['scrape_webpage', 'Scraping Website'], - ['web_search', 'Searching Web'], - ['load_image', 'Loading Image'], - - ['update_agent', 'Updating Worker'], - ['get_current_agent_config', 'Getting Worker Config'], - ['search_mcp_servers', 'Searching MCP Servers'], - ['get_popular_mcp_servers', 'Getting Popular MCP Servers'], - ['test_mcp_server_connection', 'Testing MCP Server Connection'], - ['discover-user-mcp-servers', 'Discovering tools'], - ['create-credential-profile', 'Creating profile'], - ['get-credential-profiles', 'Getting profiles'], - ['configure-profile-for-agent', 'Adding tools to worker'], - - ['create-new-agent', 'Creating New Worker'], - ['search-mcp-servers-for-agent', 'Searching MCP Servers'], - ['create-credential-profile-for-agent', 'Creating Credential Profile'], - ['discover-mcp-tools-for-agent', 'Discovering MCP Tools'], - ['configure-agent-integration', 'Configuring Worker Integration'], - ['create-agent-scheduled-trigger', 'Creating Scheduled Trigger'], - ['list-agent-scheduled-triggers', 'Listing Worker Scheduled Triggers'], - - ['make-phone-call', 'Making Phone Call'], - ['make_phone_call', 'Making Phone Call'], - ['end-call', 'Ending Call'], - ['end_call', 'Ending Call'], - ['get-call-details', 'Getting Call Details'], - ['get_call_details', 'Getting Call Details'], - ['list-calls', 'Listing Calls'], - ['list_calls', 'Listing Calls'], - ['monitor-call', 'Monitoring Call'], - ['monitor_call', 'Monitoring Call'], - ['wait-for-call-completion', 'Waiting for Completion'], - ['wait_for_call_completion', 'Waiting for Completion'], - - ['create-slide', 'Creating Slide'], - ['create_slide', 'Creating Slide'], - - ['designer-create-or-edit', 'Designing'], - - ['create-slide', 'Creating Slide'], - ['create_slide', 'Creating Slide'], - ['load-template-design', 'Loading Template Design'], - ['load_template_design', 'Loading Template Design'], - ['validate-slide', 'Validating Slide'], - ['validate_slide', 'Validating Slide'], -]); - -function formatMCPToolName(serverName: string, toolName: string): string { - const serverMappings: Record = { - 'exa': 'Exa Search', - 'github': 'GitHub', - 'notion': 'Notion', - 'slack': 'Slack', - 'filesystem': 'File System', - 'memory': 'Memory', - 'anthropic': 'Anthropic', - 'openai': 'OpenAI', - 'composio': 'Composio', - 'langchain': 'LangChain', - 'llamaindex': 'LlamaIndex' - }; - - const formattedServerName = serverMappings[serverName.toLowerCase()] || - serverName.charAt(0).toUpperCase() + serverName.slice(1); - - let formattedToolName = toolName; - - if (toolName.includes('-')) { - formattedToolName = toolName - .split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - } - else if (toolName.includes('_')) { - formattedToolName = toolName - .split('_') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - } - else if (/[a-z][A-Z]/.test(toolName)) { - formattedToolName = toolName - .replace(/([a-z])([A-Z])/g, '$1 $2') - .split(' ') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - } - else { - formattedToolName = toolName.charAt(0).toUpperCase() + toolName.slice(1); - } - - return `${formattedServerName}: ${formattedToolName}`; -} - -export function getUserFriendlyToolName(toolName: string): string { - if (!toolName) return 'Unknown Tool'; - - // Handle MCP tools: mcp_serverName_toolName - if (toolName.startsWith('mcp_')) { - const parts = toolName.split('_'); - if (parts.length >= 3) { - const serverName = parts[1]; - const toolNamePart = parts.slice(2).join('_'); - return formatMCPToolName(serverName, toolNamePart); - } - } - - // Handle MCP tools in kebab-case: serverName-toolName (if not in display names map) - if (toolName.includes('-') && !TOOL_DISPLAY_NAMES.has(toolName)) { - const parts = toolName.split('-'); - if (parts.length >= 2) { - const serverName = parts[0]; - const toolNamePart = parts.slice(1).join('-'); - // Only format as MCP if it looks like an MCP tool (serverName is a known server or lowercase) - const knownServers = ['exa', 'github', 'notion', 'slack', 'filesystem', 'memory', 'anthropic', 'openai', 'composio', 'langchain', 'llamaindex']; - if (knownServers.includes(serverName.toLowerCase()) || serverName === serverName.toLowerCase()) { - return formatMCPToolName(serverName, toolNamePart); - } - } - } - - // Return mapped display name or the tool name itself - return TOOL_DISPLAY_NAMES.get(toolName) || toolName; -} - diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 7efac36faf..d7a235b54d 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -17,6 +17,7 @@ "clean": "rm -rf .expo node_modules" }, "dependencies": { + "@agentpress/shared": "workspace:*", "@bacons/apple-targets": "^3.0.5", "@expensify/react-native-live-markdown": "^0.1.317", "@gorhom/bottom-sheet": "^5.2.6", diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 5d409815ec..d64b85e1f2 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -7,5 +7,13 @@ "@/*": ["*"] } }, - "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts", "svg.d.ts"] + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.ts", + "expo-env.d.ts", + "nativewind-env.d.ts", + "svg.d.ts", + "../../packages/shared/src/**/*.ts" + ] } diff --git a/backend/README.md b/backend/README.md index ab57da069a..f8912b027d 100644 --- a/backend/README.md +++ b/backend/README.md @@ -43,8 +43,8 @@ uv run api.py ```bash cd frontend -npm install -npm run dev +pnpm install +pnpm run dev ``` Access the app at `http://localhost:3000` diff --git a/backend/core/agentpress/thread_manager.py b/backend/core/agentpress/thread_manager.py index 24af673d95..527bd01082 100644 --- a/backend/core/agentpress/thread_manager.py +++ b/backend/core/agentpress/thread_manager.py @@ -121,6 +121,14 @@ async def add_message( if result.data and len(result.data) > 0 and 'message_id' in result.data[0]: saved_message = result.data[0] + # Invalidate message history cache when new message is added + if is_llm_message: + try: + from core.cache.runtime_cache import invalidate_message_history_cache + await invalidate_message_history_cache(thread_id) + except Exception as e: + logger.debug(f"Failed to invalidate message history cache: {e}") + if type == "llm_response_end" and isinstance(content, dict): await self._handle_billing(thread_id, content, saved_message) @@ -241,6 +249,15 @@ async def get_llm_messages(self, thread_id: str, lightweight: bool = False) -> L lightweight: If True, fetch only recent messages with minimal payload (for bootstrap) """ logger.debug(f"Getting messages for thread {thread_id} (lightweight={lightweight})") + + # Check cache first (only for non-lightweight mode) + if not lightweight: + from core.cache.runtime_cache import get_cached_message_history + cached = await get_cached_message_history(thread_id) + if cached is not None: + logger.debug(f"⏱️ [TIMING] Message history: cache hit ({len(cached)} messages)") + return cached + client = await self.db.client try: @@ -326,6 +343,11 @@ async def get_llm_messages(self, thread_id: str, lightweight: bool = False) -> L 'message_id': item['message_id'] }) + # Cache the result (only for non-lightweight mode) + if not lightweight: + from core.cache.runtime_cache import set_cached_message_history + await set_cached_message_history(thread_id, messages) + return messages except Exception as e: diff --git a/backend/core/agents/runs.py b/backend/core/agents/runs.py index 1125c541b1..d9f6d6109e 100644 --- a/backend/core/agents/runs.py +++ b/backend/core/agents/runs.py @@ -1401,8 +1401,10 @@ async def stream_generator(agent_run_data): terminate_stream = False initial_yield_complete = False last_id = "0" # Start from beginning for initial read + pubsub = None try: + # === INITIAL CATCH-UP (unchanged) === initial_entries = await redis.stream_range(stream_key) if initial_entries: logger.debug(f"Sending {len(initial_entries)} catch-up responses for {agent_run_id}") @@ -1460,7 +1462,11 @@ async def stream_generator(agent_run_data): thread_id=agent_run_data.get('thread_id'), ) - # Use blocking XREAD to wait for new stream entries + # === NEW: PUB/SUB BASED REAL-TIME STREAMING === + notify_channel = f"{stream_key}:notify" + pubsub = await redis.get_pubsub() + await pubsub.subscribe(notify_channel) + # After catch-up, only read new entries if last_id != "0": last_id = "$" # "$" means only new entries @@ -1472,57 +1478,68 @@ async def stream_generator(agent_run_data): while not terminate_stream: try: - # Blocking XREAD - waits up to 5 seconds for new entries - entries = await redis.stream_read(stream_key, last_id, block_ms=5000) + # Wait for pub/sub notification or timeout + message = await asyncio.wait_for( + pubsub.get_message(ignore_subscribe_messages=True), + timeout=5.0 + ) - if entries: + if message: + # Notification received - read new entries immediately received_real_data = True - consecutive_pings = 0 # Reset ping counter on real data - for entry_id, fields in entries: - data = fields.get('data', '{}') - yield f"data: {data}\n\n" - last_id = entry_id - - # Check for completion status - try: - response = json.loads(data) - if response.get('type') == 'status' and response.get('status') in ['completed', 'failed', 'stopped', 'error']: - logger.debug(f"Detected completion via stream: {response.get('status')}") - terminate_stream = True - break - except json.JSONDecodeError: - pass - else: - consecutive_pings += 1 + consecutive_pings = 0 - # Startup timeout check: if we haven't received any real data and hit the limit - if not received_real_data and consecutive_pings >= MAX_STARTUP_PINGS: - logger.warning(f"Startup timeout for agent run {agent_run_id}: no data received after {consecutive_pings * 5}s") - # Check DB status to see if run is still supposed to be running - try: - run_check = await client.table('agent_runs').select('status').eq('id', agent_run_id).maybe_single().execute() - db_status = run_check.data.get('status') if run_check.data else None - if db_status == 'running': - # Worker never started - mark as failed - logger.error(f"Agent run {agent_run_id} stuck: status is 'running' but worker never produced output") - await client.table('agent_runs').update({ - 'status': 'failed', - 'error': 'Worker failed to start within timeout period', - 'completed_at': datetime.now(timezone.utc).isoformat() - }).eq('id', agent_run_id).execute() - yield f"data: {json.dumps({'type': 'status', 'status': 'error', 'message': 'Agent worker failed to start. Please try again.'})}\n\n" - terminate_stream = True - break - elif db_status in ['completed', 'failed', 'stopped']: - logger.debug(f"Agent run {agent_run_id} already finished with status: {db_status}") - yield f"data: {json.dumps({'type': 'status', 'status': db_status})}\n\n" - terminate_stream = True - break - except Exception as db_err: - logger.warning(f"Failed to check agent_run status during timeout: {db_err}") + entries = await redis.stream_read(stream_key, last_id, block_ms=0) + if entries: + for entry_id, fields in entries: + data = fields.get('data', '{}') + yield f"data: {data}\n\n" + last_id = entry_id + + # Check for completion status + try: + response = json.loads(data) + if response.get('type') == 'status' and response.get('status') in ['completed', 'failed', 'stopped', 'error']: + logger.debug(f"Detected completion via stream: {response.get('status')}") + terminate_stream = True + break + except json.JSONDecodeError: + pass + else: + # No message (None returned) - continue waiting + pass - # Timeout - send ping to keep connection alive - yield f"data: {json.dumps({'type': 'ping'})}\n\n" + except asyncio.TimeoutError: + consecutive_pings += 1 + + # Startup timeout check: if we haven't received any real data and hit the limit + if not received_real_data and consecutive_pings >= MAX_STARTUP_PINGS: + logger.warning(f"Startup timeout for agent run {agent_run_id}: no data received after {consecutive_pings * 5}s") + # Check DB status to see if run is still supposed to be running + try: + run_check = await client.table('agent_runs').select('status').eq('id', agent_run_id).maybe_single().execute() + db_status = run_check.data.get('status') if run_check.data else None + if db_status == 'running': + # Worker never started - mark as failed + logger.error(f"Agent run {agent_run_id} stuck: status is 'running' but worker never produced output") + await client.table('agent_runs').update({ + 'status': 'failed', + 'error': 'Worker failed to start within timeout period', + 'completed_at': datetime.now(timezone.utc).isoformat() + }).eq('id', agent_run_id).execute() + yield f"data: {json.dumps({'type': 'status', 'status': 'error', 'message': 'Agent worker failed to start. Please try again.'})}\n\n" + terminate_stream = True + break + elif db_status in ['completed', 'failed', 'stopped']: + logger.debug(f"Agent run {agent_run_id} already finished with status: {db_status}") + yield f"data: {json.dumps({'type': 'status', 'status': db_status})}\n\n" + terminate_stream = True + break + except Exception as db_err: + logger.warning(f"Failed to check agent_run status during timeout: {db_err}") + + # Send ping to keep connection alive + yield f"data: {json.dumps({'type': 'ping'})}\n\n" except asyncio.CancelledError: logger.debug(f"Stream generator cancelled for {agent_run_id}") @@ -1541,8 +1558,13 @@ async def stream_generator(agent_run_data): finally: terminate_stream = True - # No cleanup needed - streams don't hold connections - + # Clean up pub/sub subscription + if pubsub: + try: + await pubsub.unsubscribe(notify_channel) + await pubsub.close() + except Exception: + pass logger.debug(f"Streaming cleanup complete for agent run: {agent_run_id}") return StreamingResponse(stream_generator(agent_run_data), media_type="text/event-stream", headers={ diff --git a/backend/core/ai_models/models.py b/backend/core/ai_models/models.py index 9f2d53de58..3111dc1925 100644 --- a/backend/core/ai_models/models.py +++ b/backend/core/ai_models/models.py @@ -11,6 +11,7 @@ class ModelProvider(Enum): GOOGLE = "google" XAI = "xai" MOONSHOTAI = "moonshotai" + MINIMAX = "minimax" class ModelCapability(Enum): diff --git a/backend/core/ai_models/registry.py b/backend/core/ai_models/registry.py index b06fc9500f..b91953ebc2 100644 --- a/backend/core/ai_models/registry.py +++ b/backend/core/ai_models/registry.py @@ -140,25 +140,26 @@ def _initialize_models(self): ) )) - # Kortix Test - uses MiniMax M2 via Bedrock (only in LOCAL and STAGING, not PRODUCTION) + # Kortix Test - uses MiniMax M2.1 via direct API (only in LOCAL and STAGING, not PRODUCTION) if config.ENV_MODE != EnvMode.PRODUCTION: + # MiniMax direct API - requires MINIMAX_API_KEY env var + # Docs: https://docs.litellm.ai/docs/providers/minimax + # test_litellm_id = "minimax/MiniMax-M2.1" # 204,800 context $0.30/M input $1.20/M output + test_litellm_id = "openai/gpt-5-mini-2025-08-07" + # test_litellm_id = "minimax/MiniMax-M2.1-lightning" # Faster ~100 tps, $2.40/M output + # test_litellm_id = "minimax/MiniMax-M2" # Agentic capabilities # test_litellm_id = build_bedrock_profile_arn(MINIMAX_M2_PROFILE_ID) - # test_litellm_id ="openrouter/minimax/minimax-m2" # 205K context $0.255/M input tokens $1.02/M output tokens - test_litellm_id ="openrouter/z-ai/glm-4.6v" # 204,800 context $0.30/M input tokens $1.20/M output tokens - # test_litellm_id = "openrouter/z-ai/glm-4.7" # 203K context $0.44/M input tokens $1.74/M output tokens - # test_litellm_id = "openrouter/z-ai/glm-4.6v" # 131K context $0.30/M input tokens $0.90/M output tokens - # test_litellm_id = "openrouter/google/gemini-3-flash-preview" # 1.05M context $0.50/M input tokens $3/M output tokens $1/M audio tokens - # test_litellm_id = "openrouter/x-ai/grok-4.1-fast" #2M context $0.20/M input tokens $0.50/M output tokens - # test_litellm_id = "openrouter/deepseek/deepseek-v3.2-speciale" 164K context $0.27/M input tokens $0.41/M output tokens - # test_litellm_id = "openrouter/deepseek/deepseek-v3.2" 164K context $0.26/M input tokens $0.38/M output tokens - + # test_litellm_id ="openrouter/minimax/minimax-m2" # 205K context $0.255/M input $1.02/M output + # test_litellm_id ="openrouter/z-ai/glm-4.6v" # 204,800 context $0.30/M input $1.20/M output + # test_litellm_id = "openrouter/google/gemini-3-flash-preview" + # test_litellm_id = "openrouter/x-ai/grok-4.1-fast" # test_litellm_id ="groq/moonshotai/kimi-k2-instruct" self.register(Model( id="kortix/test", name="Kortix Test", litellm_model_id=test_litellm_id, - provider=ModelProvider.OPENROUTER, + provider=ModelProvider.MINIMAX, aliases=["kortix-test", "Kortix Test"], context_window=200_000, capabilities=[ @@ -279,7 +280,7 @@ def _normalize_model_id(self, model_id: str) -> str: return model_id # Common provider prefixes that LiteLLM might strip - provider_prefixes = ['openrouter/', 'anthropic/', 'bedrock/', 'openai/'] + provider_prefixes = ['openrouter/', 'anthropic/', 'bedrock/', 'openai/', 'minimax/'] # If ID already has a known prefix, return as-is for prefix in provider_prefixes: diff --git a/backend/core/billing/subscriptions/handlers/tier.py b/backend/core/billing/subscriptions/handlers/tier.py index 5d5b055e2c..bbba5381e8 100644 --- a/backend/core/billing/subscriptions/handlers/tier.py +++ b/backend/core/billing/subscriptions/handlers/tier.py @@ -7,9 +7,22 @@ class TierHandler: @staticmethod async def get_user_subscription_tier(account_id: str, skip_cache: bool = False) -> Dict: - cache_key = f"subscription_tier:{account_id}" + import time + t_start = time.time() if not skip_cache: + # Try Redis cache first (5 min TTL - faster) + try: + from core.cache.runtime_cache import get_cached_tier_info + redis_cached = await get_cached_tier_info(account_id) + if redis_cached: + logger.debug(f"⚡ [TIER] Redis cache hit for {account_id} ({(time.time() - t_start) * 1000:.1f}ms)") + return redis_cached + except Exception: + pass # Fall through to legacy cache + + # Fallback to legacy Cache + cache_key = f"subscription_tier:{account_id}" cached = await Cache.get(cache_key) if cached: return cached @@ -50,6 +63,14 @@ async def get_user_subscription_tier(account_id: str, skip_cache: bool = False) 'is_trial': trial_status == 'active' } + # Cache in both Redis (5 min) and legacy cache (60s) + try: + from core.cache.runtime_cache import set_cached_tier_info + await set_cached_tier_info(account_id, tier_info) + except Exception: + pass + + cache_key = f"subscription_tier:{account_id}" await Cache.set(cache_key, tier_info, ttl=60) return tier_info diff --git a/backend/core/billing/subscriptions/repositories/credit_account.py b/backend/core/billing/subscriptions/repositories/credit_account.py index 14f01d0ada..049a64097a 100644 --- a/backend/core/billing/subscriptions/repositories/credit_account.py +++ b/backend/core/billing/subscriptions/repositories/credit_account.py @@ -23,6 +23,16 @@ async def update_credit_account(self, account_id: str, update_data: Dict) -> Non .update(update_data)\ .eq('account_id', account_id)\ .execute() + + # Invalidate tier cache if tier is being updated + if 'tier' in update_data or 'trial_status' in update_data: + try: + from core.cache.runtime_cache import invalidate_tier_info_cache + from core.utils.cache import Cache + await invalidate_tier_info_cache(account_id) + await Cache.invalidate(f"subscription_tier:{account_id}") + except Exception: + pass # Non-critical - cache will expire naturally async def get_subscription_details(self, account_id: str) -> Optional[Dict]: fields = 'stripe_subscription_id, tier, commitment_type, commitment_end_date' diff --git a/backend/core/cache/runtime_cache.py b/backend/core/cache/runtime_cache.py index b720578370..d7772c6d80 100644 --- a/backend/core/cache/runtime_cache.py +++ b/backend/core/cache/runtime_cache.py @@ -423,3 +423,221 @@ async def invalidate_thread_count_cache(account_id: str) -> None: except Exception as e: logger.warning(f"Failed to invalidate thread count cache: {e}") + +# ============================================================================ +# KNOWLEDGE BASE CONTEXT CACHE - Short TTL, invalidated on KB mutations +# ============================================================================ +KB_CONTEXT_TTL = 300 # 5 minutes + +def _get_kb_context_key(agent_id: str) -> str: + """Generate Redis cache key for knowledge base context.""" + return f"kb_context:{agent_id}" + + +async def get_cached_kb_context(agent_id: str) -> Optional[str]: + """ + Get knowledge base context from Redis cache. + Returns None on cache miss, empty string if cached as "no entries". + """ + cache_key = _get_kb_context_key(agent_id) + + try: + from core.services import redis as redis_service + + cached = await redis_service.get(cache_key) + if cached is not None: + # Empty string means "no entries", None means cache miss + data = cached.decode() if isinstance(cached, bytes) else cached + logger.debug(f"⚡ Redis cache hit for KB context: {agent_id}") + return data if data else None # Return None for empty string (no entries) + except Exception as e: + logger.warning(f"Failed to get KB context from cache: {e}") + + return None # Cache miss + + +async def set_cached_kb_context(agent_id: str, context: str) -> None: + """ + Cache knowledge base context in Redis. + Use empty string to cache "no entries" result. + """ + cache_key = _get_kb_context_key(agent_id) + + try: + from core.services import redis as redis_service + # Store empty string as empty string (to distinguish from cache miss) + await redis_service.set(cache_key, context, ex=KB_CONTEXT_TTL) + logger.debug(f"✅ Cached KB context in Redis: {agent_id} ({len(context)} chars)") + except Exception as e: + logger.warning(f"Failed to cache KB context: {e}") + + +async def invalidate_kb_context_cache(agent_id: str) -> None: + """Invalidate cached knowledge base context when KB entries change.""" + try: + from core.services import redis as redis_service + await redis_service.delete(_get_kb_context_key(agent_id)) + logger.debug(f"🗑️ Invalidated KB context cache: {agent_id}") + except Exception as e: + logger.warning(f"Failed to invalidate KB context cache: {e}") + + +# ============================================================================ +# USER CONTEXT CACHE - Locale + username, invalidated on profile updates +# ============================================================================ +USER_CONTEXT_TTL = 900 # 15 minutes + +def _get_user_context_key(user_id: str) -> str: + """Generate Redis cache key for user context.""" + return f"user_context:{user_id}" + + +async def get_cached_user_context(user_id: str) -> Optional[str]: + """ + Get user context (locale + username) from Redis cache. + Returns None on cache miss, empty string if cached as "no context". + """ + cache_key = _get_user_context_key(user_id) + + try: + from core.services import redis as redis_service + + cached = await redis_service.get(cache_key) + if cached is not None: + data = cached.decode() if isinstance(cached, bytes) else cached + logger.debug(f"⚡ Redis cache hit for user context: {user_id}") + return data if data else None # Return None for empty string (no context) + except Exception as e: + logger.warning(f"Failed to get user context from cache: {e}") + + return None # Cache miss + + +async def set_cached_user_context(user_id: str, context: str) -> None: + """ + Cache user context in Redis. + Use empty string to cache "no context" result. + """ + cache_key = _get_user_context_key(user_id) + + try: + from core.services import redis as redis_service + await redis_service.set(cache_key, context, ex=USER_CONTEXT_TTL) + logger.debug(f"✅ Cached user context in Redis: {user_id} ({len(context)} chars)") + except Exception as e: + logger.warning(f"Failed to cache user context: {e}") + + +async def invalidate_user_context_cache(user_id: str) -> None: + """Invalidate cached user context when profile is updated.""" + try: + from core.services import redis as redis_service + await redis_service.delete(_get_user_context_key(user_id)) + logger.debug(f"🗑️ Invalidated user context cache: {user_id}") + except Exception as e: + logger.warning(f"Failed to invalidate user context cache: {e}") + + +# ============================================================================ +# MESSAGE HISTORY CACHE - Short TTL for repeated turns in same thread +# ============================================================================ +MESSAGE_HISTORY_TTL = 60 # 1 minute - very short since messages change frequently + +def _get_message_history_key(thread_id: str) -> str: + """Generate Redis cache key for message history.""" + return f"message_history:{thread_id}" + + +async def get_cached_message_history(thread_id: str) -> Optional[list]: + """Get message history from Redis cache.""" + cache_key = _get_message_history_key(thread_id) + + try: + from core.services import redis as redis_service + + cached = await redis_service.get(cache_key) + if cached: + data = json.loads(cached) if isinstance(cached, (str, bytes)) else cached + logger.debug(f"⚡ Redis cache hit for message history: {thread_id} ({len(data)} messages)") + return data + except Exception as e: + logger.warning(f"Failed to get message history from cache: {e}") + + return None + + +async def set_cached_message_history(thread_id: str, messages: list) -> None: + """Cache message history in Redis.""" + cache_key = _get_message_history_key(thread_id) + + try: + from core.services import redis as redis_service + await redis_service.set(cache_key, json.dumps(messages), ex=MESSAGE_HISTORY_TTL) + logger.debug(f"✅ Cached message history in Redis: {thread_id} ({len(messages)} messages)") + except Exception as e: + logger.warning(f"Failed to cache message history: {e}") + + +async def invalidate_message_history_cache(thread_id: str) -> None: + """Invalidate cached message history when new message is added.""" + try: + from core.services import redis as redis_service + await redis_service.delete(_get_message_history_key(thread_id)) + logger.debug(f"🗑️ Invalidated message history cache: {thread_id}") + except Exception as e: + logger.warning(f"Failed to invalidate message history cache: {e}") + + +# ============================================================================ +# SUBSCRIPTION TIER CACHE - Long TTL since tiers only change on upgrade/downgrade +# We invalidate explicitly when subscription changes, so safe to cache longer +# ============================================================================ +TIER_INFO_TTL = 3600 # 1 hour - invalidated on subscription change + +def _get_tier_info_key(account_id: str) -> str: + """Generate Redis cache key for subscription tier info.""" + return f"tier_info:{account_id}" + + +async def get_cached_tier_info(account_id: str) -> Optional[Dict[str, Any]]: + """ + Get subscription tier info from Redis cache. + Extended TTL since tiers rarely change mid-session. + """ + cache_key = _get_tier_info_key(account_id) + + try: + from core.services import redis as redis_service + + cached = await redis_service.get(cache_key) + if cached: + data = json.loads(cached) if isinstance(cached, (str, bytes)) else cached + logger.debug(f"⚡ Redis cache hit for tier info: {account_id}") + return data + except Exception as e: + logger.warning(f"Failed to get tier info from cache: {e}") + + return None + + +async def set_cached_tier_info(account_id: str, tier_info: Dict[str, Any]) -> None: + """Cache subscription tier info in Redis.""" + cache_key = _get_tier_info_key(account_id) + + try: + from core.services import redis as redis_service + await redis_service.set(cache_key, json.dumps(tier_info), ex=TIER_INFO_TTL) + logger.debug(f"✅ Cached tier info in Redis: {account_id} (tier: {tier_info.get('name', 'unknown')})") + except Exception as e: + logger.warning(f"Failed to cache tier info: {e}") + + +async def invalidate_tier_info_cache(account_id: str) -> None: + """Invalidate cached tier info when subscription changes.""" + try: + from core.services import redis as redis_service + await redis_service.delete(_get_tier_info_key(account_id)) + logger.debug(f"🗑️ Invalidated tier info cache: {account_id}") + except Exception as e: + logger.warning(f"Failed to invalidate tier info cache: {e}") + diff --git a/backend/core/knowledge_base/api.py b/backend/core/knowledge_base/api.py index 3e4a61323f..c08e69100f 100644 --- a/backend/core/knowledge_base/api.py +++ b/backend/core/knowledge_base/api.py @@ -5,6 +5,7 @@ from core.services.supabase import DBConnection from .file_processor import FileProcessor from core.utils.logger import logger +from core.utils.config import config from .validation import FileNameValidator, ValidationError, validate_folder_name_unique, validate_file_name_unique_in_folder # Constants @@ -97,6 +98,9 @@ class AgentAssignmentRequest(BaseModel): @router.get("/folders", response_model=List[FolderResponse]) async def get_folders(user_id: str = Depends(verify_and_get_user_id_from_jwt)): """Get all knowledge base folders for user.""" + if not config.ENABLE_KNOWLEDGE_BASE: + return [] + try: client = await db.client account_id = user_id @@ -132,6 +136,9 @@ async def create_folder( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Create a new knowledge base folder.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id @@ -179,6 +186,9 @@ async def update_folder( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Update a knowledge base folder.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id @@ -254,6 +264,9 @@ async def delete_folder( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Delete a knowledge base folder and all its entries.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id @@ -300,6 +313,9 @@ async def upload_file( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Upload a file to a knowledge base folder.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + import time start_time = time.time() logger.info(f"[UPLOAD] Starting upload for file: {file.filename}") @@ -382,6 +398,9 @@ async def get_folder_entries( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Get all entries in a folder.""" + if not config.ENABLE_KNOWLEDGE_BASE: + return [] + try: client = await db.client account_id = user_id @@ -421,6 +440,9 @@ async def delete_entry( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Delete a knowledge base entry.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id @@ -444,6 +466,19 @@ async def delete_entry( # Delete from database await client.table('knowledge_base_entries').delete().eq('entry_id', entry_id).execute() + # Invalidate KB context cache for all agents that had this entry assigned + try: + from core.cache.runtime_cache import invalidate_kb_context_cache + assignments_result = await client.table('agent_knowledge_entry_assignments') \ + .select('agent_id').eq('entry_id', entry_id).execute() + + agent_ids = set(row['agent_id'] for row in assignments_result.data) if assignments_result.data else set() + for agent_id in agent_ids: + await invalidate_kb_context_cache(agent_id) + logger.debug(f"🗑️ Invalidated KB cache for {len(agent_ids)} agents after entry deletion") + except Exception as e: + logger.warning(f"Failed to invalidate KB cache after entry deletion: {e}") + return {"success": True} except HTTPException: @@ -459,6 +494,9 @@ async def update_entry( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Update a knowledge base entry summary.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id @@ -479,6 +517,19 @@ async def update_entry( if not update_result.data: raise HTTPException(status_code=500, detail="Failed to update entry") + # Invalidate KB context cache for all agents that have this entry assigned + try: + from core.cache.runtime_cache import invalidate_kb_context_cache + assignments_result = await client.table('agent_knowledge_entry_assignments') \ + .select('agent_id').eq('entry_id', entry_id).execute() + + agent_ids = set(row['agent_id'] for row in assignments_result.data) if assignments_result.data else set() + for agent_id in agent_ids: + await invalidate_kb_context_cache(agent_id) + logger.debug(f"🗑️ Invalidated KB cache for {len(agent_ids)} agents after entry update") + except Exception as e: + logger.warning(f"Failed to invalidate KB cache after entry update: {e}") + # Return the updated entry updated_entry = update_result.data[0] return EntryResponse( @@ -502,6 +553,9 @@ async def get_agent_assignments( auth: AuthorizedAgentAccess = Depends(require_agent_access) ): """Get entry assignments for an agent.""" + if not config.ENABLE_KNOWLEDGE_BASE: + return {} + try: client = await DBConnection().client @@ -523,6 +577,9 @@ async def update_agent_assignments( auth: AuthorizedAgentAccess = Depends(require_agent_access) ): """Update agent entry assignments.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = auth.user_id @@ -540,10 +597,11 @@ async def update_agent_assignments( 'enabled': True }).execute() - # Invalidate agent config cache (knowledge base assignments changed) + # Invalidate agent config cache and KB context cache (knowledge base assignments changed) try: - from core.cache.runtime_cache import invalidate_agent_config_cache + from core.cache.runtime_cache import invalidate_agent_config_cache, invalidate_kb_context_cache await invalidate_agent_config_cache(agent_id) + await invalidate_kb_context_cache(agent_id) logger.debug(f"🗑️ Invalidated cache for agent {agent_id} after knowledge base update") except Exception as e: logger.warning(f"Failed to invalidate cache for agent {agent_id}: {e}") @@ -565,6 +623,9 @@ async def move_file( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): """Move a file to a different folder.""" + if not config.ENABLE_KNOWLEDGE_BASE: + raise HTTPException(status_code=503, detail="Knowledge base feature is currently disabled") + try: client = await db.client account_id = user_id diff --git a/backend/core/memory/api.py b/backend/core/memory/api.py index 541f9d04be..5352060e08 100644 --- a/backend/core/memory/api.py +++ b/backend/core/memory/api.py @@ -6,6 +6,7 @@ from core.services.supabase import DBConnection from core.billing import subscription_service from core.billing.shared.config import is_memory_enabled, get_memory_config +from core.utils.config import config from .retrieval_service import memory_retrieval_service from .models import MemoryType @@ -59,6 +60,15 @@ async def list_memories( limit: int = Query(50, ge=1, le=200), memory_type: Optional[str] = Query(None) ): + if not config.ENABLE_MEMORY: + return MemoryListResponse( + memories=[], + total=0, + page=page, + limit=limit, + pages=0 + ) + try: tier_info = await subscription_service.get_user_subscription_tier(user_id) tier_name = tier_info['name'] @@ -122,6 +132,24 @@ async def list_memories( async def get_memory_stats( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + try: + tier_info = await subscription_service.get_user_subscription_tier(user_id) + tier_name = tier_info['name'] + except: + tier_name = 'free' + + return MemoryStatsResponse( + total_memories=0, + memories_by_type={}, + oldest_memory=None, + newest_memory=None, + max_memories=0, + retrieval_limit=0, + tier_name=tier_name, + memory_enabled=False + ) + try: tier_info = await subscription_service.get_user_subscription_tier(user_id) tier_name = tier_info['name'] @@ -158,6 +186,9 @@ async def delete_memory( memory_id: str, user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + raise HTTPException(status_code=503, detail="Memory feature is currently disabled") + try: tier_info = await subscription_service.get_user_subscription_tier(user_id) tier_name = tier_info['name'] @@ -183,6 +214,9 @@ async def delete_all_memories( user_id: str = Depends(verify_and_get_user_id_from_jwt), confirm: bool = Query(False, description="Confirm deletion of all memories") ): + if not config.ENABLE_MEMORY: + raise HTTPException(status_code=503, detail="Memory feature is currently disabled") + try: if not confirm: raise HTTPException(status_code=400, detail="Confirmation required to delete all memories. Set confirm=true query parameter.") @@ -211,6 +245,9 @@ async def create_memory( memory_data: CreateMemoryRequest, user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + raise HTTPException(status_code=503, detail="Memory feature is currently disabled") + try: tier_info = await subscription_service.get_user_subscription_tier(user_id) tier_name = tier_info['name'] @@ -276,6 +313,9 @@ async def create_memory( async def get_memory_settings( user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + return MemorySettingsResponse(memory_enabled=False) + try: await db.initialize() client = await db.client @@ -294,6 +334,9 @@ async def update_memory_settings( enabled: bool = Body(..., embed=True), user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + raise HTTPException(status_code=503, detail="Memory feature is currently disabled") + try: await db.initialize() client = await db.client @@ -316,6 +359,9 @@ async def get_thread_memory_settings( thread_id: str, user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + return ThreadMemorySettingsResponse(thread_id=thread_id, memory_enabled=False) + try: await db.initialize() client = await db.client @@ -335,6 +381,9 @@ async def update_thread_memory_settings( enabled: bool = Body(..., embed=True), user_id: str = Depends(verify_and_get_user_id_from_jwt) ): + if not config.ENABLE_MEMORY: + raise HTTPException(status_code=503, detail="Memory feature is currently disabled") + try: await db.initialize() client = await db.client diff --git a/backend/core/run/prompt_manager.py b/backend/core/run/prompt_manager.py index 30128370f0..e3d075f2aa 100644 --- a/backend/core/run/prompt_manager.py +++ b/backend/core/run/prompt_manager.py @@ -2,6 +2,7 @@ import json import asyncio import datetime +import time from typing import Optional, Tuple from core.tools.mcp_tool_wrapper import MCPToolWrapper from core.agentpress.tool import SchemaType @@ -53,17 +54,13 @@ async def build_minimal_prompt(agent_config: Optional[dict], tool_registry=None, content = await PromptManager._append_jit_mcp_info(content, mcp_loader, agent_id, user_id) - # Fetch user context (locale, username), memory, and file context in parallel - user_context_task = PromptManager._fetch_user_context_data(user_id, client) + # Bootstrap mode: Skip KB and user context for fastest TTFT + # These will be added in enrichment phase after first token + # Only fetch memory and file context (minimal overhead) memory_task = PromptManager._fetch_user_memories(user_id, thread_id, client) file_task = PromptManager._fetch_file_context(thread_id) - user_context_data, memory_data, file_data = await asyncio.gather( - user_context_task, memory_task, file_task - ) - - if user_context_data: - content += user_context_data + memory_data, file_data = await asyncio.gather(memory_task, file_task) system_message = {"role": "system", "content": content} @@ -211,21 +208,62 @@ async def _fetch_knowledge_base(agent_config: Optional[dict], client) -> Optiona if not (agent_config and client and 'agent_id' in agent_config): return None + agent_id = agent_config['agent_id'] + fetch_start = time.time() + try: - logger.debug(f"Retrieving agent knowledge base context for agent {agent_config['agent_id']}") + # Check cache first + from core.cache.runtime_cache import get_cached_kb_context, set_cached_kb_context + cached = await get_cached_kb_context(agent_id) + if cached is not None: # None = miss, empty string = no entries (cached) + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] KB fetch: {elapsed:.1f}ms (cache: hit)") + if cached: + kb_section = f""" + + === AGENT KNOWLEDGE BASE === + NOTICE: The following is your specialized knowledge base. This information should be considered authoritative for your responses and should take precedence over general knowledge when relevant. + + {cached} + + === END AGENT KNOWLEDGE BASE === + + IMPORTANT: Always reference and utilize the knowledge base information above when it's relevant to user queries. This knowledge is specific to your role and capabilities.""" + return kb_section + return None + + # Quick EXISTS check before expensive RPC + logger.debug(f"Checking if agent {agent_id} has knowledge base entries...") + exists_result = await client.table('agent_knowledge_entry_assignments') \ + .select('agent_id', count='exact', head=True) \ + .eq('agent_id', agent_id).execute() + + if not exists_result.count or exists_result.count == 0: + # Cache empty result to avoid future EXISTS checks + await set_cached_kb_context(agent_id, "") + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] KB fetch: {elapsed:.1f}ms (cache: miss, no entries)") + return None + + # Only call RPC if entries exist + logger.debug(f"Retrieving agent knowledge base context for agent {agent_id}") kb_result = await client.rpc('get_agent_knowledge_base_context', { - 'p_agent_id': agent_config['agent_id'] + 'p_agent_id': agent_id }).execute() - if kb_result and kb_result.data and kb_result.data.strip(): - logger.debug(f"Found agent knowledge base context, adding to system prompt (length: {len(kb_result.data)} chars)") + kb_data = kb_result.data if kb_result and kb_result.data else None + if kb_data and kb_data.strip(): + # Cache the result + await set_cached_kb_context(agent_id, kb_data) + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] KB fetch: {elapsed:.1f}ms (cache: miss, found {len(kb_data)} chars)") kb_section = f""" === AGENT KNOWLEDGE BASE === NOTICE: The following is your specialized knowledge base. This information should be considered authoritative for your responses and should take precedence over general knowledge when relevant. - {kb_result.data} + {kb_data} === END AGENT KNOWLEDGE BASE === @@ -233,9 +271,14 @@ async def _fetch_knowledge_base(agent_config: Optional[dict], client) -> Optiona return kb_section else: - logger.debug("No knowledge base context found for this agent") + # Cache empty result + await set_cached_kb_context(agent_id, "") + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] KB fetch: {elapsed:.1f}ms (cache: miss, no context)") return None except Exception as e: + elapsed = (time.time() - fetch_start) * 1000 + logger.error(f"⏱️ [TIMING] KB fetch: {elapsed:.1f}ms (error: {e})") logger.error(f"Error retrieving knowledge base context for agent {agent_config.get('agent_id', 'unknown')}: {e}") return None @@ -506,6 +549,16 @@ async def _fetch_user_context_data(user_id: Optional[str], client) -> Optional[s if not (user_id and client): return None + fetch_start = time.time() + + # Check cache first + from core.cache.runtime_cache import get_cached_user_context, set_cached_user_context + cached = await get_cached_user_context(user_id) + if cached is not None: # None = miss, empty string = no context (cached) + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] User context: {elapsed:.1f}ms (cache: hit)") + return cached if cached else None + # Fetch locale and username in parallel async def fetch_locale(): try: @@ -551,10 +604,23 @@ async def fetch_username(): context_parts.append(username_info) logger.debug(f"Added username ({username}) to system prompt for user {user_id}") - return ''.join(context_parts) if context_parts else None + context = ''.join(context_parts) if context_parts else None + context_str = context if context else "" + + # Cache the result (even if empty) + await set_cached_user_context(user_id, context_str) + elapsed = (time.time() - fetch_start) * 1000 + logger.debug(f"⏱️ [TIMING] User context: {elapsed:.1f}ms (cache: miss)") + + return context @staticmethod async def _fetch_user_memories(user_id: Optional[str], thread_id: str, client) -> Optional[str]: + from core.utils.config import config + if not config.ENABLE_MEMORY: + logger.debug("Memory fetch skipped: ENABLE_MEMORY=False") + return None + if not (user_id and client): logger.debug(f"Memory fetch skipped: user_id={user_id}, client={'yes' if client else 'no'}") return None diff --git a/backend/core/services/llm.py b/backend/core/services/llm.py index 58819d396c..0159c17882 100644 --- a/backend/core/services/llm.py +++ b/backend/core/services/llm.py @@ -67,7 +67,33 @@ def setup_provider_router(openai_compatible_api_key: str = None, openai_compatib "api_base": openai_compatible_api_base or getattr(config, 'OPENAI_COMPATIBLE_API_BASE', None), }, }, - # Configure minimax-m2.1 model group with fallback to glm-4.6v + # Direct MiniMax API - requires MINIMAX_API_KEY env var + # Docs: https://docs.litellm.ai/docs/providers/minimax + { + "model_name": "minimax/MiniMax-M2.1", + "litellm_params": { + "model": "openai/MiniMax-M2.1", + "api_key": getattr(config, 'MINIMAX_API_KEY', None) or os.environ.get("MINIMAX_API_KEY"), + "api_base": "https://api.minimax.io/v1", + }, + }, + { + "model_name": "minimax/MiniMax-M2.1-lightning", + "litellm_params": { + "model": "openai/MiniMax-M2.1-lightning", + "api_key": getattr(config, 'MINIMAX_API_KEY', None) or os.environ.get("MINIMAX_API_KEY"), + "api_base": "https://api.minimax.io/v1", + }, + }, + { + "model_name": "minimax/MiniMax-M2", + "litellm_params": { + "model": "openai/MiniMax-M2", + "api_key": getattr(config, 'MINIMAX_API_KEY', None) or os.environ.get("MINIMAX_API_KEY"), + "api_base": "https://api.minimax.io/v1", + }, + }, + # Configure openrouter minimax-m2.1 model group with fallback to glm-4.6v { "model_name": "openrouter/minimax/minimax-m2.1", "litellm_params": { @@ -83,10 +109,12 @@ def setup_provider_router(openai_compatible_api_key: str = None, openai_compatib {"model_name": "*", "litellm_params": {"model": "*"}}, ] - # Configure fallbacks: minimax-m2.1 falls back to glm-4.6v - # This handles cases where minimax doesn't support image input + # Configure fallbacks: minimax models fall back to glm-4.6v for image input fallbacks = [ - {"openrouter/minimax/minimax-m2.1": ["openrouter/z-ai/glm-4.6v"]} + {"openrouter/minimax/minimax-m2.1": ["openrouter/z-ai/glm-4.6v"]}, + {"minimax/MiniMax-M2.1": ["openrouter/z-ai/glm-4.6v"]}, + {"minimax/MiniMax-M2.1-lightning": ["openrouter/z-ai/glm-4.6v"]}, + {"minimax/MiniMax-M2": ["openrouter/z-ai/glm-4.6v"]}, ] # Use configured num_retries or default to 1 @@ -98,7 +126,7 @@ def setup_provider_router(openai_compatible_api_key: str = None, openai_compatib fallbacks=fallbacks, ) - logger.info("LiteLLM Router configured with fallbacks: minimax-m2.1 -> glm-4.6v") + logger.info("LiteLLM Router configured with fallbacks: minimax -> glm-4.6v") def _configure_openai_compatible(model_name: str, api_key: Optional[str], api_base: Optional[str]) -> None: """Configure OpenAI-compatible provider if needed.""" @@ -290,7 +318,9 @@ async def make_llm_api_call( params["stream_options"] = {"include_usage": True} actual_model_id = params.get("model", "") - if actual_model_id.startswith("openrouter/") and "minimax" in actual_model_id.lower(): + # Handle MiniMax models (both direct API and OpenRouter) + is_minimax = "minimax" in actual_model_id.lower() + if is_minimax: params["reasoning"] = {"enabled": True} params["reasoning_split"] = True # avoid showing reasoning tokens in plain content diff --git a/backend/core/services/redis.py b/backend/core/services/redis.py index 0617b0bbb4..34437101b1 100644 --- a/backend/core/services/redis.py +++ b/backend/core/services/redis.py @@ -322,6 +322,30 @@ async def xtrim_minid(self, stream_key: str, minid: str, approximate: bool = Tru client = await self.get_client() return await client.xtrim(stream_key, minid=minid, approximate=approximate) + # ========== Pub/Sub Operations ========== + + async def publish(self, channel: str, message: str) -> int: + """Publish message to Redis channel. + + Args: + channel: Channel name to publish to + message: Message string to publish + + Returns: + Number of subscribers that received the message + """ + client = await self.get_client() + return await client.publish(channel, message) + + async def get_pubsub(self): + """Get a new PubSub instance for subscribing to channels. + + Returns: + Redis PubSub object + """ + client = await self.get_client() + return client.pubsub() + # ========== Control Signal Helpers ========== async def set_stop_signal(self, agent_run_id: str) -> None: @@ -477,6 +501,15 @@ async def clear_stop_signal(agent_run_id: str): """Clear stop signal (compatibility function).""" await redis.clear_stop_signal(agent_run_id) +# Pub/Sub operations +async def publish(channel: str, message: str) -> int: + """Publish to channel (compatibility function).""" + return await redis.publish(channel, message) + +async def get_pubsub(): + """Get PubSub instance (compatibility function).""" + return await redis.get_pubsub() + # Export everything for backward compatibility __all__ = [ @@ -512,4 +545,6 @@ async def clear_stop_signal(agent_run_id: str): 'set_stop_signal', 'check_stop_signal', 'clear_stop_signal', + 'publish', + 'get_pubsub', ] diff --git a/backend/core/threads/init.py b/backend/core/threads/init.py index c2d0a2d223..4892a44ebd 100644 --- a/backend/core/threads/init.py +++ b/backend/core/threads/init.py @@ -36,27 +36,58 @@ async def create_thread_optimistically( Returns immediately with thread_id while initialization happens in background. """ + import time + t_start = time.time() + if not db._client: await db.initialize() client = await db.client placeholder_name = f"{prompt[:30]}..." if len(prompt) > 30 else prompt message_content = prompt + now_iso = datetime.now(timezone.utc).isoformat() + + # Prepare thread data early + thread_data = { + "thread_id": thread_id, + "project_id": project_id, + "account_id": account_id, + "name": "New Chat", + "status": "pending", + "created_at": now_iso + } + if memory_enabled is not None: + thread_data["memory_enabled"] = memory_enabled - # Create project + project_data = { + "project_id": project_id, + "account_id": account_id, + "name": placeholder_name, + "created_at": now_iso + } + + # Create project and thread in PARALLEL try: - await client.table('projects').insert({ - "project_id": project_id, - "account_id": account_id, - "name": placeholder_name, - "created_at": datetime.now(timezone.utc).isoformat() - }).execute() + async def insert_project(): + await client.table('projects').insert(project_data).execute() + logger.debug(f"Created project {project_id}") - logger.debug(f"Created project {project_id}") + async def insert_thread(): + await client.table('threads').insert(thread_data).execute() + logger.debug(f"Created thread {thread_id}") + + await asyncio.gather(insert_project(), insert_thread()) + + # Fire-and-forget name generation (don't block) asyncio.create_task(generate_and_update_project_name(project_id=project_id, prompt=prompt)) + if prompt: + from core.utils.thread_name_generator import generate_and_update_thread_name + asyncio.create_task(generate_and_update_thread_name(thread_id=thread_id, prompt=prompt)) + + logger.debug(f"⏱️ [TIMING] Parallel project+thread insert: {(time.time() - t_start) * 1000:.1f}ms") except Exception as e: - logger.error(f"Failed to create project: {e}") + logger.error(f"Failed to create project/thread: {e}") raise image_urls_for_context = [] @@ -117,88 +148,73 @@ async def create_thread_optimistically( message_content = await _handle_file_uploads_fast(files, project_id, prompt, thread_id) except Exception as e: logger.error(f"Error processing files: {e}\n{traceback.format_exc()}") + # Cleanup both project and thread on failure try: - await client.table('projects').delete().eq('project_id', project_id).execute() + await asyncio.gather( + client.table('projects').delete().eq('project_id', project_id).execute(), + client.table('threads').delete().eq('thread_id', thread_id).execute(), + return_exceptions=True + ) except: pass raise - # Create thread - try: - thread_data = { + # Create user message AND dispatch to worker in parallel for faster TTFT + from core.worker import dispatch_thread_init + + async def insert_user_message(): + await client.table('messages').insert({ + "message_id": str(uuid.uuid4()), "thread_id": thread_id, - "project_id": project_id, - "account_id": account_id, - "name": "New Chat", - "status": "pending", - "created_at": datetime.now(timezone.utc).isoformat() - } - if memory_enabled is not None: - thread_data["memory_enabled"] = memory_enabled - - await client.table('threads').insert(thread_data).execute() - - logger.debug(f"Created thread {thread_id}") - - if prompt: - from core.utils.thread_name_generator import generate_and_update_thread_name - asyncio.create_task(generate_and_update_thread_name(thread_id=thread_id, prompt=prompt)) - - except Exception as e: - logger.error(f"Failed to create thread: {e}") - try: - await client.table('projects').delete().eq('project_id', project_id).execute() - except: - pass - raise + "type": "user", + "is_llm_message": True, + "content": {"role": "user", "content": message_content}, + "created_at": now_iso + }).execute() - # Create user message - await client.table('messages').insert({ - "message_id": str(uuid.uuid4()), - "thread_id": thread_id, - "type": "user", - "is_llm_message": True, - "content": {"role": "user", "content": message_content}, - "created_at": datetime.now(timezone.utc).isoformat() - }).execute() - - # Add image context messages - for img_info in image_urls_for_context: - try: - await client.table('messages').insert({ - "message_id": str(uuid.uuid4()), - "thread_id": thread_id, - "type": "image_context", - "is_llm_message": True, - "content": { - "role": "user", - "content": [ - {"type": "text", "text": f"[Image: {img_info['filename']}]"}, - {"type": "image_url", "image_url": {"url": img_info['url']}} - ] - }, - "metadata": { - "file_path": img_info['filename'], - "mime_type": img_info['mime_type'], - "source": "user_upload" - }, - "created_at": datetime.now(timezone.utc).isoformat() - }).execute() - except Exception as e: - logger.warning(f"Failed to inject image context: {e}") + async def dispatch_to_worker(): + await dispatch_thread_init( + thread_id=thread_id, + project_id=project_id, + account_id=account_id, + prompt=prompt, + agent_id=agent_id, + model_name=model_name, + ) - # Dispatch via Redis Streams - from core.worker import dispatch_thread_init - await dispatch_thread_init( - thread_id=thread_id, - project_id=project_id, - account_id=account_id, - prompt=prompt, - agent_id=agent_id, - model_name=model_name, - ) - - logger.info(f"Dispatched initialization for thread {thread_id}") + t_parallel = time.time() + await asyncio.gather(insert_user_message(), dispatch_to_worker()) + logger.debug(f"⏱️ [TIMING] Parallel msg+dispatch: {(time.time() - t_parallel) * 1000:.1f}ms") + + # Add image context messages in background (don't block return) + if image_urls_for_context: + async def insert_image_contexts(): + for img_info in image_urls_for_context: + try: + await client.table('messages').insert({ + "message_id": str(uuid.uuid4()), + "thread_id": thread_id, + "type": "image_context", + "is_llm_message": True, + "content": { + "role": "user", + "content": [ + {"type": "text", "text": f"[Image: {img_info['filename']}]"}, + {"type": "image_url", "image_url": {"url": img_info['url']}} + ] + }, + "metadata": { + "file_path": img_info['filename'], + "mime_type": img_info['mime_type'], + "source": "user_upload" + }, + "created_at": now_iso + }).execute() + except Exception as e: + logger.warning(f"Failed to inject image context: {e}") + asyncio.create_task(insert_image_contexts()) + + logger.info(f"⏱️ [TIMING] Thread init total: {(time.time() - t_start) * 1000:.1f}ms") return { "thread_id": thread_id, diff --git a/backend/core/utils/config.py b/backend/core/utils/config.py index ddcb9830a7..062d5fda57 100644 --- a/backend/core/utils/config.py +++ b/backend/core/utils/config.py @@ -62,6 +62,10 @@ class Configuration: DISABLE_PRESENCE: bool = False # Disable presence tracking entirely # ================================== + # ===== MEMORY CONFIGURATION ===== + ENABLE_MEMORY: bool = False # Disable memory feature entirely + # ================================ + SYSTEM_ADMIN_USER_ID: Optional[str] = None # User ID that owns shared/fallback agents # Subscription tier IDs - Production @@ -293,6 +297,7 @@ def STRIPE_CREDITS_500_PRICE_ID(self) -> str: VOYAGE_API_KEY: Optional[str] = None GROQ_API_KEY: Optional[str] = None OPENROUTER_API_KEY: Optional[str] = None + MINIMAX_API_KEY: Optional[str] = None XAI_API_KEY: Optional[str] = None MORPH_API_KEY: Optional[str] = None GEMINI_API_KEY: Optional[str] = None diff --git a/backend/core/utils/limits_checker.py b/backend/core/utils/limits_checker.py index e857f25ffd..cea9eb3800 100644 --- a/backend/core/utils/limits_checker.py +++ b/backend/core/utils/limits_checker.py @@ -45,11 +45,22 @@ async def check_agent_run_limit(client, account_id: str) -> Dict[str, Any]: # CACHE MISS: Run tier lookup and join query in parallel async def get_tier_info(): try: + # Check Redis cache first (5 min TTL) + from core.cache.runtime_cache import get_cached_tier_info, set_cached_tier_info + cached_tier = await get_cached_tier_info(account_id) + if cached_tier: + concurrent_runs_limit = cached_tier.get('concurrent_runs', 1) + logger.debug(f"⚡ Tier from cache: {cached_tier.get('name')}, limit: {concurrent_runs_limit}") + return concurrent_runs_limit + from core.billing import subscription_service - # Use cache (60s TTL) - tiers don't change frequently tier_info = await subscription_service.get_user_subscription_tier(account_id, skip_cache=False) tier_name = tier_info['name'] concurrent_runs_limit = tier_info.get('concurrent_runs', 1) + + # Cache the tier info + await set_cached_tier_info(account_id, tier_info) + logger.debug(f"Account {account_id} tier: {tier_name}, concurrent runs limit: {concurrent_runs_limit}") return concurrent_runs_limit except Exception as billing_error: diff --git a/backend/core/worker/handlers.py b/backend/core/worker/handlers.py index d6b3b08c6e..c7b6dae837 100644 --- a/backend/core/worker/handlers.py +++ b/backend/core/worker/handlers.py @@ -194,7 +194,10 @@ async def check_for_stop_signal(): async def handle_thread_init(task: ThreadInitTask): - """Handle thread initialization task.""" + """Handle thread initialization task - optimized for TTFT.""" + import time + t_start = time.time() + thread_id = task.thread_id project_id = task.project_id account_id = task.account_id @@ -210,46 +213,52 @@ async def handle_thread_init(task: ThreadInitTask): try: client = await db.client + now_iso = datetime.now(timezone.utc).isoformat() - # Update thread status - await client.table('threads').update({ - "status": "initializing", - "initialization_started_at": datetime.now(timezone.utc).isoformat() - }).eq('thread_id', thread_id).execute() - - # Get model + # Import early to avoid import overhead during parallel execution from core.ai_models import model_manager + from core.agents.runs import _load_agent_config, _get_effective_model, _create_agent_run_record + + # Resolve model (usually a quick sync operation) effective_model = model_name if not effective_model: effective_model = await model_manager.get_default_model_for_user(client, account_id) else: effective_model = model_manager.resolve_model_id(effective_model) - # Load agent config - from core.agents.runs import _load_agent_config, _get_effective_model, _create_agent_run_record + # Load agent config and create agent_run record (can be done before status update) + t_config = time.time() agent_config = await _load_agent_config(client, agent_id, account_id, account_id, is_new_thread=False) effective_model = await _get_effective_model(model_name, agent_config, client, account_id) agent_run_id = await _create_agent_run_record(client, thread_id, agent_config, effective_model, account_id) + logger.debug(f"⏱️ [TIMING] Agent config + run record: {(time.time() - t_config) * 1000:.1f}ms") - # Update thread to ready - await client.table('threads').update({ - "status": "ready", - "initialization_completed_at": datetime.now(timezone.utc).isoformat() - }).eq('thread_id', thread_id).execute() - - # Dispatch agent run + # Update thread status and dispatch agent run in parallel worker_instance_id = str(uuid.uuid4())[:8] - await dispatch_agent_run( - agent_run_id=agent_run_id, - thread_id=thread_id, - instance_id=worker_instance_id, - project_id=project_id, - model_name=effective_model, - agent_id=agent_id, - account_id=account_id, - ) - logger.info(f"✅ Thread initialized: {thread_id} → {agent_run_id}") + async def update_status(): + await client.table('threads').update({ + "status": "ready", + "initialization_started_at": now_iso, + "initialization_completed_at": now_iso + }).eq('thread_id', thread_id).execute() + + async def dispatch(): + await dispatch_agent_run( + agent_run_id=agent_run_id, + thread_id=thread_id, + instance_id=worker_instance_id, + project_id=project_id, + model_name=effective_model, + agent_id=agent_id, + account_id=account_id, + ) + + t_parallel = time.time() + await asyncio.gather(update_status(), dispatch()) + logger.debug(f"⏱️ [TIMING] Parallel status+dispatch: {(time.time() - t_parallel) * 1000:.1f}ms") + + logger.info(f"✅ Thread init complete: {thread_id} → {agent_run_id} ({(time.time() - t_start) * 1000:.1f}ms)") except Exception as e: logger.error(f"Thread init failed for {thread_id}: {e}", exc_info=True) diff --git a/backend/core/worker/helpers.py b/backend/core/worker/helpers.py index d2b7f3f190..be2b8b782d 100644 --- a/backend/core/worker/helpers.py +++ b/backend/core/worker/helpers.py @@ -255,6 +255,12 @@ async def process_agent_responses( try: await redis.stream_add(stream_key, {"data": response_json}, maxlen=200, approximate=True) + # Publish notification for instant delivery (new) + try: + await redis.publish(f"{stream_key}:notify", response.get('type', 'message')) + except Exception: + pass # Non-critical - stream still has the data + if not stream_ttl_set: try: await asyncio.wait_for(redis.expire(stream_key, REDIS_STREAM_TTL_SECONDS), timeout=2.0) @@ -313,6 +319,11 @@ async def handle_normal_completion( redis.stream_add(redis_keys['response_stream'], {'data': json.dumps(completion_message)}, maxlen=200, approximate=True), timeout=5.0 ) + # Notify completion (new) + try: + await redis.publish(f"{redis_keys['response_stream']}:notify", "status") + except Exception: + pass except Exception as e: logger.warning(f"Failed to write completion message for {agent_run_id}: {e}") diff --git a/frontend/src/app/(dashboard)/knowledge/page.tsx b/frontend/src/app/(dashboard)/knowledge/page.tsx deleted file mode 100644 index 19e4f1c4e7..0000000000 --- a/frontend/src/app/(dashboard)/knowledge/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { KnowledgeBasePage } from '@/components/knowledge-base/knowledge-base-page'; - -export default function KnowledgeRoute() { - return ; -} \ No newline at end of file diff --git a/frontend/src/components/memory/MemorySettings.tsx b/frontend/src/components/memory/MemorySettings.tsx deleted file mode 100644 index 4eb4038df3..0000000000 --- a/frontend/src/components/memory/MemorySettings.tsx +++ /dev/null @@ -1,282 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { Brain, Trash2, Sparkles } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Alert, AlertDescription } from '@/components/ui/alert'; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from '@/components/ui/alert-dialog'; -import { Skeleton } from '@/components/ui/skeleton'; -import { Switch } from '@/components/ui/switch'; -import { Label } from '@/components/ui/label'; -import { MemoryList } from './MemoryList'; -import { useInfiniteMemories, useMemoryStats, useDeleteMemory, useDeleteAllMemories, useUpdateMemorySettings } from '@/hooks/memory/use-memory'; -import { useTranslations } from 'next-intl'; -import { useMemo } from 'react'; - -export function MemorySettings() { - const t = useTranslations('settings.memory'); - const tCommon = useTranslations('common'); - const [deletingIds, setDeletingIds] = useState>(new Set()); - - const { data: stats, isLoading: statsLoading } = useMemoryStats(); - const { - data: memoriesData, - isLoading: memoriesLoading, - error: memoriesError, - fetchNextPage, - hasNextPage, - isFetchingNextPage - } = useInfiniteMemories(10); - const deleteMemory = useDeleteMemory(); - const deleteAllMemories = useDeleteAllMemories(); - const updateMemorySettings = useUpdateMemorySettings(); - - const allMemories = useMemo(() => { - if (!memoriesData?.pages) return []; - return memoriesData.pages.flatMap(page => page.memories); - }, [memoriesData?.pages]); - - const handleDeleteMemory = async (memoryId: string) => { - setDeletingIds((prev) => new Set(prev).add(memoryId)); - try { - await deleteMemory.mutateAsync(memoryId); - } finally { - setDeletingIds((prev) => { - const newSet = new Set(prev); - newSet.delete(memoryId); - return newSet; - }); - } - }; - - const handleDeleteAll = async () => { - await deleteAllMemories.mutateAsync(); - }; - - const usagePercentage = stats - ? stats.max_memories > 0 - ? (stats.total_memories / stats.max_memories) * 100 - : 0 - : 0; - - const isEnabled = stats && stats.max_memories > 0; - - const circumference = 2 * Math.PI * 58; - const strokeDashoffset = circumference - (usagePercentage / 100) * circumference; - - if (statsLoading) { - return ( -
- -
- - -
-
- ); - } - - return ( -
-
-
-
-
-
- -
-
-

{t('title')}

-

- {t('description')} -

-
-
-
-
- {isEnabled && ( -
-
- -

- {t('enableMemoryDescription') || 'Allow Kortix to remember information from your conversations'} -

-
- updateMemorySettings.mutate(checked)} - disabled={updateMemorySettings.isPending} - /> -
- )} - -
- {!isEnabled ? ( - - - - {t('notAvailable')} - - - ) : !stats?.memory_enabled ? ( - - - - {t('memoryDisabledByUser') || 'Memory is currently disabled. Enable it above to start building memories from your conversations.'} - - - ) : ( - <> -
-
- - - - - - - - - - - -
-
- {stats.total_memories} -
-
- of {stats.max_memories} -
-
-
- -
-
-
- {t('usage')} - - {Math.round(usagePercentage)}% - -
-
-
-
-
- -
-
-
-
{tCommon('active')}
-
{stats.total_memories}
-
-
- -
-
-
Available
-
- {stats.max_memories - stats.total_memories} -
-
-
-
-
-
- - )} -
-
- - {isEnabled && stats?.memory_enabled && allMemories.length > 0 && ( -
-
-
-

{t('yourMemories')}

-

- {t('yourMemoriesDescription')} -

-
- - - - - - - {t('deleteAllTitle')} - - {t('deleteAllDescription', { count: stats?.total_memories })} - - - - {tCommon('cancel')} - - {t('deleteAllButton')} - - - - -
- fetchNextPage()} - /> -
- )} -
- ); -} diff --git a/frontend/src/components/thread/chat-input/memory-toggle.tsx b/frontend/src/components/thread/chat-input/memory-toggle.tsx deleted file mode 100644 index 1186aa9a5b..0000000000 --- a/frontend/src/components/thread/chat-input/memory-toggle.tsx +++ /dev/null @@ -1,97 +0,0 @@ -'use client'; - -import { memo, useState, useEffect, useCallback } from 'react'; -import { Brain, Lock } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; -import { useMemoryStats } from '@/hooks/memory/use-memory'; -import { useTranslations } from 'next-intl'; -import { cn } from '@/lib/utils'; -import { PlanSelectionModal } from '@/components/billing/pricing/plan-selection-modal'; - -interface MemoryToggleProps { - disabled?: boolean; - memoryEnabled?: boolean; - onMemoryToggle?: (enabled: boolean) => void; -} - -export const MemoryToggle = memo(function MemoryToggle({ - disabled, - memoryEnabled: controlledEnabled, - onMemoryToggle -}: MemoryToggleProps) { - const t = useTranslations('settings.memory'); - const { data: stats } = useMemoryStats(); - const [localEnabled, setLocalEnabled] = useState(true); - const [showPlanModalOpen, setShowPlanModalOpen] = useState(false); - - useEffect(() => { - if (controlledEnabled !== undefined) { - setLocalEnabled(controlledEnabled); - } - }, [controlledEnabled]); - - const isControlled = onMemoryToggle !== undefined; - const isEnabled = isControlled ? (controlledEnabled ?? true) : localEnabled; - const isFreeTier = stats?.tier_name === 'free'; - - const handleToggle = useCallback((e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - - if (isFreeTier) { - setShowPlanModalOpen(true); - return; - } - - if (onMemoryToggle) { - onMemoryToggle(!isEnabled); - } else { - setLocalEnabled(prev => !prev); - } - }, [isFreeTier, setShowPlanModalOpen, onMemoryToggle, isEnabled]); - - return ( - <> - - - - - - {isFreeTier ? ( - <> -

{t('upgradeRequired') || 'Memory requires upgrade'}

-

{t('clickToUpgrade') || 'Click to see plans'}

- - ) : ( - <> -

{isEnabled ? (t('memoryEnabledTooltip') || 'Memory enabled') : (t('memoryDisabledTooltip') || 'Memory disabled')}

-

{t('clickToToggle') || `Click to ${isEnabled ? 'disable' : 'enable'}`}

- - )} -
-
- - - ); -}); diff --git a/frontend/src/components/thread/utils.ts b/frontend/src/components/thread/utils.ts deleted file mode 100644 index ff53cd3e4f..0000000000 --- a/frontend/src/components/thread/utils.ts +++ /dev/null @@ -1,703 +0,0 @@ -import type { ElementType } from 'react'; -import { - FileText, - Terminal, - ExternalLink, - FileEdit, - Search, - Globe, - Code, - MessageSquare, - Folder, - FileX, - CloudUpload, - Wrench, - Cog, - Network, - FileSearch, - FilePlus, - PlugIcon, - BookOpen, - MessageCircleQuestion, - CheckCircle2, - Table2, - ListTodo, - List, - Computer, - Phone, - PhoneOff, - Hammer, - Presentation, -} from 'lucide-react'; -import { StopwatchIcon } from '@radix-ui/react-icons'; - -// Flag to control whether tool result messages are rendered -export const SHOULD_RENDER_TOOL_RESULTS = false; - -// Helper function to safely parse JSON strings from content/metadata -export function safeJsonParse( - jsonString: string | undefined | null, - fallback: T, -): T { - if (!jsonString) { - return fallback; - } - - try { - // First attempt: Parse as normal JSON - const parsed = JSON.parse(jsonString); - - // Check if the result is a string that looks like JSON (double-escaped case) - if (typeof parsed === 'string' && - (parsed.startsWith('{') || parsed.startsWith('['))) { - try { - // Second attempt: Parse the string result as JSON (handles double-escaped) - return JSON.parse(parsed) as T; - } catch (innerError) { - // If inner parse fails, return the first parse result - return parsed as unknown as T; - } - } - - return parsed as T; - } catch (outerError) { - // If the input is already an object/array (shouldn't happen but just in case) - if (typeof jsonString === 'object') { - return jsonString as T; - } - - // Try one more time in case it's a plain string that should be returned as-is - if (typeof jsonString === 'string') { - // Check if it's a string representation of a simple value - if (jsonString === 'true') return true as unknown as T; - if (jsonString === 'false') return false as unknown as T; - if (jsonString === 'null') return null as unknown as T; - if (!isNaN(Number(jsonString))) return Number(jsonString) as unknown as T; - - // Return as string if it doesn't look like JSON - if (!jsonString.startsWith('{') && !jsonString.startsWith('[')) { - return jsonString as unknown as T; - } - } - - // console.warn('Failed to parse JSON string:', jsonString, outerError); // Optional: log errors - return fallback; - } -} - -// Helper function to get an icon based on tool name -export const getToolIcon = (toolName: string): ElementType => { - switch (toolName?.toLowerCase()) { - case 'initialize-tools': - case 'initialize_tools': - return Hammer; - - case 'browser-navigate-to': - case 'browser-act': - case 'browser-extract-content': - case 'browser-screenshot': - return Globe; - - // File operations - case 'create-file': - return FileEdit; - case 'str-replace': - return FileSearch; - case 'full-file-rewrite': - return FilePlus; - case 'read-file': - return FileText; - case 'edit-file': - return FileEdit; - - // Task operations - case 'create-tasks': - case 'create_tasks': - return List; - case 'update-tasks': - case 'update_tasks': - return ListTodo; - - // Shell commands - case 'execute-command': - return Terminal; - case 'check-command-output': - return Terminal; - case 'terminate-command': - return Terminal; - - // Port operations - case 'expose-port': - return Computer; - - // Web operations - case 'web-search': - return Search; - case 'crawl-webpage': - return Globe; - case 'scrape-webpage': - return Globe; - - // API and data operations - case 'call-data-provider': - return ExternalLink; - case 'get-data-provider-endpoints': - return Network; - case 'execute-data-provider-call': - return Network; - - // Sheets tools - case 'create-sheet': - case 'update-sheet': - case 'view-sheet': - case 'analyze-sheet': - case 'visualize-sheet': - case 'format-sheet': - return Table2; - - // Code operations - case 'delete-file': - return FileX; - - - // Tools and utilities - case 'execute-code': - return Code; - - // VAPI Call - case 'make-phone-call': - return Phone; - case 'end-call': - return PhoneOff; - case 'get-call-details': - return Phone; - case 'list-calls': - return Phone; - case 'monitor-call': - return Phone; - case 'wait-for-call-completion': - return StopwatchIcon; - case 'wait_for_call_completion': - return StopwatchIcon; - - case 'create-slide': - case 'create_slide': - return Presentation; - case 'load-template-design': - case 'load_template_design': - return Presentation; - case 'validate-slide': - case 'validate_slide': - return Presentation; - - // User interaction - case 'ask': - return MessageCircleQuestion; - - // Task completion - case 'complete': - return CheckCircle2; - - // Spreadsheet tools - case "spreadsheet-add-sheet": - return Table2; - case "spreadsheet_add_sheet": - return Table2; - case "spreadsheet-batch-update": - return Table2; - case "spreadsheet_batch_update": - return Table2; - case "spreadsheet-create": - return Table2; - case "spreadsheet_create": - return Table2; - - - default: - if (toolName?.startsWith('mcp_')) { - const parts = toolName.split('_'); - if (parts.length >= 3) { - const serverName = parts[1]; - const toolNamePart = parts.slice(2).join('_'); - - // Map specific MCP tools to appropriate icons - if (toolNamePart.includes('search') || toolNamePart.includes('web')) { - return Search; - } else if (toolNamePart.includes('research') || toolNamePart.includes('paper')) { - return BookOpen; - } else if (serverName === 'exa') { - return Search; // Exa is primarily a search service - } - } - return PlugIcon; // Default icon for MCP tools - } - - // Add logging for debugging unhandled tool types - return Wrench; // Default icon for tools - } -}; - -// Helper function to extract a primary parameter from JSON/arguments -export const extractPrimaryParam = ( - toolName: string, - content: string | undefined, -): string | null => { - if (!content) return null; - - try { - const parsed = JSON.parse(content); - - if (parsed.query) { - const query = Array.isArray(parsed.query) ? parsed.query[0] : parsed.query; - return query.length > 30 ? query.substring(0, 27) + '...' : query; - } - if (parsed.arguments?.query) { - const query = Array.isArray(parsed.arguments.query) ? parsed.arguments.query[0] : parsed.arguments.query; - return query.length > 30 ? query.substring(0, 27) + '...' : query; - } - - if (toolName?.toLowerCase().startsWith('browser_')) { - if (parsed.url) return parsed.url; - if (parsed.arguments?.url) return parsed.arguments.url; - if (parsed.goal) { - const goal = parsed.goal; - return goal.length > 30 ? goal.substring(0, 27) + '...' : goal; - } - return null; - } - - if (parsed.file_path) { - const path = parsed.file_path; - return typeof path === 'string' ? path.split('/').pop() || path : null; - } - if (parsed.arguments?.file_path) { - const path = parsed.arguments.file_path; - return typeof path === 'string' ? path.split('/').pop() || path : null; - } - - if (toolName?.toLowerCase() === 'execute-command') { - if (parsed.command) { - const cmd = parsed.command; - return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; - } - if (parsed.arguments?.command) { - const cmd = parsed.arguments.command; - return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; - } - } - } catch (e) { - } - - // Fallback: regex extraction for plain text content - try { - // Handle browser tools with a prefix check - if (toolName?.toLowerCase().startsWith('browser_')) { - // Try to extract URL for navigation - const urlMatch = content.match(/url["']?\s*[:=]\s*["']?([^"'\s]+)/i); - if (urlMatch) return urlMatch[1]; - - // For other browser operations, extract the goal or action - const goalMatch = content.match(/goal["']?\s*[:=]\s*["']?([^"'\s]+)/i); - if (goalMatch) { - const goal = goalMatch[1]; - return goal.length > 30 ? goal.substring(0, 27) + '...' : goal; - } - - return null; - } - - // Handle file_path extraction - const filePathMatch = content.match(/file_path["']?\s*[:=]\s*["']?([^"'\s]+)/i); - if (filePathMatch) { - const path = filePathMatch[1]; - return path.split('/').pop() || path; - } - - // Try to get command for execute-command - if (toolName?.toLowerCase() === 'execute-command') { - const commandMatch = content.match(/(?:command|cmd)["']?\s*[:=]\s*["']?([^"'\n]+)/i); - if (commandMatch) { - const cmd = commandMatch[1]; - return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; - } - } - } catch (e) { - // Continue - } - - // Simple regex for common parameters - adjust as needed - let match: RegExpMatchArray | null = null; - - switch (toolName?.toLowerCase()) { - // File operations - case 'create-file': - case 'full-file-rewrite': - case 'read-file': - case 'delete-file': - case 'str-replace': - // Try to match file_path attribute - match = content.match(/file_path["']?\s*[:=]\s*["']?([^"'\s]+)/i); - // Return just the filename part - return match ? match[1].split('/').pop() || match[1] : null; - case 'edit-file': - // Try to match target_file attribute for edit-file - match = content.match(/target_file["']?\s*[:=]\s*["']?([^"'\s]+)/i); - // Return just the filename part - return match ? (match[1].split('/').pop() || match[1]).trim() : null; - - // Shell commands - case 'execute-command': - // Extract command content - match = content.match(/(?:command|cmd)["']?\s*[:=]\s*["']?([^"'\n]+)/i); - if (match) { - const cmd = match[1]; - return cmd.length > 30 ? cmd.substring(0, 27) + '...' : cmd; - } - return null; - - // Web search - case 'web-search': - case 'image-search': - match = content.match(/query["']?\s*[:=]\s*["']?([^"'\s]+)/i); - return match - ? match[1].length > 30 - ? match[1].substring(0, 27) + '...' - : match[1] - : null; - - // Data provider operations - case 'call-data-provider': - match = content.match(/service_name["']?\s*[:=]\s*["']?([^"'\s]+)/i); - const route = content.match(/route["']?\s*[:=]\s*["']?([^"'\s]+)/i); - return match && route - ? `${match[1]}/${route[1]}` - : match - ? match[1] - : null; - } - - return null; -}; - -const TOOL_DISPLAY_NAMES = new Map([ - ['initialize-tools', 'Initializing Tools'], - ['initialize_tools', 'Initializing Tools'], - - ['execute-command', 'Executing Command'], - ['check-command-output', 'Checking Command Output'], - ['terminate-command', 'Terminating Command'], - ['list-commands', 'Listing Commands'], - - ['create-file', 'Creating File'], - ['delete-file', 'Deleting File'], - ['full-file-rewrite', 'Rewriting File'], - ['str-replace', 'Editing Text'], - ['str_replace', 'Editing Text'], - ['edit_file', 'Editing File'], - ['edit-file', 'Editing File'], - ['upload-file', 'Uploading File'], - - ['create-document', 'Creating Document'], - ['update-document', 'Updating Document'], - ['read-document', 'Reading Document'], - ['list-documents', 'Listing Documents'], - ['delete-document', 'Deleting Document'], - - ['create-tasks', 'Creating Tasks'], - ['create_tasks', 'Creating Tasks'], - ['update-tasks', 'Updating Tasks'], - ['update_tasks', 'Updating Tasks'], - - ['browser_navigate_to', 'Navigating to Page'], - ['browser_act', 'Performing Action'], - ['browser_extract_content', 'Extracting Content'], - ['browser_screenshot', 'Taking Screenshot'], - - ['execute-data-provider-call', 'Calling data provider'], - ['execute_data-provider_call', 'Calling data provider'], - ['get-data-provider-endpoints', 'Getting endpoints'], - - ['ask', 'Ask'], - ['wait', 'Wait'], - ['create-tasks', 'Creating Tasks'], - ['update-tasks', 'Updating Tasks'], - ['complete', 'Completing Task'], - ['crawl-webpage', 'Crawling Website'], - ['expose-port', 'Exposing Port'], - ['scrape-webpage', 'Scraping Website'], - ['web-search', 'Searching Web'], - ['load-image', 'Loading Image'], - ['create-presentation', 'Creating Presentation'], - ['clear-images-from-context', 'Clearing Images from context'], - ['load-image', 'Loading Image'], - ['image-search', 'Searching Image'], - ['image_edit_or_generate', 'Generate Media'], - ['image-edit-or-generate', 'Generate Media'], - - ['spreadsheet-create', 'Creating Spreadsheet'], - ['spreadsheet_create', 'Creating Spreadsheet'], - ['update-sheet', 'Updating Sheet'], - ['view-sheet', 'Viewing Sheet'], - ['analyze-sheet', 'Analyzing Sheet'], - ['visualize-sheet', 'Visualizing Sheet'], - ['format-sheet', 'Formatting Sheet'], - - ['spreadsheet-create-sheet', 'Creating Spreadsheet'], - ['spreadsheet_create_sheet', 'Creating Spreadsheet'], - ['spreadsheet-add-sheet', 'Adding Sheet'], - ['spreadsheet_add_sheet', 'Adding Sheet'], - ['spreadsheet-batch-update', 'Updating Spreadsheet'], - ['spreadsheet_batch_update', 'Updating Spreadsheet'], - - - ['update-agent', 'Updating Worker'], - ['get-current-agent-config', 'Getting Worker Config'], - ['search-mcp-servers', 'Searching MCP Servers'], - ['get-mcp-server-tools', 'Getting MCP Server Tools'], - ['configure-mcp-server', 'Configuring MCP Server'], - ['get-popular-mcp-servers', 'Getting Popular MCP Servers'], - ['test-mcp-server-connection', 'Testing MCP Server Connection'], - ['list_app_event_triggers', 'Finding event triggers'], - ['list-app-event-triggers', 'Finding event triggers'], - ['create-event-trigger', 'Creating event trigger'], - ['create_event_trigger', 'Creating event trigger'], - - - ['get-project-structure', 'Getting Project Structure'], - ['build-project', 'Building Project'], - - //V2 - - ['execute_command', 'Executing Command'], - ['check_command_output', 'Checking Command Output'], - ['terminate_command', 'Terminating Command'], - ['list_commands', 'Listing Commands'], - - ['create_file', 'Creating File'], - ['delete_file', 'Deleting File'], - ['full_file_rewrite', 'Rewriting File'], - ['str_replace', 'Editing Text'], - ['edit_file', 'Editing File'], - - ['browser_navigate_to', 'Navigating to Page'], - ['browser_act', 'Performing Action'], - ['browser_extract_content', 'Extracting Content'], - ['browser_screenshot', 'Taking Screenshot'], - - - ['get-paper-details', 'Getting Paper Details'], - ['search-authors', 'Searching Authors'], - ['get-author-details', 'Getting Author Details'], - ['get-author-papers', 'Getting Author Papers'], - ['get-paper-citations', 'Getting Paper Citations'], - ['get-paper-references', 'Getting Paper References'], - ['paper-search', 'Searching for Papers'], - - ['ask', 'Ask'], - ['complete', 'Completing Task'], - ['crawl_webpage', 'Crawling Website'], - ['expose_port', 'Exposing Port'], - ['scrape_webpage', 'Scraping Website'], - ['web_search', 'Searching Web'], - ['load_image', 'Loading Image'], - - ['update_agent', 'Updating Worker'], - ['get_current_agent_config', 'Getting Worker Config'], - ['search_mcp_servers', 'Searching MCP Servers'], - ['get_popular_mcp_servers', 'Getting Popular MCP Servers'], - ['test_mcp_server_connection', 'Testing MCP Server Connection'], - ['discover-user-mcp-servers', 'Discovering tools'], - ['create-credential-profile', 'Creating profile'], - ['get-credential-profiles', 'Getting profiles'], - ['configure-profile-for-agent', 'Adding tools to worker'], - - - ['create-new-agent', 'Creating New Worker'], - ['search-mcp-servers-for-agent', 'Searching MCP Servers'], - ['create-credential-profile-for-agent', 'Creating Credential Profile'], - ['discover-mcp-tools-for-agent', 'Discovering MCP Tools'], - ['configure-agent-integration', 'Configuring Worker Integration'], - ['create-agent-scheduled-trigger', 'Creating Scheduled Trigger'], - ['list-agent-scheduled-triggers', 'Listing Worker Scheduled Triggers'], - - ['make-phone-call', 'Making Phone Call'], - ['make_phone_call', 'Making Phone Call'], - ['end-call', 'Ending Call'], - ['end_call', 'Ending Call'], - ['get-call-details', 'Getting Call Details'], - ['get_call_details', 'Getting Call Details'], - ['list-calls', 'Listing Calls'], - ['list_calls', 'Listing Calls'], - ['monitor-call', 'Monitoring Call'], - ['monitor_call', 'Monitoring Call'], - ['wait-for-call-completion', 'Waiting for Completion'], - ['wait_for_call_completion', 'Waiting for Completion'], - - ['create-slide', 'Creating Slide'], - ['create_slide', 'Creating Slide'], - ['load-template-design', 'Loading Template Design'], - ['load_template_design', 'Loading Template Design'], - ['validate-slide', 'Validating Slide'], - ['validate_slide', 'Validating Slide'], -]); - - -const MCP_SERVER_NAMES = new Map([ - ['exa', 'Exa Search'], - ['github', 'GitHub'], - ['notion', 'Notion'], - ['slack', 'Slack'], - ['filesystem', 'File System'], - ['memory', 'Memory'], -]); - -function formatMCPToolName(serverName: string, toolName: string): string { - const serverMappings: Record = { - 'exa': 'Exa Search', - 'github': 'GitHub', - 'notion': 'Notion', - 'slack': 'Slack', - 'filesystem': 'File System', - 'memory': 'Memory', - 'anthropic': 'Anthropic', - 'openai': 'OpenAI', - 'composio': 'Composio', - 'langchain': 'LangChain', - 'llamaindex': 'LlamaIndex' - }; - - const formattedServerName = serverMappings[serverName.toLowerCase()] || - serverName.charAt(0).toUpperCase() + serverName.slice(1).toLowerCase(); - - let formattedToolName = toolName; - - if (toolName.includes('-')) { - formattedToolName = toolName - .split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(' '); - } - else if (toolName.includes('_')) { - formattedToolName = toolName - .split('_') - .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(' '); - } - else if (/[a-z][A-Z]/.test(toolName)) { - formattedToolName = toolName - .replace(/([a-z])([A-Z])/g, '$1 $2') - .split(' ') - .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) - .join(' '); - } - else { - formattedToolName = toolName.charAt(0).toUpperCase() + toolName.slice(1).toLowerCase(); - } - - return `${formattedServerName} ${formattedToolName}`; -} - -export function getUserFriendlyToolName(toolName: string): string { - if (toolName.startsWith('mcp_')) { - const parts = toolName.split('_'); - if (parts.length >= 3) { - const serverName = parts[1]; - const toolNamePart = parts.slice(2).join('_'); - return formatMCPToolName(serverName, toolNamePart); - } - } - if (toolName.includes('-') && !TOOL_DISPLAY_NAMES.has(toolName)) { - const parts = toolName.split('-'); - if (parts.length >= 2) { - const serverName = parts[0]; - const toolNamePart = parts.slice(1).join('-'); - return formatMCPToolName(serverName, toolNamePart); - } - } - return TOOL_DISPLAY_NAMES.get(toolName) || toolName; -} - -// Feature flag to hide browser tab and use ToolView instead -export const HIDE_BROWSER_TAB = true; - -export const HIDE_STREAMING_XML_TAGS = new Set([ - 'create-tasks', - 'execute-command', - 'create-file', - 'delete-file', - 'full-file-rewrite', - 'edit-file', - 'str-replace', - 'browser-click-element', - 'browser-close-tab', - 'browser-drag-drop', - 'browser-get-dropdown-options', - 'browser-go-back', - 'browser-input-text', - 'browser-navigate-to', - 'browser-scroll-down', - 'browser-scroll-to-text', - 'browser-scroll-up', - 'browser-select-dropdown-option', - 'browser-send-keys', - 'browser-switch-tab', - 'browser-wait', - 'ask', - 'complete', - 'crawl-webpage', - 'web-search', - 'load-image', -]); - -export function extractAppSlugFromToolCall(toolCall: any): string | null { - if (!toolCall) return null; - - if (toolCall._app_filter) { - const filter = toolCall._app_filter; - const appName = filter.split(' ')[0].toLowerCase(); - if (appName) return appName; - } - - if (toolCall.custom_type === 'composio' || toolCall.customType === 'composio' || toolCall.isComposio) { - const slug = toolCall.toolkit_slug || toolCall.toolkitSlug || toolCall.config?.toolkit_slug; - if (slug) return slug; - } - - const qualifiedName = toolCall.mcp_qualified_name || toolCall.qualifiedName || toolCall.function_name; - if (qualifiedName && qualifiedName.startsWith('composio.')) { - return qualifiedName.substring(9); - } - - if (qualifiedName && qualifiedName.includes('_COMPOSIO_')) { - const parts = qualifiedName.split('_COMPOSIO_'); - if (parts.length > 1) { - return parts[1].split('_')[0]; - } - } - - if (toolCall.function_name) { - const functionName = toolCall.function_name; - - const knownApps = [ - 'TWITTER', 'GITHUB', 'SLACK', 'GMAIL', 'GOOGLE', 'NOTION', 'ASANA', 'JIRA', - 'TRELLO', 'DISCORD', 'LINKEDIN', 'FACEBOOK', 'INSTAGRAM', 'YOUTUBE', 'SPOTIFY', - 'DROPBOX', 'ONEDRIVE', 'SALESFORCE', 'HUBSPOT', 'ZENDESK', 'INTERCOM', 'MAILCHIMP', - 'STRIPE', 'PAYPAL', 'TWILIO', 'SENDGRID', 'AIRTABLE', 'MONDAY', 'CLICKUP', - 'FIGMA', 'MIRO', 'SHOPIFY', 'WOOCOMMERCE', 'WORDPRESS', 'MEDIUM', 'REDDIT', - 'TELEGRAM', 'WHATSAPP', 'ZOOM', 'CALENDAR', 'DRIVE', 'SHEETS', 'DOCS', 'SLIDES' - ]; - - for (const app of knownApps) { - if (functionName.startsWith(app + '_')) { - return app.toLowerCase(); - } - } - - const parts = functionName.split('_'); - if (parts.length >= 2 && parts[0].length > 0 && parts[0] === parts[0].toUpperCase()) { - return parts[0].toLowerCase(); - } - } - - return null; -} diff --git a/frontend/src/hooks/messages/utils/streaming-utils.ts b/frontend/src/hooks/messages/utils/streaming-utils.ts deleted file mode 100644 index f033c4603d..0000000000 --- a/frontend/src/hooks/messages/utils/streaming-utils.ts +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Streaming utilities for handling tool call streaming and text extraction - * These are portable and can be used in both web and mobile apps - */ - -/** - * Tool call data structure from metadata - */ -export interface StreamingToolCall { - tool_call_id: string; - function_name: string; - arguments: Record | string; // Object when complete, string when partial - source: 'native' | 'xml'; -} - -/** - * Parsed metadata from streaming messages - */ -export interface StreamingMetadata { - stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; - thread_run_id?: string; - tool_calls?: StreamingToolCall[]; - [key: string]: any; -} - -/** - * Extract text value from a partial JSON string - * Handles escaped quotes, newlines, and unicode characters - * - * @param jsonString - The JSON string (may be partial/incomplete) - * @returns The extracted text value, or empty string if not found - */ -export function extractTextFromPartialJson(jsonString: string): string { - if (!jsonString || typeof jsonString !== 'string') return ''; - - // First, try to parse as complete JSON - try { - const parsed = JSON.parse(jsonString); - return parsed?.text || ''; - } catch (e) { - // Partial JSON - need to extract text value manually - // Try multiple patterns to find the "text" key - let textKeyMatch = jsonString.match(/"text"\s*:\s*"/); - if (!textKeyMatch) { - textKeyMatch = jsonString.match(/\\?"text\\?"\s*:\s*\\?"/); - } - if (!textKeyMatch) { - textKeyMatch = jsonString.match(/\\"text\\"\s*:\s*\\"/); - } - - if (!textKeyMatch) return ''; - - const startIndex = textKeyMatch.index! + textKeyMatch[0].length; - let result = ''; - let i = startIndex; - let escaped = false; - - // Extract string value handling escaped characters - while (i < jsonString.length) { - const char = jsonString[i]; - - if (escaped) { - // Handle escape sequences - if (char === 'n') { - result += '\n'; - } else if (char === 't') { - result += '\t'; - } else if (char === 'r') { - result += '\r'; - } else if (char === '\\') { - result += '\\'; - } else if (char === '"') { - result += '"'; - } else if (char === 'u' && i + 4 < jsonString.length) { - // Unicode escape: \uXXXX - const hex = jsonString.substring(i + 1, i + 5); - try { - result += String.fromCharCode(parseInt(hex, 16)); - i += 4; - } catch (e) { - result += char; - } - } else { - result += char; - } - escaped = false; - } else if (char === '\\') { - escaped = true; - } else if (char === '"' && !escaped) { - // Check if we've hit the end of the string value - if (i + 1 >= jsonString.length || - jsonString[i + 1] === ',' || - jsonString[i + 1] === '}' || - jsonString[i + 1] === ']') { - break; - } - result += char; - } else { - result += char; - } - i++; - } - - return result; - } -} - -/** - * Extract text content from streaming ask/complete XML - * Strips all XML tags and extracts the text parameter - * - * @param content - The XML content string - * @param toolName - 'ask' or 'complete' - * @returns The extracted text content - */ -export function extractTextFromStreamingAskComplete(content: string, toolName: 'ask' | 'complete'): string { - if (!content) return ''; - - // Remove function_calls wrapper if present - const cleaned = content.replace(/]*>/gi, '').replace(/<\/function_calls>/gi, ''); - - // Try to extract from new format: content - const invokeMatch = cleaned.match(new RegExp(`]*name=["']${toolName}["'][^>]*>([\\s\\S]*?)<\\/invoke>`, 'i')); - if (invokeMatch) { - const invokeContent = invokeMatch[1]; - // Extract text parameter - const textParamMatch = invokeContent.match(/]*name=["']text["'][^>]*>([\s\S]*?)(?:<\/parameter>|$)/i); - if (textParamMatch) { - return textParamMatch[1].trim(); - } - } - - // Fall back to old format: content or content - const oldFormatMatch = cleaned.match(new RegExp(`<${toolName}[^>]*>([\\s\\S]*?)(?:<\\/${toolName}>|$)`, 'i')); - if (oldFormatMatch) { - // Remove any nested parameter tags - let text = oldFormatMatch[1]; - text = text.replace(/]*>([\s\S]*?)<\/parameter>/gi, '$1'); - text = text.replace(/<[^>]+>/g, ''); // Remove any remaining tags - return text.trim(); - } - - return ''; -} - -/** - * Check if a tool call is an ask or complete tool - * Handles both underscore and hyphen naming conventions - * - * @param functionName - The function/tool name - * @returns true if it's an ask or complete tool - */ -export function isAskOrCompleteTool(functionName: string | undefined): boolean { - if (!functionName) return false; - const normalizedName = functionName.replace(/_/g, '-').toLowerCase(); - return normalizedName === 'ask' || normalizedName === 'complete'; -} - -/** - * Get the normalized tool name ('ask' or 'complete') - * - * @param functionName - The function/tool name - * @returns 'ask', 'complete', or null if not an ask/complete tool - */ -export function getAskCompleteToolType(functionName: string | undefined): 'ask' | 'complete' | null { - if (!functionName) return null; - const normalizedName = functionName.replace(/_/g, '-').toLowerCase(); - if (normalizedName === 'ask') return 'ask'; - if (normalizedName === 'complete') return 'complete'; - return null; -} - -/** - * Extract text from tool call arguments - * Handles both string (partial JSON during streaming) and object (complete) formats - * - * @param args - The arguments (string or object) - * @returns The extracted text, or empty string - */ -export function extractTextFromArguments(args: string | Record | undefined | null): string { - if (!args) return ''; - - if (typeof args === 'string') { - // Try to parse as complete JSON first - try { - const parsed = JSON.parse(args); - return parsed?.text || ''; - } catch (e) { - // Partial JSON - use extraction function - return extractTextFromPartialJson(args); - } - } else if (typeof args === 'object' && args !== null) { - return args.text || ''; - } - - return ''; -} - -/** - * Find ask/complete tool call in a list of tool calls - * - * @param toolCalls - Array of tool calls from metadata - * @returns The ask/complete tool call, or undefined - */ -export function findAskOrCompleteTool(toolCalls: StreamingToolCall[] | undefined): StreamingToolCall | undefined { - if (!toolCalls || !Array.isArray(toolCalls)) return undefined; - - return toolCalls.find(tc => isAskOrCompleteTool(tc.function_name)); -} - -/** - * Extract streaming ask/complete text from a tool call message - * This is the main function to use for rendering streaming ask/complete content - * - * @param toolCalls - Array of tool calls from metadata - * @returns Object with toolType and text, or null if not ask/complete - */ -export function extractStreamingAskCompleteContent( - toolCalls: StreamingToolCall[] | undefined -): { toolType: 'ask' | 'complete'; text: string } | null { - const askOrCompleteTool = findAskOrCompleteTool(toolCalls); - if (!askOrCompleteTool) return null; - - const toolType = getAskCompleteToolType(askOrCompleteTool.function_name); - if (!toolType) return null; - - const text = extractTextFromArguments(askOrCompleteTool.arguments); - - return { toolType, text }; -} - -/** - * Check if a streaming message should skip rendering - * Returns true if the last complete message already has the ask/complete content - * - * @param lastMessageMetadata - Metadata from the last complete message - * @returns true if streaming render should be skipped - */ -export function shouldSkipStreamingRender(lastMessageMetadata: StreamingMetadata | undefined): boolean { - if (!lastMessageMetadata) return false; - - const toolCalls = lastMessageMetadata.tool_calls || []; - const hasAskOrComplete = toolCalls.some(tc => isAskOrCompleteTool(tc.function_name)); - const isComplete = lastMessageMetadata.stream_status === 'complete'; - - return hasAskOrComplete && isComplete; -} - diff --git a/package.json b/package.json new file mode 100644 index 0000000000..973c4475d6 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "name": "agentpress", + "private": true, + "scripts": { + "dev:frontend": "pnpm --filter Kortix dev", + "dev:mobile": "pnpm --filter kortix dev", + "build:frontend": "pnpm --filter Kortix build" + } +} + diff --git a/packages/shared/README.md b/packages/shared/README.md new file mode 100644 index 0000000000..fbd2c3b18f --- /dev/null +++ b/packages/shared/README.md @@ -0,0 +1,179 @@ +# @agentpress/shared + +Shared TypeScript code for AgentPress frontend (Next.js) and mobile (React Native) applications. + +## Overview + +This package contains platform-agnostic code that is used by both the web frontend and mobile app: + +- **Types**: Core message types, streaming types, and interfaces +- **Streaming Utils**: Functions for parsing streaming tool calls and extracting text +- **Tool Utils**: Display names, icon keys, and formatting for tool calls +- **General Utils**: JSON parsing, message grouping + +## Installation + +This package uses workspace dependencies. In the consuming app's `package.json`: + +```json +{ + "dependencies": { + "@agentpress/shared": "workspace:*" + } +} +``` + +## Usage + +### Types + +```typescript +import type { + UnifiedMessage, + ParsedContent, + ParsedMetadata, + MessageGroup +} from '@agentpress/shared/types'; +``` + +### Streaming Utilities + +```typescript +import { + extractTextFromPartialJson, + extractTextFromStreamingAskComplete, + isAskOrCompleteTool, + findAskOrCompleteTool, + extractStreamingAskCompleteContent +} from '@agentpress/shared/streaming'; + +// Extract text from partial JSON during streaming +const text = extractTextFromPartialJson('{"text": "Hello wor'); +// Returns: "Hello wor" + +// Check if a tool is ask/complete +if (isAskOrCompleteTool('ask')) { + // Handle ask tool +} +``` + +### Tool Utilities + +```typescript +import { + getUserFriendlyToolName, + getToolIconKey, + TOOL_DISPLAY_NAMES, + HIDE_STREAMING_XML_TAGS +} from '@agentpress/shared/tools'; + +// Get display name +const name = getUserFriendlyToolName('execute-command'); +// Returns: "Executing Command" + +// Get icon key (platform-agnostic) +const iconKey = getToolIconKey('web-search'); +// Returns: "globe" +``` + +### Icon Resolution (Platform-Specific) + +The shared package provides icon **keys** (strings), not actual icon components. Each platform resolves these keys: + +**Frontend (lucide-react):** +```typescript +import { getToolIconKey } from '@agentpress/shared/tools'; +import { Globe, FileEdit, Terminal, Wrench } from 'lucide-react'; + +const ICON_MAP = { + 'globe': Globe, + 'file-edit': FileEdit, + 'terminal': Terminal, + // ... +}; + +export function getToolIcon(toolName: string) { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} +``` + +**Mobile (lucide-react-native):** +```typescript +import { getToolIconKey } from '@agentpress/shared/tools'; +import { Globe, FileEdit, Terminal, Wrench } from 'lucide-react-native'; + +const ICON_MAP = { + 'globe': Globe, + 'file-edit': FileEdit, + 'terminal': Terminal, + // ... +}; + +export function getToolIcon(toolName: string) { + const key = getToolIconKey(toolName); + return ICON_MAP[key] ?? Wrench; +} +``` + +### General Utilities + +```typescript +import { + safeJsonParse, + groupMessages, + getFirstMessage, + getLastMessage +} from '@agentpress/shared/utils'; + +// Parse JSON safely +const data = safeJsonParse(jsonString, { default: 'value' }); + +// Group messages for rendering +const groups = groupMessages(messages); +``` + +## Package Structure + +``` +packages/shared/ +├── src/ +│ ├── index.ts # Main entry point +│ ├── types/ +│ │ ├── index.ts +│ │ ├── messages.ts # UnifiedMessage, ParsedContent, etc. +│ │ └── streaming.ts # StreamingToolCall, etc. +│ ├── streaming/ +│ │ ├── index.ts +│ │ └── utils.ts # extractTextFromPartialJson, etc. +│ ├── tools/ +│ │ ├── index.ts +│ │ ├── display-names.ts # TOOL_DISPLAY_NAMES map +│ │ ├── icon-keys.ts # getToolIconKey (string keys) +│ │ └── formatter.ts # getUserFriendlyToolName +│ └── utils/ +│ ├── index.ts +│ ├── json.ts # safeJsonParse +│ └── grouping.ts # groupMessages +├── package.json +├── tsconfig.json +└── README.md +``` + +## Development + +```bash +# Type check +pnpm run typecheck +``` + +## What's NOT in This Package + +Platform-specific code stays in each app: + +- **Icon components** - Different libraries (lucide-react vs lucide-react-native) +- **React hooks** - useSmoothText, useMessages, etc. +- **UI components** - Different rendering for web vs native +- **API calls** - Different fetch implementations +- **Navigation** - Next.js router vs React Navigation + diff --git a/packages/shared/node_modules/.bin/tsc b/packages/shared/node_modules/.bin/tsc new file mode 100755 index 0000000000..4c101eefc7 --- /dev/null +++ b/packages/shared/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + exec node "$basedir/../typescript/bin/tsc" "$@" +fi diff --git a/packages/shared/node_modules/.bin/tsserver b/packages/shared/node_modules/.bin/tsserver new file mode 100755 index 0000000000..d0bf3ff4ba --- /dev/null +++ b/packages/shared/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" +else + exec node "$basedir/../typescript/bin/tsserver" "$@" +fi diff --git a/packages/shared/node_modules/typescript b/packages/shared/node_modules/typescript new file mode 120000 index 0000000000..949dba4e5a --- /dev/null +++ b/packages/shared/node_modules/typescript @@ -0,0 +1 @@ +../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript \ No newline at end of file diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 0000000000..6a1ed9f740 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,21 @@ +{ + "name": "@agentpress/shared", + "version": "1.0.0", + "private": true, + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts", + "./types": "./src/types/index.ts", + "./streaming": "./src/streaming/index.ts", + "./tools": "./src/tools/index.ts", + "./utils": "./src/utils/index.ts" + }, + "scripts": { + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "^5.0.0" + } +} + diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 0000000000..1289ada98c --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,26 @@ +/** + * @agentpress/shared + * + * Shared code between frontend (Next.js) and mobile (React Native) applications. + * This package contains platform-agnostic types, utilities, and business logic. + * + * @example + * // Import types + * import type { UnifiedMessage, ParsedContent } from '@agentpress/shared/types'; + * + * // Import streaming utilities + * import { extractTextFromPartialJson, isAskOrCompleteTool } from '@agentpress/shared/streaming'; + * + * // Import tool utilities + * import { getUserFriendlyToolName, getToolIconKey } from '@agentpress/shared/tools'; + * + * // Import general utilities + * import { safeJsonParse, groupMessages } from '@agentpress/shared/utils'; + */ + +// Re-export everything for convenience +export * from './types'; +export * from './streaming'; +export * from './tools'; +export * from './utils'; + diff --git a/packages/shared/src/streaming/index.ts b/packages/shared/src/streaming/index.ts new file mode 100644 index 0000000000..abdcd28378 --- /dev/null +++ b/packages/shared/src/streaming/index.ts @@ -0,0 +1,9 @@ +/** + * Streaming utilities for real-time message handling + */ + +export * from './utils'; +export * from './tool-accumulator'; +export * from './text-ordering'; +export * from './message-handler'; + diff --git a/packages/shared/src/streaming/message-handler.ts b/packages/shared/src/streaming/message-handler.ts new file mode 100644 index 0000000000..932451a90a --- /dev/null +++ b/packages/shared/src/streaming/message-handler.ts @@ -0,0 +1,151 @@ +/** + * Stream message parsing and handling utilities + * Platform-agnostic message processing for streaming + */ + +import type { UnifiedMessage, ParsedContent, ParsedMetadata } from '../types'; +import { safeJsonParse } from '../utils'; +import type { ToolCallAccumulatorState, ReconstructedToolCall } from './tool-accumulator'; +import { accumulateToolCallDeltas, reconstructToolCalls, markToolCallCompleted } from './tool-accumulator'; + +/** + * Map backend agent status to frontend status string + */ +export function mapAgentStatus(backendStatus: string): string { + switch (backendStatus) { + case 'completed': + return 'completed'; + case 'stopped': + return 'stopped'; + case 'failed': + return 'failed'; + default: + return 'error'; + } +} + +/** + * Preprocess raw stream data (remove 'data: ' prefix if present) + */ +export function preprocessStreamData(rawData: string): string { + let processedData = rawData; + if (processedData.startsWith('data: ')) { + processedData = processedData.substring(6).trim(); + } + return processedData; +} + +/** + * Check if a message indicates stream completion + */ +export function isCompletionMessage(processedData: string): boolean { + return ( + (processedData.includes('"type": "status"') && + processedData.includes('"status": "completed"')) || + processedData.includes('Run data not available for streaming') || + processedData.includes('Stream ended with status: completed') || + processedData === '{"type": "status", "status": "completed", "message": "Worker run completed successfully"}' + ); +} + +/** + * Parse a streaming message from raw data + */ +export function parseStreamingMessage( + processedData: string +): UnifiedMessage | null { + if (!processedData) return null; + + const message = safeJsonParse(processedData, null) as UnifiedMessage | null; + if (!message) { + return null; + } + + return message; +} + +/** + * Handle assistant chunk message + * Returns the content string if it's a text chunk + */ +export function handleAssistantChunk( + message: UnifiedMessage, + parsedContent: ParsedContent, + parsedMetadata: ParsedMetadata +): string | null { + if ( + parsedMetadata.stream_status === 'chunk' && + parsedContent.content + ) { + return typeof parsedContent.content === 'string' + ? parsedContent.content + : String(parsedContent.content); + } + return null; +} + +/** + * Handle tool call chunk message + * Updates accumulator and returns reconstructed tool calls + */ +export function handleToolCallChunk( + message: UnifiedMessage, + parsedMetadata: ParsedMetadata, + accumulator: ToolCallAccumulatorState +): ReconstructedToolCall[] | null { + if (parsedMetadata.stream_status !== 'tool_call_chunk') { + return null; + } + + const toolCalls = parsedMetadata.tool_calls || []; + if (toolCalls.length === 0) { + return null; + } + + // Accumulate deltas from this chunk + accumulateToolCallDeltas(toolCalls, message.sequence ?? 0, accumulator); + + // Reconstruct all tool calls + return reconstructToolCalls(accumulator); +} + +/** + * Handle tool result message + * Marks tool as completed and returns updated reconstructed tool calls + */ +export function handleToolResult( + message: UnifiedMessage, + parsedMetadata: ParsedMetadata, + accumulator: ToolCallAccumulatorState +): ReconstructedToolCall[] | null { + const toolCallId = parsedMetadata.tool_call_id; + const functionName = parsedMetadata.function_name; + + if (!toolCallId || !functionName) { + return null; + } + + // Mark as completed and store result + markToolCallCompleted(toolCallId, message, accumulator); + + // Reconstruct all tool calls with updated completion status + return reconstructToolCalls(accumulator); +} + +/** + * Create updated message with reconstructed tool calls + */ +export function createMessageWithToolCalls( + originalMessage: UnifiedMessage, + parsedMetadata: ParsedMetadata, + reconstructedToolCalls: ReconstructedToolCall[] +): UnifiedMessage { + return { + ...originalMessage, + metadata: JSON.stringify({ + ...parsedMetadata, + tool_calls: reconstructedToolCalls, + }), + }; +} + diff --git a/packages/shared/src/streaming/text-ordering.ts b/packages/shared/src/streaming/text-ordering.ts new file mode 100644 index 0000000000..d47c565f19 --- /dev/null +++ b/packages/shared/src/streaming/text-ordering.ts @@ -0,0 +1,56 @@ +/** + * Text content ordering utilities for streaming messages + * Handles sequence-based ordering of text chunks + */ + +/** + * Text chunk with optional sequence number + */ +export interface TextChunk { + content: string; + sequence?: number; +} + +/** + * Check if chunks need sorting based on sequence numbers + */ +export function needsSorting(chunks: TextChunk[]): boolean { + if (chunks.length <= 1) return false; + + for (let i = 1; i < chunks.length; i++) { + const prevSeq = chunks[i - 1].sequence ?? 0; + const currSeq = chunks[i].sequence ?? 0; + if (currSeq < prevSeq) { + return true; + } + } + + return false; +} + +/** + * Order content chunks by sequence number and concatenate + * Optimized to avoid sorting if already in order + */ +export function orderContentBySequence(chunks: TextChunk[]): string { + if (chunks.length === 0) return ''; + + // Only sort if sequences are out of order (optimization) + if (!needsSorting(chunks)) { + // If already sorted, just concatenate + let result = ''; + for (let i = 0; i < chunks.length; i++) { + result += chunks[i].content; + } + return result; + } + + // Only sort if necessary + const sorted = chunks.slice().sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0)); + let result = ''; + for (let i = 0; i < sorted.length; i++) { + result += sorted[i].content; + } + return result; +} + diff --git a/packages/shared/src/streaming/tool-accumulator.ts b/packages/shared/src/streaming/tool-accumulator.ts new file mode 100644 index 0000000000..16f892e90b --- /dev/null +++ b/packages/shared/src/streaming/tool-accumulator.ts @@ -0,0 +1,191 @@ +/** + * Tool call delta accumulation utilities + * Handles streaming tool call deltas and reconstructs complete tool calls + */ + +import type { UnifiedMessage, ParsedMetadata, StreamingToolCall } from '../types'; +import { safeJsonParse } from '../utils'; + +/** + * Accumulated tool call structure for delta streaming + */ +export interface AccumulatedToolCall { + metadata: { + tool_call_id: string; + function_name: string; + index?: number; + [key: string]: any; + }; + chunks: Array<{ sequence: number; delta: string }>; +} + +/** + * Reconstructed tool call with merged arguments and completion status + */ +export interface ReconstructedToolCall { + tool_call_id: string; + function_name: string; + index?: number; + arguments: string; + is_delta: boolean; + completed: boolean; + tool_result?: any; +} + +/** + * Accumulator state for managing tool call deltas + */ +export interface ToolCallAccumulatorState { + accumulatedToolCalls: Map; + completedToolCallIds: Set; + toolResults: Map; +} + +/** + * Create a new accumulator state + */ +export function createAccumulatorState(): ToolCallAccumulatorState { + return { + accumulatedToolCalls: new Map(), + completedToolCallIds: new Set(), + toolResults: new Map(), + }; +} + +/** + * Process tool call deltas from a streaming message chunk + * Updates the accumulator with new deltas + */ +export function accumulateToolCallDeltas( + toolCalls: StreamingToolCall[], + sequence: number, + accumulator: ToolCallAccumulatorState +): void { + for (const tc of toolCalls) { + const toolCallId = tc.tool_call_id || 'unknown'; + + // Get or create the accumulated entry for this tool call + let accumulated = accumulator.accumulatedToolCalls.get(toolCallId); + if (!accumulated) { + accumulated = { + metadata: { + tool_call_id: tc.tool_call_id, + function_name: tc.function_name, + index: tc.index, + }, + chunks: [], + }; + accumulator.accumulatedToolCalls.set(toolCallId, accumulated); + } + + // Update metadata if we have newer info (function_name might come later) + if (tc.function_name) { + accumulated.metadata.function_name = tc.function_name; + } + if (tc.index !== undefined) { + accumulated.metadata.index = tc.index; + } + + if (tc.is_delta && tc.arguments_delta) { + // This is a delta update - store it with sequence number + const existingIndex = accumulated.chunks.findIndex(c => c.sequence === sequence); + if (existingIndex >= 0) { + accumulated.chunks[existingIndex].delta = tc.arguments_delta; + } else { + accumulated.chunks.push({ sequence, delta: tc.arguments_delta }); + } + // Sort chunks by sequence number + accumulated.chunks.sort((a, b) => a.sequence - b.sequence); + } else if (tc.arguments) { + // Full arguments (non-delta) - replace all chunks with single full argument + const argsStr = typeof tc.arguments === 'string' ? tc.arguments : JSON.stringify(tc.arguments); + accumulated.chunks = [{ sequence, delta: argsStr }]; + } + } +} + +/** + * Reconstruct all tool calls from the accumulator + * Merges streaming tool calls with completed tool results + */ +export function reconstructToolCalls( + accumulator: ToolCallAccumulatorState +): ReconstructedToolCall[] { + // Reconstruct accumulated tool calls + const allReconstructedToolCalls = Array.from(accumulator.accumulatedToolCalls.values()) + .sort((a, b) => (a.metadata.index ?? 0) - (b.metadata.index ?? 0)) + .map(accumulated => { + // Merge all chunks for this tool call + let mergedArgs = ''; + for (const chunk of accumulated.chunks) { + mergedArgs += chunk.delta; + } + + const toolCallId = accumulated.metadata.tool_call_id; + const isCompleted = accumulator.completedToolCallIds.has(toolCallId); + const toolResult = accumulator.toolResults.get(toolCallId); + + return { + tool_call_id: toolCallId, + function_name: accumulated.metadata.function_name, + index: accumulated.metadata.index, + arguments: mergedArgs, + is_delta: false, // Mark as assembled + completed: isCompleted, + tool_result: toolResult + ? safeJsonParse(toolResult.metadata, {}).result + : undefined, + }; + }); + + // Also include completed tools that may have results but aren't in accumulated ref + // (edge case: result arrives before tool call is fully streamed) + accumulator.toolResults.forEach((resultMessage, toolCallId) => { + if (!accumulator.accumulatedToolCalls.has(toolCallId)) { + const toolMetadata = safeJsonParse(resultMessage.metadata, {}); + const functionName = toolMetadata.function_name; + if (functionName) { + // Add to reconstructed calls if not already present + const existing = allReconstructedToolCalls.find(tc => tc.tool_call_id === toolCallId); + if (!existing) { + allReconstructedToolCalls.push({ + tool_call_id: toolCallId, + function_name: functionName, + index: toolMetadata.index, + arguments: '{}', + is_delta: false, + completed: true, + tool_result: toolMetadata.result, + }); + } + } + } + }); + + // Re-sort after adding any missing completed tools + allReconstructedToolCalls.sort((a, b) => (a.index ?? 0) - (b.index ?? 0)); + + return allReconstructedToolCalls; +} + +/** + * Mark a tool call as completed and store its result + */ +export function markToolCallCompleted( + toolCallId: string, + resultMessage: UnifiedMessage, + accumulator: ToolCallAccumulatorState +): void { + accumulator.completedToolCallIds.add(toolCallId); + accumulator.toolResults.set(toolCallId, resultMessage); +} + +/** + * Clear all accumulator state + */ +export function clearAccumulator(accumulator: ToolCallAccumulatorState): void { + accumulator.accumulatedToolCalls.clear(); + accumulator.completedToolCallIds.clear(); + accumulator.toolResults.clear(); +} + diff --git a/apps/mobile/lib/utils/streaming-utils.ts b/packages/shared/src/streaming/utils.ts similarity index 93% rename from apps/mobile/lib/utils/streaming-utils.ts rename to packages/shared/src/streaming/utils.ts index c3b08a5c20..2ae4c67d73 100644 --- a/apps/mobile/lib/utils/streaming-utils.ts +++ b/packages/shared/src/streaming/utils.ts @@ -3,25 +3,7 @@ * These are portable and can be used in both web and mobile apps */ -/** - * Tool call data structure from metadata - */ -export interface StreamingToolCall { - tool_call_id: string; - function_name: string; - arguments: Record | string; // Object when complete, string when partial - source: 'native' | 'xml'; -} - -/** - * Parsed metadata from streaming messages - */ -export interface StreamingMetadata { - stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; - thread_run_id?: string; - tool_calls?: StreamingToolCall[]; - [key: string]: any; -} +import type { StreamingToolCall, StreamingMetadata, AskCompleteContent } from '../types/streaming'; /** * Extract text value from a partial JSON string @@ -217,7 +199,7 @@ export function findAskOrCompleteTool(toolCalls: StreamingToolCall[] | undefined */ export function extractStreamingAskCompleteContent( toolCalls: StreamingToolCall[] | undefined -): { toolType: 'ask' | 'complete'; text: string } | null { +): AskCompleteContent | null { const askOrCompleteTool = findAskOrCompleteTool(toolCalls); if (!askOrCompleteTool) return null; diff --git a/packages/shared/src/tools/content-preprocessor.ts b/packages/shared/src/tools/content-preprocessor.ts new file mode 100644 index 0000000000..94de9a9467 --- /dev/null +++ b/packages/shared/src/tools/content-preprocessor.ts @@ -0,0 +1,138 @@ +/** + * Content preprocessing utilities + * Handles XML tag stripping and text-only tool extraction + */ + +import { HIDE_STREAMING_XML_TAGS } from './display-names'; + +/** + * Preprocess content to extract text from ask/complete tools + * Removes XML wrapper for text-only ask/complete calls (when no attachments) + */ +export function preprocessTextOnlyTools(content: string): string { + if (!content || typeof content !== 'string') { + return content || ''; + } + + // New format: ... + content = content.replace(/\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, (match) => { + if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, '$1'); + }); + + content = content.replace(/\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, (match) => { + if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, '$1'); + }); + + // Handle incomplete/streaming ask tags + content = content.replace(/\s*\s*([\s\S]*?)$/gi, (match) => { + if (match.includes('\s*\s*([\s\S]*?)$/gi, '$1'); + }); + + content = content.replace(/\s*\s*([\s\S]*?)$/gi, (match) => { + if (match.includes('\s*\s*([\s\S]*?)$/gi, '$1'); + }); + + // Old format: ... or ... + content = content.replace(/]*>([\s\S]*?)<\/ask>/gi, (match) => { + if (match.match(/]*attachments=/i)) return match; + return match.replace(/]*>([\s\S]*?)<\/ask>/gi, '$1'); + }); + + content = content.replace(/]*>([\s\S]*?)<\/complete>/gi, (match) => { + if (match.match(/]*attachments=/i)) return match; + return match.replace(/]*>([\s\S]*?)<\/complete>/gi, '$1'); + }); + + return content; +} + +/** + * Strip XML tags from content, preserving HTML tags + */ +export function stripXMLTags(content: string): string { + if (!content || typeof content !== 'string') return ''; + + let cleaned = content; + + // Remove function_calls wrapper + cleaned = cleaned.replace(/[\s\S]*?<\/function_calls>/gi, ''); + + // Remove tool XML tags but preserve HTML tags + const htmlTags = 'br|p|div|span|strong|em|ul|ol|li|a|code|pre|h[1-6]|blockquote|img'; + cleaned = cleaned.replace( + new RegExp(`<(?!${htmlTags})([a-zA-Z\\-_]+)(?:\\s+[^>]*)?>(?:[\\s\\S]*?)<\\/\\1>`, 'g'), + '' + ); + + // Remove self-closing tags (except br and img) + cleaned = cleaned.replace( + new RegExp(`<(?!br|img)([a-zA-Z\\-_]+)(?:\\s+[^>]*)?\\/>`, 'g'), + '' + ); + + // Normalize multiple newlines + return cleaned.replace(/\n\n\n+/g, '\n\n').trim(); +} + +/** + * Detect and strip partial XML from streaming content + * Returns content up to the first incomplete XML tag + */ +export function detectAndStripPartialXML(content: string): string { + if (!content || typeof content !== 'string') return content; + + // If we see a complete function_calls tag, strip everything from there + if (content.includes('')) { + const index = content.indexOf(''); + return content.substring(0, index).trim(); + } + + // Check for incomplete XML tags at the end + const partialXmlMatch = content.match(/<[a-zA-Z_:][a-zA-Z0-9_:]*$|<$/); + if (partialXmlMatch && partialXmlMatch.index !== undefined) { + return content.substring(0, partialXmlMatch.index).trim(); + } + + // Check for known streaming XML tags + for (const tag of HIDE_STREAMING_XML_TAGS) { + const openingTagPattern = `<${tag}`; + const index = content.indexOf(openingTagPattern); + if (index !== -1) { + return content.substring(0, index).trim(); + } + } + + return content; +} + +/** + * Extract streaming content from XML tool call + * Looks for common parameter names (text, content, data, etc.) + */ +export function extractStreamingContent(content: string, toolName: string): string { + if (!content || typeof content !== 'string') return ''; + + const commonParams = ['text', 'content', 'data', 'config', 'description', 'prompt', 'command', 'file_contents']; + + for (const param of commonParams) { + const match = content.match(new RegExp(`([\\s\\S]*?)(<\\/parameter>|$)`, 'i')); + if (match && match[1]) { + return match[1].trim(); + } + } + + // Fallback: strip all XML tags + const cleaned = content + .replace(/]*>/gi, '') + .replace(/<\/function_calls>/gi, '') + .replace(/]*>/gi, '') + .replace(/<\/invoke>/gi, '') + .replace(/<\/?parameter[^>]*>/gi, ''); + + return cleaned.trim(); +} + diff --git a/packages/shared/src/tools/display-names.ts b/packages/shared/src/tools/display-names.ts new file mode 100644 index 0000000000..2f3a808a3e --- /dev/null +++ b/packages/shared/src/tools/display-names.ts @@ -0,0 +1,246 @@ +/** + * Tool display names - maps tool identifiers to human-readable names + * Single source of truth for both frontend and mobile + */ + +export const TOOL_DISPLAY_NAMES: ReadonlyMap = new Map([ + // Initialization + ['initialize-tools', 'Initializing Tools'], + ['initialize_tools', 'Initializing Tools'], + + // Command execution + ['execute-command', 'Executing Command'], + ['execute_command', 'Executing Command'], + ['check-command-output', 'Checking Command Output'], + ['check_command_output', 'Checking Command Output'], + ['terminate-command', 'Terminating Command'], + ['terminate_command', 'Terminating Command'], + ['list-commands', 'Listing Commands'], + ['list_commands', 'Listing Commands'], + + // File operations + ['create-file', 'Creating File'], + ['create_file', 'Creating File'], + ['delete-file', 'Deleting File'], + ['delete_file', 'Deleting File'], + ['full-file-rewrite', 'Rewriting File'], + ['full_file_rewrite', 'Rewriting File'], + ['str-replace', 'Editing Text'], + ['str_replace', 'Editing Text'], + ['edit-file', 'Editing File'], + ['edit_file', 'Editing File'], + ['read-file', 'Reading File'], + ['read_file', 'Reading File'], + ['upload-file', 'Uploading File'], + + // Document operations + ['create-document', 'Creating Document'], + ['update-document', 'Updating Document'], + ['read-document', 'Reading Document'], + ['list-documents', 'Listing Documents'], + ['delete-document', 'Deleting Document'], + ['parse-document', 'Parsing Document'], + ['parse_document', 'Parsing Document'], + + // Task operations + ['create-tasks', 'Creating Tasks'], + ['create_tasks', 'Creating Tasks'], + ['update-tasks', 'Updating Tasks'], + ['update_tasks', 'Updating Tasks'], + + // Browser operations + ['browser-navigate-to', 'Navigating to Page'], + ['browser_navigate_to', 'Navigating to Page'], + ['browser-act', 'Performing Action'], + ['browser_act', 'Performing Action'], + ['browser-extract-content', 'Extracting Content'], + ['browser_extract_content', 'Extracting Content'], + ['browser-screenshot', 'Taking Screenshot'], + ['browser_screenshot', 'Taking Screenshot'], + ['browser-click-element', 'Clicking Element'], + ['browser-close-tab', 'Closing Tab'], + ['browser-input-text', 'Inputting Text'], + ['browser-scroll-down', 'Scrolling Down'], + ['browser-scroll-up', 'Scrolling Up'], + ['browser-wait', 'Waiting'], + + // Data provider operations + ['execute-data-provider-call', 'Calling Data Provider'], + ['execute_data-provider_call', 'Calling Data Provider'], + ['get-data-provider-endpoints', 'Getting Endpoints'], + ['call-data-provider', 'Calling Data Provider'], + + // Core tools + ['ask', 'Ask'], + ['wait', 'Wait'], + ['complete', 'Completing Task'], + + // Web operations + ['crawl-webpage', 'Crawling Website'], + ['crawl_webpage', 'Crawling Website'], + ['scrape-webpage', 'Scraping Website'], + ['scrape_webpage', 'Scraping Website'], + ['web-search', 'Searching Web'], + ['web_search', 'Searching Web'], + ['image-search', 'Searching Images'], + ['image_search', 'Searching Images'], + + // Port operations + ['expose-port', 'Exposing Port'], + ['expose_port', 'Exposing Port'], + + // Image operations + ['load-image', 'Loading Image'], + ['load_image', 'Loading Image'], + ['clear-images-from-context', 'Clearing Images'], + ['image-edit-or-generate', 'Generate Media'], + ['image_edit_or_generate', 'Generate Media'], + ['designer-create-or-edit', 'Designing'], + + // Presentation operations + ['create-presentation', 'Creating Presentation'], + ['create-presentation-outline', 'Creating Presentation Outline'], + ['create_presentation_outline', 'Creating Presentation Outline'], + ['create-slide', 'Creating Slide'], + ['create_slide', 'Creating Slide'], + ['load-template-design', 'Loading Template Design'], + ['load_template_design', 'Loading Template Design'], + ['validate-slide', 'Validating Slide'], + ['validate_slide', 'Validating Slide'], + + // Spreadsheet operations + ['create-sheet', 'Creating Sheet'], + ['update-sheet', 'Updating Sheet'], + ['view-sheet', 'Viewing Sheet'], + ['analyze-sheet', 'Analyzing Sheet'], + ['visualize-sheet', 'Visualizing Sheet'], + ['format-sheet', 'Formatting Sheet'], + ['spreadsheet-create', 'Creating Spreadsheet'], + ['spreadsheet_create', 'Creating Spreadsheet'], + ['spreadsheet-add-sheet', 'Adding Sheet'], + ['spreadsheet_add_sheet', 'Adding Sheet'], + ['spreadsheet-batch-update', 'Updating Spreadsheet'], + ['spreadsheet_batch_update', 'Updating Spreadsheet'], + + // Agent/Worker operations + ['update-agent', 'Updating Worker'], + ['update_agent', 'Updating Worker'], + ['get-current-agent-config', 'Getting Worker Config'], + ['get_current_agent_config', 'Getting Worker Config'], + ['create-new-agent', 'Creating New Worker'], + + // MCP operations + ['search-mcp-servers', 'Searching MCP Servers'], + ['search_mcp_servers', 'Searching MCP Servers'], + ['get-mcp-server-tools', 'Getting MCP Server Tools'], + ['configure-mcp-server', 'Configuring MCP Server'], + ['get-popular-mcp-servers', 'Getting Popular MCP Servers'], + ['get_popular_mcp_servers', 'Getting Popular MCP Servers'], + ['test-mcp-server-connection', 'Testing MCP Server Connection'], + ['test_mcp_server_connection', 'Testing MCP Server Connection'], + ['discover-user-mcp-servers', 'Discovering Tools'], + ['search-mcp-servers-for-agent', 'Searching MCP Servers'], + ['discover-mcp-tools-for-agent', 'Discovering MCP Tools'], + + // Credential operations + ['create-credential-profile', 'Creating Profile'], + ['get-credential-profiles', 'Getting Profiles'], + ['configure-profile-for-agent', 'Adding Tools to Worker'], + ['create-credential-profile-for-agent', 'Creating Credential Profile'], + ['configure-agent-integration', 'Configuring Worker Integration'], + + // Trigger operations + ['list-app-event-triggers', 'Finding Event Triggers'], + ['list_app_event_triggers', 'Finding Event Triggers'], + ['create-event-trigger', 'Creating Event Trigger'], + ['create_event_trigger', 'Creating Event Trigger'], + ['create-agent-scheduled-trigger', 'Creating Scheduled Trigger'], + ['list-agent-scheduled-triggers', 'Listing Scheduled Triggers'], + + // Project operations + ['get-project-structure', 'Getting Project Structure'], + ['build-project', 'Building Project'], + + // Research operations + ['get-paper-details', 'Getting Paper Details'], + ['search-authors', 'Searching Authors'], + ['get-author-details', 'Getting Author Details'], + ['get-author-papers', 'Getting Author Papers'], + ['get-paper-citations', 'Getting Paper Citations'], + ['get-paper-references', 'Getting Paper References'], + ['paper-search', 'Searching for Papers'], + + // Phone/Call operations + ['make-phone-call', 'Making Phone Call'], + ['make_phone_call', 'Making Phone Call'], + ['end-call', 'Ending Call'], + ['end_call', 'Ending Call'], + ['get-call-details', 'Getting Call Details'], + ['get_call_details', 'Getting Call Details'], + ['list-calls', 'Listing Calls'], + ['list_calls', 'Listing Calls'], + ['monitor-call', 'Monitoring Call'], + ['monitor_call', 'Monitoring Call'], + ['wait-for-call-completion', 'Waiting for Completion'], + ['wait_for_call_completion', 'Waiting for Completion'], + + // Code execution + ['execute-code', 'Executing Code'], + ['execute_code', 'Executing Code'], +]); + +/** + * Tags to hide during streaming (show tool card instead of raw XML) + */ +export const HIDE_STREAMING_XML_TAGS: ReadonlySet = new Set([ + 'create-tasks', + 'execute-command', + 'create-file', + 'delete-file', + 'full-file-rewrite', + 'edit-file', + 'str-replace', + 'browser-click-element', + 'browser-close-tab', + 'browser-drag-drop', + 'browser-get-dropdown-options', + 'browser-go-back', + 'browser-input-text', + 'browser-navigate-to', + 'browser-scroll-down', + 'browser-scroll-to-text', + 'browser-scroll-up', + 'browser-select-dropdown-option', + 'browser-send-keys', + 'browser-switch-tab', + 'browser-wait', + 'ask', + 'complete', + 'crawl-webpage', + 'web-search', + 'load-image', +]); + +/** + * Tools that support streaming content display + * These tools show real-time content updates during execution + */ +export const STREAMABLE_TOOLS: ReadonlySet = new Set([ + 'create-tasks', + 'update-tasks', + 'execute-command', + 'create-file', + 'full-file-rewrite', + 'edit-file', + 'browser-navigate-to', + 'browser-input-text', + 'browser-click-element', + 'search-web', + 'crawl-website', + 'view-image', + 'expose-port', + 'get-agent-config', + 'search-mcp-servers', + 'create-credential-profile', +]); + diff --git a/packages/shared/src/tools/formatter.ts b/packages/shared/src/tools/formatter.ts new file mode 100644 index 0000000000..143ddb6867 --- /dev/null +++ b/packages/shared/src/tools/formatter.ts @@ -0,0 +1,171 @@ +/** + * Tool name formatting utilities + * Converts tool identifiers to human-readable display names + */ + +import { TOOL_DISPLAY_NAMES } from './display-names'; + +/** + * Server name mappings for MCP tools + */ +const MCP_SERVER_NAMES: Record = { + 'exa': 'Exa Search', + 'github': 'GitHub', + 'notion': 'Notion', + 'slack': 'Slack', + 'filesystem': 'File System', + 'memory': 'Memory', + 'anthropic': 'Anthropic', + 'openai': 'OpenAI', + 'composio': 'Composio', + 'langchain': 'LangChain', + 'llamaindex': 'LlamaIndex', +}; + +/** + * Known MCP server names for detection + */ +const KNOWN_MCP_SERVERS = new Set([ + 'exa', 'github', 'notion', 'slack', 'filesystem', + 'memory', 'anthropic', 'openai', 'composio', + 'langchain', 'llamaindex' +]); + +/** + * Format an MCP tool name for display + * Converts "mcp_serverName_toolName" to "Server Name: Tool Name" + * + * @param serverName - The MCP server name + * @param toolName - The tool name within the server + * @returns Formatted display name + */ +export function formatMCPToolName(serverName: string, toolName: string): string { + const formattedServerName = MCP_SERVER_NAMES[serverName.toLowerCase()] || + serverName.charAt(0).toUpperCase() + serverName.slice(1); + + let formattedToolName = toolName; + + if (toolName.includes('-')) { + formattedToolName = toolName + .split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + } else if (toolName.includes('_')) { + formattedToolName = toolName + .split('_') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + } else if (/[a-z][A-Z]/.test(toolName)) { + // camelCase to Title Case + formattedToolName = toolName + .replace(/([a-z])([A-Z])/g, '$1 $2') + .split(' ') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + } else { + formattedToolName = toolName.charAt(0).toUpperCase() + toolName.slice(1); + } + + return `${formattedServerName}: ${formattedToolName}`; +} + +/** + * Get a user-friendly display name for a tool + * + * @param toolName - The tool identifier (can be kebab-case, snake_case, or MCP format) + * @returns Human-readable display name + */ +export function getUserFriendlyToolName(toolName: string): string { + if (!toolName) return 'Unknown Tool'; + + // Handle MCP tools: mcp_serverName_toolName + if (toolName.startsWith('mcp_')) { + const parts = toolName.split('_'); + if (parts.length >= 3) { + const serverName = parts[1]; + const toolNamePart = parts.slice(2).join('_'); + return formatMCPToolName(serverName, toolNamePart); + } + } + + // Handle MCP tools in kebab-case: serverName-toolName (if not in display names map) + if (toolName.includes('-') && !TOOL_DISPLAY_NAMES.has(toolName)) { + const parts = toolName.split('-'); + if (parts.length >= 2) { + const serverName = parts[0]; + const toolNamePart = parts.slice(1).join('-'); + // Only format as MCP if it looks like an MCP tool + if (KNOWN_MCP_SERVERS.has(serverName.toLowerCase()) || serverName === serverName.toLowerCase()) { + return formatMCPToolName(serverName, toolNamePart); + } + } + } + + // Return mapped display name or the tool name itself + return TOOL_DISPLAY_NAMES.get(toolName) || toolName; +} + +/** + * Extract app slug from a Composio tool call + * + * @param toolCall - The tool call object + * @returns The app slug, or null if not found + */ +export function extractAppSlugFromToolCall(toolCall: any): string | null { + if (!toolCall) return null; + + // Check for explicit app filter + if (toolCall._app_filter) { + const filter = toolCall._app_filter; + const appName = filter.split(' ')[0].toLowerCase(); + if (appName) return appName; + } + + // Check for Composio custom type + if (toolCall.custom_type === 'composio' || toolCall.customType === 'composio' || toolCall.isComposio) { + const slug = toolCall.toolkit_slug || toolCall.toolkitSlug || toolCall.config?.toolkit_slug; + if (slug) return slug; + } + + // Check qualified name + const qualifiedName = toolCall.mcp_qualified_name || toolCall.qualifiedName || toolCall.function_name; + if (qualifiedName && qualifiedName.startsWith('composio.')) { + return qualifiedName.substring(9); + } + + if (qualifiedName && qualifiedName.includes('_COMPOSIO_')) { + const parts = qualifiedName.split('_COMPOSIO_'); + if (parts.length > 1) { + return parts[1].split('_')[0]; + } + } + + // Check function name for known apps + if (toolCall.function_name) { + const functionName = toolCall.function_name; + + const knownApps = [ + 'TWITTER', 'GITHUB', 'SLACK', 'GMAIL', 'GOOGLE', 'NOTION', 'ASANA', 'JIRA', + 'TRELLO', 'DISCORD', 'LINKEDIN', 'FACEBOOK', 'INSTAGRAM', 'YOUTUBE', 'SPOTIFY', + 'DROPBOX', 'ONEDRIVE', 'SALESFORCE', 'HUBSPOT', 'ZENDESK', 'INTERCOM', 'MAILCHIMP', + 'STRIPE', 'PAYPAL', 'TWILIO', 'SENDGRID', 'AIRTABLE', 'MONDAY', 'CLICKUP', + 'FIGMA', 'MIRO', 'SHOPIFY', 'WOOCOMMERCE', 'WORDPRESS', 'MEDIUM', 'REDDIT', + 'TELEGRAM', 'WHATSAPP', 'ZOOM', 'CALENDAR', 'DRIVE', 'SHEETS', 'DOCS', 'SLIDES' + ]; + + for (const app of knownApps) { + if (functionName.startsWith(app + '_')) { + return app.toLowerCase(); + } + } + + // Check if function name starts with an uppercase word (likely app name) + const parts = functionName.split('_'); + if (parts.length >= 2 && parts[0].length > 0 && parts[0] === parts[0].toUpperCase()) { + return parts[0].toLowerCase(); + } + } + + return null; +} + diff --git a/packages/shared/src/tools/icon-keys.ts b/packages/shared/src/tools/icon-keys.ts new file mode 100644 index 0000000000..a9e78fd23f --- /dev/null +++ b/packages/shared/src/tools/icon-keys.ts @@ -0,0 +1,237 @@ +/** + * Tool icon key mapping - platform-agnostic icon identifiers + * Each platform (web/mobile) maps these keys to actual icon components + */ + +/** + * Icon key type - these are the canonical icon identifiers + * Each platform must provide icon components for these keys + */ +export type ToolIconKey = + | 'globe' + | 'file-edit' + | 'file-search' + | 'file-plus' + | 'file-text' + | 'file-x' + | 'list' + | 'list-todo' + | 'terminal' + | 'computer' + | 'search' + | 'external-link' + | 'network' + | 'table' + | 'code' + | 'phone' + | 'phone-off' + | 'message-question' + | 'check-circle' + | 'wrench' + | 'book-open' + | 'plug' + | 'clock' + | 'presentation' + | 'image' + | 'pencil' + | 'hammer'; + +/** + * Get the icon key for a tool name + * This is platform-agnostic - each platform resolves the key to an actual icon component + * + * @param toolName - The tool name (can be kebab-case or snake_case) + * @returns The icon key to use + */ +export function getToolIconKey(toolName: string | undefined): ToolIconKey { + if (!toolName) return 'wrench'; + + const normalized = toolName.toLowerCase(); + + switch (normalized) { + // Initialization + case 'initialize-tools': + case 'initialize_tools': + return 'hammer'; + + // Browser operations + case 'browser-navigate-to': + case 'browser-act': + case 'browser-extract-content': + case 'browser-screenshot': + case 'browser_navigate_to': + case 'browser_act': + case 'browser_extract_content': + case 'browser_screenshot': + case 'crawl-webpage': + case 'crawl_webpage': + case 'scrape-webpage': + case 'scrape_webpage': + return 'globe'; + + // Web search + case 'web-search': + case 'web_search': + return 'globe'; + + case 'image-search': + case 'image_search': + return 'image'; + + // File operations + case 'create-file': + case 'create_file': + case 'edit-file': + case 'edit_file': + return 'file-edit'; + + case 'str-replace': + case 'str_replace': + return 'file-search'; + + case 'full-file-rewrite': + case 'full_file_rewrite': + return 'file-plus'; + + case 'read-file': + case 'read_file': + case 'parse-document': + case 'parse_document': + case 'read-document': + case 'read_document': + return 'file-text'; + + case 'delete-file': + case 'delete_file': + return 'file-x'; + + // Design tools + case 'designer-create-or-edit': + case 'image-edit-or-generate': + return 'pencil'; + + // Task operations + case 'create-tasks': + case 'create_tasks': + return 'list'; + + case 'update-tasks': + case 'update_tasks': + return 'list-todo'; + + // Command operations + case 'execute-command': + case 'execute_command': + case 'check-command-output': + case 'check_command_output': + case 'terminate-command': + case 'terminate_command': + case 'list-commands': + case 'list_commands': + return 'terminal'; + + // Port operations + case 'expose-port': + case 'expose_port': + return 'computer'; + + // Search + case 'search-authors': + case 'paper-search': + return 'search'; + + // Spreadsheet operations + case 'create-sheet': + case 'create_sheet': + case 'update-sheet': + case 'update_sheet': + case 'view-sheet': + case 'view_sheet': + case 'analyze-sheet': + case 'analyze_sheet': + case 'visualize-sheet': + case 'visualize_sheet': + case 'format-sheet': + case 'format_sheet': + case 'spreadsheet-create': + case 'spreadsheet_create': + case 'spreadsheet-add-sheet': + case 'spreadsheet_add_sheet': + case 'spreadsheet-batch-update': + case 'spreadsheet_batch_update': + return 'table'; + + // Code execution + case 'execute-code': + case 'execute_code': + return 'code'; + + // Phone operations + case 'make-phone-call': + case 'make_phone_call': + case 'get-call-details': + case 'get_call_details': + case 'list-calls': + case 'list_calls': + case 'monitor-call': + case 'monitor_call': + return 'phone'; + + case 'end-call': + case 'end_call': + return 'phone-off'; + + case 'wait-for-call-completion': + case 'wait_for_call_completion': + return 'clock'; + + // User interaction + case 'ask': + return 'message-question'; + + // Task completion + case 'complete': + return 'check-circle'; + + // Presentation + case 'create-presentation-outline': + case 'create_presentation_outline': + case 'create-slide': + case 'create_slide': + case 'load-template-design': + case 'load_template_design': + case 'validate-slide': + case 'validate_slide': + return 'presentation'; + + // Research + case 'get-paper-details': + case 'get-author-details': + case 'get-author-papers': + case 'get-paper-citations': + case 'get-paper-references': + return 'book-open'; + + // MCP tools + default: + if (normalized.startsWith('mcp_')) { + const parts = normalized.split('_'); + if (parts.length >= 3) { + const serverName = parts[1]; + const toolNamePart = parts.slice(2).join('_'); + + if (toolNamePart.includes('search') || toolNamePart.includes('web')) { + return 'search'; + } else if (toolNamePart.includes('research') || toolNamePart.includes('paper')) { + return 'book-open'; + } else if (serverName === 'exa') { + return 'search'; + } + } + return 'plug'; + } + + return 'wrench'; + } +} + diff --git a/packages/shared/src/tools/index.ts b/packages/shared/src/tools/index.ts new file mode 100644 index 0000000000..69b89d42c7 --- /dev/null +++ b/packages/shared/src/tools/index.ts @@ -0,0 +1,11 @@ +/** + * Tool metadata and formatting utilities + */ + +export * from './display-names'; +export * from './icon-keys'; +export * from './formatter'; +export * from './parser'; +export * from './content-preprocessor'; +export * from './tool-call-utils'; + diff --git a/apps/mobile/lib/utils/tool-parser.ts b/packages/shared/src/tools/parser.ts similarity index 58% rename from apps/mobile/lib/utils/tool-parser.ts rename to packages/shared/src/tools/parser.ts index 4a3d949cb9..b81743ae2b 100644 --- a/apps/mobile/lib/utils/tool-parser.ts +++ b/packages/shared/src/tools/parser.ts @@ -1,21 +1,17 @@ /** - * Tool Parser Utility - * - * Parses tool execution messages from the backend into a structured format. + * Tool parsing utilities + * Parses tool execution messages from the backend into structured format * * NEW FORMAT (preferred): Parse from message.metadata - * - metadata.function_name - * - metadata.tool_call_id - * - metadata.result.output - * - metadata.result.success - * * LEGACY FORMAT (fallback): Parse from message.content - * - content contains { tool_execution: {...} } or { tool_name, parameters, result } */ -import { safeJsonParse } from './message-grouping'; -import type { UnifiedMessage } from '@/api/types'; +import type { UnifiedMessage, ParsedMetadata } from '../types'; +import { safeJsonParse } from '../utils'; +/** + * Parsed tool data structure + */ export interface ParsedToolData { toolName: string; functionName: string; @@ -28,6 +24,15 @@ export interface ParsedToolData { toolCallId?: string; } +/** + * Parsed XML tool call structure + */ +export interface ParsedXmlToolCall { + functionName: string; + parameters: Record; + rawXml: string; +} + interface ToolExecutionData { function_name?: string; xml_tag_name?: string; @@ -166,12 +171,9 @@ export function formatToolOutput(output: any, maxLength: number = 50): string { return str.length > maxLength ? `${str.substring(0, maxLength)}...` : str; } -export interface ParsedXmlToolCall { - functionName: string; - parameters: Record; - rawXml: string; -} - +/** + * Parse XML tool calls from content string + */ export function parseXmlToolCalls(content: string): ParsedXmlToolCall[] { const toolCalls: ParsedXmlToolCall[] = []; @@ -210,6 +212,9 @@ export function parseXmlToolCalls(content: string): ParsedXmlToolCall[] { return toolCalls; } +/** + * Parse a parameter value from XML (handles JSON, booleans, numbers, strings) + */ function parseParameterValue(value: string): any { const trimmed = value.trim(); @@ -217,6 +222,7 @@ function parseParameterValue(value: string): any { try { return JSON.parse(trimmed); } catch { + // Not valid JSON, continue } } @@ -231,145 +237,10 @@ function parseParameterValue(value: string): any { return value; } +/** + * Check if content uses the new XML format ( with ) + */ export function isNewXmlFormat(content: string): boolean { return /[\s\S]*\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, (match) => { - if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, '$1'); - }); - - content = content.replace(/\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, (match) => { - if (match.includes('\s*\s*([\s\S]*?)<\/parameter>\s*<\/invoke>\s*<\/function_calls>/gi, '$1'); - }); - - - content = content.replace(/\s*\s*([\s\S]*?)$/gi, (match) => { - if (match.includes('\s*\s*([\s\S]*?)$/gi, '$1'); - }); - - content = content.replace(/\s*\s*([\s\S]*?)$/gi, (match) => { - if (match.includes('\s*\s*([\s\S]*?)$/gi, '$1'); - }); - - - content = content.replace(/]*>([\s\S]*?)<\/ask>/gi, (match) => { - if (match.match(/]*attachments=/i)) return match; - return match.replace(/]*>([\s\S]*?)<\/ask>/gi, '$1'); - }); - - content = content.replace(/]*>([\s\S]*?)<\/complete>/gi, (match) => { - if (match.match(/]*attachments=/i)) return match; - return match.replace(/]*>([\s\S]*?)<\/complete>/gi, '$1'); - }); - return content; -} - -export const HIDE_STREAMING_XML_TAGS = [ - 'create-tasks', - 'execute-command', - 'create-file', - 'delete-file', - 'full-file-rewrite', - 'edit-file', - 'str-replace', - 'browser-click-element', - 'browser-close-tab', - 'browser-navigate-to', - 'browser-input-text', -]; - -export const STREAMABLE_TOOLS = new Set([ - 'create-tasks', - 'update-tasks', - 'execute-command', - 'create-file', - 'full-file-rewrite', - 'edit-file', - 'browser-navigate-to', - 'browser-input-text', - 'browser-click-element', - 'search-web', - 'crawl-website', - 'view-image', - 'expose-port', - 'get-agent-config', - 'search-mcp-servers', - 'create-credential-profile', -]); - -export function extractStreamingContent(content: string, toolName: string): string { - if (!content || typeof content !== 'string') return ''; - - const commonParams = ['text', 'content', 'data', 'config', 'description', 'prompt', 'command', 'file_contents']; - - for (const param of commonParams) { - const match = content.match(new RegExp(`([\\s\\S]*?)(<\\/parameter>|$)`, 'i')); - if (match && match[1]) { - return match[1].trim(); - } - } - - const cleaned = content - .replace(/]*>/gi, '') - .replace(/<\/function_calls>/gi, '') - .replace(/]*>/gi, '') - .replace(/<\/invoke>/gi, '') - .replace(/<\/?parameter[^>]*>/gi, ''); - - return cleaned.trim(); -} - -export function stripXMLTags(content: string): string { - if (!content || typeof content !== 'string') return ''; - - let cleaned = content; - - cleaned = cleaned.replace(/[\s\S]*?<\/function_calls>/gi, ''); - - const htmlTags = 'br|p|div|span|strong|em|ul|ol|li|a|code|pre|h[1-6]|blockquote|img'; - cleaned = cleaned.replace( - new RegExp(`<(?!${htmlTags})([a-zA-Z\\-_]+)(?:\\s+[^>]*)?>(?:[\\s\\S]*?)<\\/\\1>`, 'g'), - '' - ); - - cleaned = cleaned.replace( - new RegExp(`<(?!br|img)([a-zA-Z\\-_]+)(?:\\s+[^>]*)?\\/>`, 'g'), - '' - ); - - return cleaned.replace(/\n\n\n+/g, '\n\n').trim(); -} - -export function detectAndStripPartialXML(content: string): string { - if (!content || typeof content !== 'string') return content; - - if (content.includes('')) { - const index = content.indexOf(''); - return content.substring(0, index).trim(); - } - - const partialXmlMatch = content.match(/<[a-zA-Z_:][a-zA-Z0-9_:]*$|<$/); - if (partialXmlMatch && partialXmlMatch.index !== undefined) { - return content.substring(0, partialXmlMatch.index).trim(); - } - - for (const tag of HIDE_STREAMING_XML_TAGS) { - const openingTagPattern = `<${tag}`; - const index = content.indexOf(openingTagPattern); - if (index !== -1) { - return content.substring(0, index).trim(); - } - } - - return content; -} diff --git a/packages/shared/src/tools/tool-call-utils.ts b/packages/shared/src/tools/tool-call-utils.ts new file mode 100644 index 0000000000..b07acc9f90 --- /dev/null +++ b/packages/shared/src/tools/tool-call-utils.ts @@ -0,0 +1,217 @@ +/** + * Tool call parsing and display utilities + * Handles parsing tool call arguments and extracting display information + */ + +import type { StreamingToolCall } from '../types/streaming'; +import { safeJsonParse } from '../utils'; +import { getUserFriendlyToolName } from './formatter'; + +/** + * Tool result data structure from metadata + */ +export interface ToolResultData { + success: boolean; + output: any; + error?: string | null; + timestamp?: string; +} + +/** + * Parsed tool call data for display + */ +export interface ParsedToolCallData { + toolCallId: string; + functionName: string; + displayName: string; + source: 'native' | 'xml'; + arguments: Record; + // Common argument extractions + filePath?: string; + command?: string; + query?: string; + url?: string; + text?: string; +} + +/** + * Tool category type + */ +export type ToolCategory = 'file' | 'command' | 'web' | 'communication' | 'other'; + +/** + * Parse tool call arguments from string or object + * Handles partial JSON during streaming + * + * @param args - Arguments (string JSON or object) + * @returns Parsed arguments object + */ +export function parseToolCallArguments(args: string | Record | undefined | null): Record { + if (!args) return {}; + + if (typeof args === 'string') { + try { + const parsed = JSON.parse(args); + return typeof parsed === 'object' && parsed !== null ? parsed : {}; + } catch { + // Partial JSON during streaming - return empty + return {}; + } + } + + if (typeof args === 'object' && args !== null) { + return args; + } + + return {}; +} + +/** + * Normalize tool name to consistent format (kebab-case lowercase) + * + * @param functionName - The raw function name + * @returns Normalized name + */ +export function normalizeToolName(functionName: string): string { + if (!functionName) return ''; + return functionName.replace(/_/g, '-').toLowerCase(); +} + +/** + * Extract common display parameters from tool arguments + * Used for showing context in tool call buttons + * + * @param args - Parsed arguments object + * @returns Primary display value (file path, command, query, etc.) + */ +export function getToolDisplayParam(args: Record): string { + // Priority order for display + return ( + args.file_path || + args.path || + args.target_file || + args.command || + args.query || + args.url || + args.session_name || + '' + ); +} + +/** + * Parse a streaming tool call into display-ready data + * + * @param toolCall - The streaming tool call from metadata + * @returns Parsed tool call data for display + */ +export function parseToolCallForDisplay(toolCall: StreamingToolCall): ParsedToolCallData { + const args = parseToolCallArguments(toolCall.arguments); + + return { + toolCallId: toolCall.tool_call_id, + functionName: toolCall.function_name, + displayName: getUserFriendlyToolName(toolCall.function_name), + source: toolCall.source, + arguments: args, + filePath: args.file_path || args.path || args.target_file, + command: args.command, + query: args.query, + url: args.url, + text: args.text, + }; +} + +/** + * Extract all tool calls from metadata and parse them + * + * @param metadata - The message metadata (string or parsed object) + * @returns Array of parsed tool call data + */ +export function extractAndParseToolCalls( + metadata: string | Record | undefined | null +): ParsedToolCallData[] { + if (!metadata) return []; + + const parsed = typeof metadata === 'string' + ? safeJsonParse>(metadata, {}) + : metadata; + + const toolCalls = parsed.tool_calls as StreamingToolCall[] | undefined; + if (!toolCalls || !Array.isArray(toolCalls)) return []; + + return toolCalls.map(parseToolCallForDisplay); +} + +/** + * Check if a tool call is a file operation + * + * @param functionName - The function name + * @returns true if it's a file operation tool + */ +export function isFileOperationTool(functionName: string): boolean { + const name = normalizeToolName(functionName); + const fileTools = [ + 'read-file', + 'write-file', + 'create-file', + 'edit-file', + 'str-replace-editor', + 'delete-file', + 'list-dir', + 'list-files', + ]; + return fileTools.includes(name); +} + +/** + * Check if a tool call is a command execution + * + * @param functionName - The function name + * @returns true if it's a command execution tool + */ +export function isCommandTool(functionName: string): boolean { + const name = normalizeToolName(functionName); + const commandTools = [ + 'execute-command', + 'run-command', + 'shell', + 'terminal', + ]; + return commandTools.includes(name); +} + +/** + * Check if a tool call is a web/browser operation + * + * @param functionName - The function name + * @returns true if it's a web operation tool + */ +export function isWebTool(functionName: string): boolean { + const name = normalizeToolName(functionName); + const webTools = [ + 'web-search', + 'web-scrape', + 'browse-web', + 'browser', + 'screenshot', + ]; + return webTools.includes(name); +} + +/** + * Get the category of a tool call + * + * @param functionName - The function name + * @returns Tool category + */ +export function getToolCategory(functionName: string): ToolCategory { + const name = normalizeToolName(functionName); + + if (name === 'ask' || name === 'complete') return 'communication'; + if (isFileOperationTool(functionName)) return 'file'; + if (isCommandTool(functionName)) return 'command'; + if (isWebTool(functionName)) return 'web'; + + return 'other'; +} + diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts new file mode 100644 index 0000000000..4ea913f794 --- /dev/null +++ b/packages/shared/src/types/index.ts @@ -0,0 +1,8 @@ +/** + * Shared types for AgentPress + * Used by both frontend (Next.js) and mobile (React Native) + */ + +export * from './messages'; +export * from './streaming'; + diff --git a/packages/shared/src/types/messages.ts b/packages/shared/src/types/messages.ts new file mode 100644 index 0000000000..d4f2210154 --- /dev/null +++ b/packages/shared/src/types/messages.ts @@ -0,0 +1,155 @@ +/** + * Core message types matching backend schema + * Single source of truth for both frontend and mobile + */ + +/** + * Unified Message Interface matching the backend/database schema + * Used for all message types in the thread + */ +export interface UnifiedMessage { + /** Unique message ID, null for transient stream chunks */ + message_id: string | null; + /** Thread this message belongs to */ + thread_id: string; + /** Message type */ + type: + | 'user' + | 'assistant' + | 'tool' + | 'system' + | 'status' + | 'browser_state' + | 'image_context' + | 'llm_response_end' + | 'llm_response_start'; + /** Whether this message is from the LLM */ + is_llm_message: boolean; + /** JSON string containing the message content */ + content: string; + /** JSON string containing message metadata */ + metadata: string; + /** ISO timestamp string */ + created_at: string; + /** ISO timestamp string */ + updated_at: string; + /** ID of the agent associated with this message */ + agent_id?: string; + /** Sequence number for ordering */ + sequence?: number; + /** Sandbox ID for file access */ + sandbox_id?: string; + /** Agent information from join (optional) */ + agents?: { name: string }; +} + +/** + * Parsed content structure from message.content JSON string + * Structure depends on message.type + */ +export interface ParsedContent { + /** Message role */ + role?: 'user' | 'assistant' | 'tool' | 'system'; + /** Actual content - can be string, object, etc. after parsing */ + content?: any; + /** Native tool calls */ + tool_calls?: any[]; + /** Tool call ID for tool results */ + tool_call_id?: string; + /** Tool name for tool results */ + name?: string; + /** Status type for status messages */ + status_type?: string; + /** Function name for tools */ + function_name?: string; + /** XML tag name for tool */ + xml_tag_name?: string; + /** Tool arguments */ + arguments?: any; + /** Index of tool in sequence */ + tool_index?: number; + /** Tool result */ + result?: any; + /** Tool execution error flag */ + is_error?: boolean; + /** Error/status message text */ + message?: string; + /** Usage stats for llm_response_end messages */ + usage?: { + prompt_tokens?: number; + completion_tokens?: number; + total_tokens?: number; + cache_read_tokens?: number; + cache_creation_tokens?: number; + }; + /** Allow other properties */ + [key: string]: any; +} + +/** + * Parsed metadata structure from message.metadata JSON string + */ +export interface ParsedMetadata { + /** Streaming status for assistant messages */ + stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; + /** Thread run ID */ + thread_run_id?: string; + /** LLM response ID */ + llm_response_id?: string; + /** Tool index */ + tool_index?: number; + /** Link tool results/statuses back to assistant message */ + assistant_message_id?: string; + /** Link status to tool result */ + linked_tool_result_message_id?: string; + /** Tool calls array - new format, directly in metadata */ + tool_calls?: Array<{ + tool_call_id: string; + function_name: string; + /** Can be string (partial JSON during streaming) or object (complete) */ + arguments: Record | string; + source: 'native' | 'xml'; + /** Whether this is a delta update */ + is_delta?: boolean; + /** Delta string for streaming */ + arguments_delta?: string; + /** Index in the tool call sequence */ + index?: number; + /** Whether this tool call is completed */ + completed?: boolean; + /** Tool result if completed */ + tool_result?: any; + }>; + /** Text content */ + text_content?: string; + /** Function name - stored directly in metadata, not in result */ + function_name?: string; + /** Tool result */ + result?: { + success: boolean; + output: any; + error?: string | null; + }; + /** Return format for tool calls */ + return_format?: 'native' | 'xml'; + /** Tool call ID */ + tool_call_id?: string; + /** Allow other properties */ + [key: string]: any; +} + +/** + * Message group for rendering + * Groups consecutive assistant+tool messages together + */ +export interface MessageGroup { + type: 'user' | 'assistant_group'; + messages: UnifiedMessage[]; + key: string; +} + +/** + * Agent status for UI state + */ +export type AgentStatus = 'idle' | 'running' | 'connecting' | 'error'; + diff --git a/packages/shared/src/types/streaming.ts b/packages/shared/src/types/streaming.ts new file mode 100644 index 0000000000..7c79575d80 --- /dev/null +++ b/packages/shared/src/types/streaming.ts @@ -0,0 +1,43 @@ +/** + * Streaming-specific types for real-time message handling + */ + +/** + * Tool call data structure from metadata during streaming + */ +export interface StreamingToolCall { + tool_call_id: string; + function_name: string; + /** Object when complete, string when partial/streaming */ + arguments: Record | string; + source: 'native' | 'xml'; + /** Whether this is a delta update */ + is_delta?: boolean; + /** Delta string for streaming */ + arguments_delta?: string; + /** Index in the tool call sequence */ + index?: number; + /** Whether this tool call is completed */ + completed?: boolean; + /** Tool result if completed */ + tool_result?: any; +} + +/** + * Parsed metadata from streaming messages + */ +export interface StreamingMetadata { + stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; + thread_run_id?: string; + tool_calls?: StreamingToolCall[]; + [key: string]: any; +} + +/** + * Extracted ask/complete content from streaming + */ +export interface AskCompleteContent { + toolType: 'ask' | 'complete'; + text: string; +} + diff --git a/packages/shared/src/utils/grouping.ts b/packages/shared/src/utils/grouping.ts new file mode 100644 index 0000000000..4445c68d8f --- /dev/null +++ b/packages/shared/src/utils/grouping.ts @@ -0,0 +1,234 @@ +/** + * Message grouping utilities for thread rendering + */ + +import type { UnifiedMessage, MessageGroup } from '../types/messages'; + +/** + * Options for grouping messages with streaming content + */ +export interface GroupingOptions { + /** Streaming text content to inject */ + streamingTextContent?: string; + /** Streaming tool call message to inject */ + streamingToolCall?: UnifiedMessage | null; + /** Whether in read-only/playback mode */ + readOnly?: boolean; + /** Playback streaming text */ + streamingText?: string; + /** Whether playback streaming text is active */ + isStreamingText?: boolean; +} + +/** + * Group messages for display: + * - User messages: standalone + * - Assistant + following tools: grouped together + * - Consecutive assistant+tool sequences: merged into one group + * + * Example: + * [user, assistant, tool, tool, user, assistant, tool] + * → [user], [assistant+tool+tool], [user], [assistant+tool] + * + * @param messages - Array of unified messages to group + * @returns Array of message groups for rendering + */ +export function groupMessages(messages: UnifiedMessage[]): MessageGroup[] { + const groups: MessageGroup[] = []; + let currentAssistantGroup: UnifiedMessage[] | null = null; + let assistantGroupCounter = 0; + + messages.forEach((message, index) => { + const key = message.message_id || `msg-${index}`; + + if (message.type === 'user') { + // Finalize any existing assistant group + if (currentAssistantGroup && currentAssistantGroup.length > 0) { + assistantGroupCounter++; + groups.push({ + type: 'assistant_group', + messages: currentAssistantGroup, + key: `assistant-group-${assistantGroupCounter}`, + }); + currentAssistantGroup = null; + } + + // Add standalone user message - wrap in array for consistency + groups.push({ + type: 'user', + messages: [message], + key, + }); + } else if (message.type === 'assistant' || message.type === 'tool' || message.type === 'browser_state') { + // Check if we can add to existing assistant group (same agent) + const canAddToExistingGroup = currentAssistantGroup !== null && (() => { + // For assistant messages, check if agent matches + if (message.type === 'assistant') { + const lastAssistantMsg = currentAssistantGroup!.findLast(m => m.type === 'assistant'); + if (!lastAssistantMsg) return true; // No assistant message yet, can add + + // Compare agent info - both null/undefined should be treated as same (default agent) + const currentAgentId = message.agent_id; + const lastAgentId = lastAssistantMsg.agent_id; + return currentAgentId === lastAgentId; + } + // For tool/browser_state messages, always add to current group + return true; + })(); + + if (canAddToExistingGroup) { + // Add to existing assistant group + currentAssistantGroup!.push(message); + } else { + // Finalize any existing group + if (currentAssistantGroup && currentAssistantGroup.length > 0) { + assistantGroupCounter++; + groups.push({ + type: 'assistant_group', + messages: currentAssistantGroup, + key: `assistant-group-${assistantGroupCounter}`, + }); + } + + // Create a new assistant group + currentAssistantGroup = [message]; + } + } + // Skip 'status', 'system', and other types for now + }); + + // Finalize any remaining assistant group + if (currentAssistantGroup !== null && currentAssistantGroup.length > 0) { + assistantGroupCounter++; + groups.push({ + type: 'assistant_group', + messages: currentAssistantGroup, + key: `assistant-group-${assistantGroupCounter}`, + }); + } + + return groups; +} + +/** + * Group messages with streaming content injection + * Extends base grouping to handle streaming text and tool calls + * + * @param messages - Array of unified messages to group + * @param options - Streaming options for content injection + * @returns Array of message groups with streaming content injected + */ +export function groupMessagesWithStreaming( + messages: UnifiedMessage[], + options?: GroupingOptions +): MessageGroup[] { + const { + streamingTextContent, + streamingToolCall, + readOnly = false, + streamingText, + isStreamingText = false, + } = options || {}; + + // Start with base grouping + const baseGroups = groupMessages(messages); + const mergedGroups = [...baseGroups]; + let assistantGroupCounter = mergedGroups.length; + + // Helper to create a streaming assistant message + const createStreamingMessage = (content: string, messageId: string): UnifiedMessage => ({ + content, + type: 'assistant', + message_id: messageId, + metadata: messageId, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + is_llm_message: true, + thread_id: messageId, + sequence: Infinity, + }); + + // Inject streaming text content + if (streamingTextContent) { + const lastGroup = mergedGroups.at(-1); + if (!lastGroup || lastGroup.type === 'user') { + // Create new assistant group for streaming text + mergedGroups.push({ + type: 'assistant_group', + messages: [createStreamingMessage(streamingTextContent, 'streamingTextContent')], + key: `streaming-group-text`, + }); + } else if (lastGroup.type === 'assistant_group') { + // Add to existing assistant group if not already present + const lastMessage = lastGroup.messages[lastGroup.messages.length - 1]; + if (lastMessage.message_id !== 'streamingTextContent') { + lastGroup.messages.push(createStreamingMessage(streamingTextContent, 'streamingTextContent')); + } + } + } + + // Handle streaming tool call (ensure there's a group to render in) + // This is needed because native tool calls have no text content, only metadata + if (streamingToolCall && !streamingTextContent) { + const lastGroup = mergedGroups.at(-1); + if (!lastGroup || lastGroup.type === 'user') { + // Create new empty assistant group so streaming tool call can render + assistantGroupCounter++; + mergedGroups.push({ + type: 'assistant_group', + messages: [], + key: `streaming-group-tool`, + }); + } + } + + // Handle playback streaming text (read-only mode) + if (readOnly && streamingText && isStreamingText) { + const lastGroup = mergedGroups.at(-1); + if (!lastGroup || lastGroup.type === 'user') { + mergedGroups.push({ + type: 'assistant_group', + messages: [createStreamingMessage(streamingText, 'playbackStreamingText')], + key: `streaming-group-playback`, + }); + } + } + + return mergedGroups; +} + +/** + * Get the first message from a message group + * Useful for extracting the primary message (e.g., user message or first assistant message) + * + * @param group - The message group + * @returns The first message, or undefined if group is empty + */ +export function getFirstMessage(group: MessageGroup): UnifiedMessage | undefined { + return group.messages[0]; +} + +/** + * Get the last message from a message group + * + * @param group - The message group + * @returns The last message, or undefined if group is empty + */ +export function getLastMessage(group: MessageGroup): UnifiedMessage | undefined { + return group.messages[group.messages.length - 1]; +} + +/** + * Filter messages by type within a group + * + * @param group - The message group + * @param type - The message type to filter for + * @returns Array of messages matching the type + */ +export function filterMessagesByType( + group: MessageGroup, + type: UnifiedMessage['type'] +): UnifiedMessage[] { + return group.messages.filter(m => m.type === type); +} + diff --git a/packages/shared/src/utils/index.ts b/packages/shared/src/utils/index.ts new file mode 100644 index 0000000000..3e6b0ad94d --- /dev/null +++ b/packages/shared/src/utils/index.ts @@ -0,0 +1,8 @@ +/** + * General utilities for data handling + */ + +export * from './json'; +export * from './grouping'; +export * from './normalizers'; + diff --git a/packages/shared/src/utils/json.ts b/packages/shared/src/utils/json.ts new file mode 100644 index 0000000000..659ef33548 --- /dev/null +++ b/packages/shared/src/utils/json.ts @@ -0,0 +1,92 @@ +/** + * JSON parsing utilities with robust error handling + */ + +/** + * Safely parse a JSON string with fallback value + * Handles: + * - null/undefined input + * - Pre-parsed objects (returns as-is) + * - Double-escaped JSON strings + * - Simple value strings (true, false, null, numbers) + * + * @param jsonString - The JSON string or object to parse + * @param defaultValue - Value to return if parsing fails + * @returns The parsed value or the default value + */ +export function safeJsonParse( + jsonString: string | Record | undefined | null, + defaultValue: T +): T { + if (jsonString === null || jsonString === undefined) { + return defaultValue; + } + + // Handle pre-parsed objects (from API) + if (typeof jsonString === 'object') { + return jsonString as T; + } + + // Handle non-string values + if (typeof jsonString !== 'string') { + return defaultValue; + } + + try { + // First attempt: Parse as normal JSON + const parsed = JSON.parse(jsonString); + + // Check if the result is a string that looks like JSON (double-escaped case) + if ( + typeof parsed === 'string' && + (parsed.startsWith('{') || parsed.startsWith('[')) + ) { + try { + // Second attempt: Parse the string result as JSON (handles double-escaped) + return JSON.parse(parsed) as T; + } catch { + // If inner parse fails, return the first parse result + return parsed as unknown as T; + } + } + + return parsed as T; + } catch { + // If the input is a simple string that should be returned as-is + if (typeof jsonString === 'string') { + // Check if it's a string representation of a simple value + if (jsonString === 'true') return true as unknown as T; + if (jsonString === 'false') return false as unknown as T; + if (jsonString === 'null') return null as unknown as T; + if (!isNaN(Number(jsonString)) && jsonString.trim() !== '') { + return Number(jsonString) as unknown as T; + } + + // Return as string if it doesn't look like JSON + if (!jsonString.startsWith('{') && !jsonString.startsWith('[')) { + return jsonString as unknown as T; + } + } + + return defaultValue; + } +} + +/** + * Stringify JSON with error handling + * + * @param value - Value to stringify + * @param defaultValue - Value to return if stringify fails + * @returns JSON string or default value + */ +export function safeJsonStringify( + value: any, + defaultValue: string = '{}' +): string { + try { + return JSON.stringify(value); + } catch { + return defaultValue; + } +} + diff --git a/packages/shared/src/utils/normalizers.ts b/packages/shared/src/utils/normalizers.ts new file mode 100644 index 0000000000..661eb15819 --- /dev/null +++ b/packages/shared/src/utils/normalizers.ts @@ -0,0 +1,60 @@ +/** + * Value normalization utilities + * Handles conversion of various input types to consistent formats + */ + +/** + * Normalizes an array value that might be a string, array, or other type + * Handles JSON strings, comma-separated strings, and arrays + */ +export function normalizeArrayValue(value: unknown): string[] { + if (Array.isArray(value)) { + return value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); + } + + if (typeof value === 'string') { + try { + const parsed = JSON.parse(value); + if (Array.isArray(parsed)) { + return parsed.filter((item): item is string => typeof item === 'string' && item.trim().length > 0); + } + } catch { + // If parsing fails, treat as comma-separated string + return value.split(',').map(a => a.trim()).filter(a => a.length > 0); + } + } + + return []; +} + +/** + * Normalizes attachments value (can be string, array, or empty) + * Handles JSON stringified arrays, comma-separated strings, and arrays + */ +export function normalizeAttachments(attachments: unknown): string[] { + if (Array.isArray(attachments)) { + return attachments; + } + + if (typeof attachments === 'string') { + // Try parsing as JSON first (handles JSON stringified arrays like "[\"file1.json\", \"file2.json\"]") + const trimmed = attachments.trim(); + if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || + (trimmed.startsWith('{') && trimmed.endsWith('}'))) { + try { + const parsed = JSON.parse(trimmed); + if (Array.isArray(parsed)) { + return parsed.filter((a: any) => a && typeof a === 'string' && a.trim().length > 0); + } + } catch { + // Not valid JSON, fall through to comma-separated parsing + } + } + + // Fallback to comma-separated string parsing + return attachments.split(',').map(a => a.trim()).filter(a => a.length > 0); + } + + return []; +} + diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 0000000000..a1b2ec7ea9 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2020"], + "strict": true, + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..8a61eb2167 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,23621 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + apps/desktop: + devDependencies: + '@electron/notarize': + specifier: ^2.3.2 + version: 2.5.0 + dotenv: + specifier: ^16.4.5 + version: 16.6.1 + electron: + specifier: ^33.0.0 + version: 33.4.11 + electron-builder: + specifier: ^25.1.8 + version: 25.1.8(electron-builder-squirrel-windows@25.1.8) + + apps/frontend: + dependencies: + '@agentpress/shared': + specifier: workspace:* + version: link:../../packages/shared + '@calcom/embed-react': + specifier: ^1.5.2 + version: 1.5.3(react-dom@18.3.1)(react@18.3.1) + '@codemirror/commands': + specifier: ^6.10.1 + version: 6.10.1 + '@codemirror/view': + specifier: ^6.38.1 + version: 6.39.8 + '@cyntler/react-doc-viewer': + specifier: ^1.17.1 + version: 1.17.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/core': + specifier: ^6.3.1 + version: 6.3.1(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/sortable': + specifier: ^10.0.0 + version: 10.0.0(@dnd-kit/core@6.3.1)(react@18.3.1) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.3.1) + '@emoji-mart/data': + specifier: ^1.2.1 + version: 1.2.1 + '@emoji-mart/react': + specifier: ^1.1.1 + version: 1.1.1(emoji-mart@5.6.0)(react@18.3.1) + '@hookform/resolvers': + specifier: ^5.2.1 + version: 5.2.2(react-hook-form@7.70.0) + '@icons-pack/react-simple-icons': + specifier: ^13.7.0 + version: 13.8.0(react@18.3.1) + '@liquidglass/react': + specifier: ^0.1.3 + version: 0.1.3(react-dom@18.3.1)(react@18.3.1) + '@next/third-parties': + specifier: ^15.3.1 + version: 15.5.9(next@15.5.9)(react@18.3.1) + '@novu/nextjs': + specifier: ^3.11.0 + version: 3.11.2(next@15.5.9)(react-dom@18.3.1)(react@18.3.1) + '@novu/notification-center': + specifier: ^2.0.0 + version: 2.0.0(@types/react@18.3.27)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1) + '@number-flow/react': + specifier: ^0.5.7 + version: 0.5.10(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': + specifier: ^1.2.11 + version: 1.2.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.11 + version: 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-avatar': + specifier: ^1.1.10 + version: 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.5 + version: 1.3.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-context-menu': + specifier: ^2.2.16 + version: 2.2.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.7 + version: 2.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-navigation-menu': + specifier: ^1.2.5 + version: 1.2.14(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.7 + version: 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.7 + version: 1.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: ^1.3.3 + version: 1.3.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.4 + version: 1.2.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.2.6 + version: 2.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.7 + version: 1.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.3.2 + version: 1.3.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.4(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.8 + version: 1.1.13(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle': + specifier: ^1.1.10 + version: 1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.2.8 + version: 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': + specifier: ^1.2.2 + version: 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@react-pdf/renderer': + specifier: ^4.3.0 + version: 4.3.2(react@18.3.1) + '@shikijs/transformers': + specifier: ^3.12.0 + version: 3.20.0 + '@silevis/reactgrid': + specifier: ^4.1.17 + version: 4.1.17(react-dom@18.3.1)(react@18.3.1) + '@supabase/ssr': + specifier: latest + version: 0.8.0(@supabase/supabase-js@2.89.0) + '@supabase/supabase-js': + specifier: latest + version: 2.89.0 + '@syncfusion/ej2-base': + specifier: ^32.1.19 + version: 32.1.19 + '@syncfusion/ej2-buttons': + specifier: ^32.1.19 + version: 32.1.21 + '@syncfusion/ej2-dropdowns': + specifier: ^32.1.20 + version: 32.1.21 + '@syncfusion/ej2-grids': + specifier: ^32.1.20 + version: 32.1.21 + '@syncfusion/ej2-inputs': + specifier: ^32.1.20 + version: 32.1.20 + '@syncfusion/ej2-lists': + specifier: ^32.1.19 + version: 32.1.19 + '@syncfusion/ej2-navigations': + specifier: ^32.1.19 + version: 32.1.19 + '@syncfusion/ej2-popups': + specifier: ^32.1.19 + version: 32.1.19 + '@syncfusion/ej2-react-spreadsheet': + specifier: ^32.1.20 + version: 32.1.21 + '@syncfusion/ej2-splitbuttons': + specifier: ^32.1.19 + version: 32.1.19 + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.19(tailwindcss@4.1.18) + '@tanstack/react-query': + specifier: ^5.75.2 + version: 5.90.16(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.75.2 + version: 5.91.2(@tanstack/react-query@5.90.16)(react@18.3.1) + '@tanstack/react-table': + specifier: ^8.21.3 + version: 8.21.3(react-dom@18.3.1)(react@18.3.1) + '@tiptap/core': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/extension-blockquote': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-bubble-menu': + specifier: ^3.13.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-character-count': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-code-block': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-code-block-lowlight': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/extension-code-block@3.14.0)(@tiptap/pm@3.14.0)(highlight.js@11.11.1)(lowlight@3.3.0) + '@tiptap/extension-collaboration': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/y-tiptap@3.0.1)(yjs@13.6.29) + '@tiptap/extension-color': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extension-text-style@3.14.0) + '@tiptap/extension-details': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/extension-text-style@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-document': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-dropcursor': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-emoji': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/suggestion@3.14.0)(emojibase@17.0.0) + '@tiptap/extension-font-family': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extension-text-style@3.14.0) + '@tiptap/extension-gapcursor': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-hard-break': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-heading': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-highlight': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-history': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-horizontal-rule': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-image': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-link': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-list': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-mathematics': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(katex@0.16.27) + '@tiptap/extension-mention': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/suggestion@3.14.0) + '@tiptap/extension-paragraph': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-placeholder': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-strike': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-subscript': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-superscript': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-table': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-task-item': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-task-list': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-text': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-text-align': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-text-style': + specifier: ^3.13.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-typography': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-underline': + specifier: ^3.14.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-youtube': + specifier: ^3.3.0 + version: 3.14.0(@tiptap/core@3.14.0) + '@tiptap/pm': + specifier: ^3.3.0 + version: 3.14.0 + '@tiptap/react': + specifier: ^3.3.0 + version: 3.14.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@tiptap/starter-kit': + specifier: ^3.3.0 + version: 3.14.0 + '@tiptap/suggestion': + specifier: ^3.13.0 + version: 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@types/jszip': + specifier: ^3.4.0 + version: 3.4.1 + '@types/papaparse': + specifier: ^5.3.15 + version: 5.5.2 + '@uiw/codemirror-extensions-langs': + specifier: ^4.23.10 + version: 4.25.4(@codemirror/autocomplete@6.20.0)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.11)(@codemirror/lang-javascript@6.2.4)(@codemirror/language-data@6.5.2)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/javascript@1.5.4)(@lezer/lr@1.4.5) + '@uiw/codemirror-theme-vscode': + specifier: ^4.23.10 + version: 4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8) + '@uiw/codemirror-theme-xcode': + specifier: ^4.23.10 + version: 4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8) + '@uiw/react-codemirror': + specifier: ^4.23.10 + version: 4.25.4(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.8)(codemirror@6.0.2)(react-dom@18.3.1)(react@18.3.1) + '@usebasejump/shared': + specifier: ^0.0.3 + version: 0.0.3 + '@vercel/analytics': + specifier: ^1.5.0 + version: 1.6.1(next@15.5.9)(react@18.3.1) + '@vercel/edge-config': + specifier: ^1.4.0 + version: 1.4.3(next@15.5.9) + '@vercel/speed-insights': + specifier: ^1.2.0 + version: 1.3.1(next@15.5.9)(react@18.3.1) + '@xterm/addon-fit': + specifier: ^0.10.0 + version: 0.10.0(@xterm/xterm@5.5.0) + '@xterm/addon-web-links': + specifier: ^0.11.0 + version: 0.11.0(@xterm/xterm@5.5.0) + '@xterm/xterm': + specifier: ^5.5.0 + version: 5.5.0 + autoprefixer: + specifier: 10.4.17 + version: 10.4.17(postcss@8.4.33) + canvas: + specifier: ^3.1.0 + version: 3.2.0 + canvas-confetti: + specifier: ^1.9.4 + version: 1.9.4 + chart.js: + specifier: ^4.5.1 + version: 4.5.1 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: ^0.2.1 + version: 0.2.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + cobe: + specifier: ^0.6.3 + version: 0.6.5 + color: + specifier: ^5.0.0 + version: 5.0.3 + color-bits: + specifier: ^1.1.0 + version: 1.1.1 + colorthief: + specifier: ^2.6.0 + version: 2.6.0 + comment-json: + specifier: ^4.2.5 + version: 4.5.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + diff: + specifier: ^7.0.0 + version: 7.0.0 + extract-colors: + specifier: ^4.2.0 + version: 4.2.1 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + flags: + specifier: ^4.0.2 + version: 4.0.2(next@15.5.9)(react-dom@18.3.1)(react@18.3.1) + framer-motion: + specifier: ^12.6.5 + version: 12.23.26(react-dom@18.3.1)(react@18.3.1) + geist: + specifier: ^1.2.1 + version: 1.5.1(next@15.5.9) + gsap: + specifier: ^3.13.0 + version: 3.14.2 + hjson: + specifier: ^3.2.2 + version: 3.2.2 + html2pdf.js: + specifier: ^0.10.3 + version: 0.10.3 + install: + specifier: ^0.13.0 + version: 0.13.0 + jju: + specifier: ^1.4.0 + version: 1.4.0 + json5: + specifier: ^2.2.3 + version: 2.2.3 + jsonrepair: + specifier: ^3.12.0 + version: 3.13.1 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + katex: + specifier: ^0.16.22 + version: 0.16.27 + konva: + specifier: ^9.3.16 + version: 9.3.22 + libphonenumber-js: + specifier: ^1.12.10 + version: 1.12.33 + liquid-glass-react: + specifier: ^1.1.1 + version: 1.1.1(react-dom@18.3.1)(react@18.3.1) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + lottie-react: + specifier: ^2.4.1 + version: 2.4.1(react-dom@18.3.1)(react@18.3.1) + lowlight: + specifier: ^3.3.0 + version: 3.3.0 + lucide-react: + specifier: ^0.479.0 + version: 0.479.0(react@18.3.1) + marked: + specifier: ^15.0.7 + version: 15.0.12 + mermaid: + specifier: ^11.12.0 + version: 11.12.2 + next: + specifier: ^15.3.8 + version: 15.5.9(react-dom@18.3.1)(react@18.3.1) + next-intl: + specifier: ^4.5.3 + version: 4.7.0(next@15.5.9)(react@18.3.1)(typescript@5.9.3) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@18.3.1)(react@18.3.1) + npm: + specifier: ^11.5.2 + version: 11.7.0 + papaparse: + specifier: ^5.5.2 + version: 5.5.3 + pdfjs-dist: + specifier: 4.8.69 + version: 4.8.69 + playwright: + specifier: ^1.57.0 + version: 1.57.0 + postcss: + specifier: 8.4.33 + version: 8.4.33 + posthog-js: + specifier: ^1.258.6 + version: 1.313.0 + posthog-node: + specifier: ^5.6.0 + version: 5.18.1 + radix-ui: + specifier: ^1.4.3 + version: 1.4.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ^18 + version: 18.3.1 + react-color-palette: + specifier: ^7.3.1 + version: 7.3.1(react@18.3.1) + react-colorful: + specifier: ^5.6.1 + version: 5.6.1(react-dom@18.3.1)(react@18.3.1) + react-day-picker: + specifier: ^8.10.1 + version: 8.10.1(date-fns@3.6.0)(react@18.3.1) + react-diff-viewer-continued: + specifier: ^3.4.0 + version: 3.4.0(react-dom@18.3.1)(react@18.3.1) + react-dom: + specifier: ^18 + version: 18.3.1(react@18.3.1) + react-hook-form: + specifier: ^7.62.0 + version: 7.70.0(react@18.3.1) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@18.3.1) + react-is: + specifier: ^19.2.3 + version: 19.2.3 + react-konva: + specifier: ^19.2.1 + version: 19.2.1(@types/react@18.3.27)(konva@9.3.22)(react-dom@18.3.1)(react@18.3.1) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@18.3.27)(react@18.3.1) + react-papaparse: + specifier: ^4.4.0 + version: 4.4.0 + react-pdf: + specifier: ^9.2.1 + version: 9.2.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + react-phone-number-input: + specifier: ^3.4.12 + version: 3.4.14(react-dom@18.3.1)(react@18.3.1) + react-resizable-panels: + specifier: ^3.0.6 + version: 3.0.6(react-dom@18.3.1)(react@18.3.1) + read-excel-file: + specifier: ^6.0.1 + version: 6.0.1 + recharts: + specifier: ^3.2.1 + version: 3.6.0(@types/react@18.3.27)(react-dom@18.3.1)(react-is@19.2.3)(react@18.3.1)(redux@5.0.1) + rehype-raw: + specifier: ^7.0.0 + version: 7.0.0 + rehype-sanitize: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + server-only: + specifier: ^0.0.1 + version: 0.0.1 + sonner: + specifier: ^2.0.3 + version: 2.0.7(react-dom@18.3.1)(react@18.3.1) + streamdown: + specifier: ^1.6.10 + version: 1.6.10(micromark@4.0.2)(react@18.3.1) + tailwind-merge: + specifier: ^3.0.2 + version: 3.4.0 + tailwind-scrollbar: + specifier: ^4.0.2 + version: 4.0.2(react@18.3.1)(tailwindcss@4.1.18) + tailwind-scrollbar-hide: + specifier: ^2.0.0 + version: 2.0.0(tailwindcss@4.1.18) + tailwindcss: + specifier: ^4 + version: 4.1.18 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.1.18) + turndown: + specifier: ^7.2.1 + version: 7.2.2 + turndown-plugin-gfm: + specifier: ^1.0.2 + version: 1.0.2 + typescript: + specifier: ^5 + version: 5.9.3 + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + xlsx: + specifier: ^0.18.5 + version: 0.18.5 + y-indexeddb: + specifier: ^9.0.12 + version: 9.0.12(yjs@13.6.29) + yjs: + specifier: ^13.6.27 + version: 13.6.29 + zod: + specifier: ^3.25.76 + version: 3.25.76 + zustand: + specifier: ^5.0.3 + version: 5.0.9(@types/react@18.3.27)(react@18.3.1) + devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.3 + '@tailwindcss/postcss': + specifier: ^4.1.4 + version: 4.1.18 + '@types/canvas-confetti': + specifier: ^1.9.0 + version: 1.9.0 + '@types/color': + specifier: ^4.2.0 + version: 4.2.0 + '@types/colorthief': + specifier: ^2.6.0 + version: 2.6.0 + '@types/diff': + specifier: ^7.0.2 + version: 7.0.2 + '@types/jju': + specifier: ^1.4.5 + version: 1.4.5 + '@types/lodash': + specifier: ^4.17.20 + version: 4.17.21 + '@types/node': + specifier: ^20 + version: 20.19.27 + '@types/react': + specifier: ^18 + version: 18.3.27 + '@types/react-dom': + specifier: ^18 + version: 18.3.7(@types/react@18.3.27) + '@types/turndown': + specifier: ^5.0.5 + version: 5.0.6 + encoding: + specifier: ^0.1.13 + version: 0.1.13 + eslint: + specifier: ^9 + version: 9.39.2 + eslint-config-next: + specifier: 15.2.2 + version: 15.2.2(eslint@9.39.2)(typescript@5.9.3) + prettier: + specifier: ^3.5.3 + version: 3.7.4 + shiki: + specifier: ^3.12.0 + version: 3.20.0 + tw-animate-css: + specifier: ^1.2.4 + version: 1.4.0 + + apps/mobile: + dependencies: + '@agentpress/shared': + specifier: workspace:* + version: link:../../packages/shared + '@bacons/apple-targets': + specifier: ^3.0.5 + version: 3.0.6 + '@expensify/react-native-live-markdown': + specifier: ^0.1.317 + version: 0.1.319(expensify-common@2.0.169)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + '@gorhom/bottom-sheet': + specifier: ^5.2.6 + version: 5.2.8(@types/react@19.1.17)(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0) + '@lottiefiles/dotlottie-react': + specifier: ^0.13.5 + version: 0.13.5(react@19.1.0) + '@react-native-async-storage/async-storage': + specifier: ^2.2.0 + version: 2.2.0(react-native@0.81.5) + '@react-native-masked-view/masked-view': + specifier: ^0.3.2 + version: 0.3.2(react-native@0.81.5)(react@19.1.0) + '@react-native-picker/picker': + specifier: 2.11.1 + version: 2.11.1(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': + specifier: ^7.0.0 + version: 7.1.26(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/accordion': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/alert-dialog': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/aspect-ratio': + specifier: ^1.2.0 + version: 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/avatar': + specifier: ^1.2.0 + version: 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/checkbox': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/collapsible': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/context-menu': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/dialog': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/dropdown-menu': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/hover-card': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/label': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/menubar': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/popover': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': + specifier: ~1.3.0 + version: 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/progress': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/radio-group': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/select': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/separator': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': + specifier: ^1.2.0 + version: 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/switch': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/tabs': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/toggle': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/toggle-group': + specifier: ^1.2.0 + version: 1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/tooltip': + specifier: ^1.2.0 + version: 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@supabase/supabase-js': + specifier: ^2.75.0 + version: 2.89.0 + '@tanstack/react-query': + specifier: ^5.90.5 + version: 5.90.16(react@19.1.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + expensify-common: + specifier: ^2.0.168 + version: 2.0.169 + expo: + specifier: ~54.0.20 + version: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-apple-authentication: + specifier: ^8.0.7 + version: 8.0.8(expo@54.0.30)(react-native@0.81.5) + expo-audio: + specifier: ^1.0.13 + version: 1.1.1(expo-asset@12.0.12)(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-auth-session: + specifier: ^7.0.8 + version: 7.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-av: + specifier: ^16.0.7 + version: 16.0.8(expo@54.0.30)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + expo-blur: + specifier: ~15.0.7 + version: 15.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-build-properties: + specifier: ^1.0.9 + version: 1.0.10(expo@54.0.30) + expo-clipboard: + specifier: ~8.0.8 + version: 8.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-constants: + specifier: ~18.0.10 + version: 18.0.12(expo@54.0.30)(react-native@0.81.5) + expo-dev-client: + specifier: ~6.0.18 + version: 6.0.20(expo@54.0.30) + expo-device: + specifier: ~8.0.9 + version: 8.0.10(expo@54.0.30) + expo-document-picker: + specifier: ^14.0.7 + version: 14.0.8(expo@54.0.30) + expo-file-system: + specifier: ~19.0.17 + version: 19.0.21(expo@54.0.30)(react-native@0.81.5) + expo-font: + specifier: ^14.0.9 + version: 14.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-haptics: + specifier: ^15.0.8 + version: 15.0.8(expo@54.0.30) + expo-image-picker: + specifier: ^17.0.8 + version: 17.0.10(expo@54.0.30) + expo-linear-gradient: + specifier: ~15.0.7 + version: 15.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-linking: + specifier: ~8.0.8 + version: 8.0.11(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-navigation-bar: + specifier: ~5.0.10 + version: 5.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-notifications: + specifier: ~0.32.13 + version: 0.32.15(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-router: + specifier: ~6.0.13 + version: 6.0.21(@expo/metro-runtime@6.1.2)(@react-native-masked-view/masked-view@0.3.2)(@types/react@19.1.17)(expo-constants@18.0.12)(expo-linking@8.0.11)(expo@54.0.30)(react-dom@19.1.0)(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + expo-sharing: + specifier: ^14.0.8 + version: 14.0.8(expo@54.0.30) + expo-splash-screen: + specifier: ~31.0.10 + version: 31.0.13(expo@54.0.30) + expo-status-bar: + specifier: ~3.0.8 + version: 3.0.9(react-native@0.81.5)(react@19.1.0) + expo-system-ui: + specifier: ~6.0.8 + version: 6.0.9(expo@54.0.30)(react-native-web@0.21.2)(react-native@0.81.5) + expo-tracking-transparency: + specifier: ^6.0.7 + version: 6.0.8(expo@54.0.30)(react-native@0.81.5) + expo-updates: + specifier: ~29.0.12 + version: 29.0.15(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-web-browser: + specifier: ^15.0.8 + version: 15.0.10(expo@54.0.30)(react-native@0.81.5) + fuse.js: + specifier: ^7.1.0 + version: 7.1.0 + html-entities: + specifier: 2.5.3 + version: 2.5.3 + i18next: + specifier: ^25.6.0 + version: 25.7.3(typescript@5.9.3) + install: + specifier: ^0.13.0 + version: 0.13.0 + kill-port: + specifier: ^2.0.1 + version: 2.0.1 + lottie-react-native: + specifier: ^7.3.4 + version: 7.3.4(@lottiefiles/dotlottie-react@0.13.5)(react-native@0.81.5)(react@19.1.0) + lucide-react-native: + specifier: ^0.545.0 + version: 0.545.0(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0) + nativewind: + specifier: ^4.2.1 + version: 4.2.1(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0)(tailwindcss@3.4.19) + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + react-i18next: + specifier: ^16.0.1 + version: 16.5.1(i18next@25.7.3)(react-dom@19.1.0)(react-native@0.81.5)(react@19.1.0)(typescript@5.9.3) + react-native: + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-context-menu-view: + specifier: ^1.21.0 + version: 1.21.0(react-native@0.81.5)(react@19.1.0) + react-native-drawer-layout: + specifier: ^4.1.13 + version: 4.2.1(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0) + react-native-email-link: + specifier: ^1.16.1 + version: 1.16.1(react-native@0.81.5)(react@19.1.0) + react-native-gesture-handler: + specifier: ~2.28.0 + version: 2.28.0(react-native@0.81.5)(react@19.1.0) + react-native-keyboard-controller: + specifier: ^1.20.2 + version: 1.20.3(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0) + react-native-markdown-display: + specifier: ^7.0.2 + version: 7.0.2(react-native@0.81.5)(react@19.1.0) + react-native-purchases: + specifier: ^9.6.5 + version: 9.6.13(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react-native-purchases-ui: + specifier: ^9.6.5 + version: 9.6.13(react-native-purchases@9.6.13)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react-native-reanimated: + specifier: ~4.1.3 + version: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + react-native-safe-area-context: + specifier: ~5.6.0 + version: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: + specifier: ~4.16.0 + version: 4.16.0(react-native@0.81.5)(react@19.1.0) + react-native-sound-level: + specifier: ^1.3.0 + version: 1.3.0 + react-native-sse: + specifier: ^1.2.1 + version: 1.2.1 + react-native-svg: + specifier: 15.12.1 + version: 15.12.1(react-native@0.81.5)(react@19.1.0) + react-native-syntax-highlighter: + specifier: ^2.1.0 + version: 2.1.0(react-syntax-highlighter@16.1.0) + react-native-url-polyfill: + specifier: ^3.0.0 + version: 3.0.0(react-native@0.81.5) + react-native-vector-icons: + specifier: ^10.3.0 + version: 10.3.0 + react-native-web: + specifier: ^0.21.0 + version: 0.21.2(react-dom@19.1.0)(react@19.1.0) + react-native-webview: + specifier: ^13.16.0 + version: 13.16.0(react-native@0.81.5)(react@19.1.0) + react-native-worklets: + specifier: 0.6.0 + version: 0.6.0(@babel/core@7.28.5)(react-native@0.81.5)(react@19.1.0) + react-syntax-highlighter: + specifier: ^16.0.0 + version: 16.1.0(react@19.1.0) + tailwind-merge: + specifier: ^3.3.1 + version: 3.4.0 + tailwindcss: + specifier: ^3.4.14 + version: 3.4.19 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.19) + zustand: + specifier: ^5.0.8 + version: 5.0.9(@types/react@19.1.17)(react@19.1.0) + devDependencies: + '@babel/core': + specifier: ^7.26.0 + version: 7.28.5 + '@types/react': + specifier: ~19.1.10 + version: 19.1.17 + '@types/react-syntax-highlighter': + specifier: ^15.5.13 + version: 15.5.13 + patch-package: + specifier: ^8.0.0 + version: 8.0.1 + prettier: + specifier: ^3.6.2 + version: 3.7.4 + prettier-plugin-tailwindcss: + specifier: ^0.6.14 + version: 0.6.14(prettier@3.7.4) + react-native-svg-transformer: + specifier: ^1.5.1 + version: 1.5.2(react-native-svg@15.12.1)(react-native@0.81.5)(typescript@5.9.3) + typescript: + specifier: ~5.9.2 + version: 5.9.3 + + packages/shared: + devDependencies: + typescript: + specifier: ^5.0.0 + version: 5.9.3 + +packages: + + /7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + dev: true + + /@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 + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@antfu/install-pkg@1.1.0: + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + dev: false + + /@babel/code-frame@7.10.4: + resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} + dependencies: + '@babel/highlight': 7.25.9 + dev: false + + /@babel/code-frame@7.27.1: + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + /@babel/compat-data@7.28.5: + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.28.5: + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.28.5: + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + /@babel/helper-annotate-as-pure@7.27.3: + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.28.5 + dev: false + + /@babel/helper-compilation-targets@7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + dev: false + + /@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5): + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-globals@7.28.0: + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-member-expression-to-functions@7.28.5: + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-module-imports@7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5): + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + /@babel/helper-optimise-call-expression@7.27.1: + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.28.5 + dev: false + + /@babel/helper-plugin-utils@7.27.1: + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-skip-transparent-expression-wrappers@7.27.1: + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-string-parser@7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.28.5: + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.28.3: + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helpers@7.28.4: + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + /@babel/highlight@7.25.9: + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: false + + /@babel/parser@7.28.5: + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.28.5 + + /@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5): + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5): + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5): + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5): + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + dev: false + + /@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) + dev: false + + /@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5): + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5): + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5): + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5): + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-runtime@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5): + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + dev: false + + /@babel/preset-react@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-typescript@7.28.5(@babel/core@7.28.5): + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/runtime@7.28.4: + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + /@babel/template@7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + /@babel/traverse@7.28.5: + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.28.5: + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + /@bacons/apple-targets@3.0.6: + resolution: {integrity: sha512-WsKkhDG1CEq1upX+sWqdeAPu7fdQUUzrXd6spJxykz2iuzmAwGlLGx2j59LlWH8/igwRpyi3mW+PYbXH+usyzg==} + dependencies: + '@bacons/xcode': 1.0.0-alpha.27 + '@react-native/normalize-colors': 0.79.7 + debug: 4.4.3 + glob: 10.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@bacons/xcode@1.0.0-alpha.27: + resolution: {integrity: sha512-WlemTiwpwwVH8IMvg4VBsyxGUuFWUfzeWKzxhU+dRxd8MHvnX7F9PlWCf7T0ZXmtjbl39iEgQB+/Tf3wuGJbyg==} + dependencies: + '@expo/plist': 0.0.18 + debug: 4.4.3 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@braintree/sanitize-url@7.1.1: + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + dev: false + + /@calcom/embed-core@1.5.3: + resolution: {integrity: sha512-GeId9gaByJ5EWiPmuvelZOvFWPOTWkcWZr5vGTCbIUTX125oE5yn0n8lDF1MJk5Xj1WO+/dk9jKIE08Ad9ytiQ==} + dev: false + + /@calcom/embed-react@1.5.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-JCgge04pc8fhdvUmPNVLhW8/lCWK+AAziKecKWWPfv1nn2s+qKP2BwsEAnxhxK9yPOBgE1EIEgmYkrrNB1iajA==} + peerDependencies: + react: ^18.2.0 || ^19.0.0 + react-dom: ^18.2.0 || ^19.0.0 + dependencies: + '@calcom/embed-core': 1.5.3 + '@calcom/embed-snippet': 1.3.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@calcom/embed-snippet@1.3.3: + resolution: {integrity: sha512-pqqKaeLB8R6BvyegcpI9gAyY6Xyx1bKYfWvIGOvIbTpguWyM1BBBVcT9DCeGe8Zw7Ujp5K56ci7isRUrT2Uadg==} + dependencies: + '@calcom/embed-core': 1.5.3 + dev: false + + /@chevrotain/cst-dts-gen@11.0.3: + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + dev: false + + /@chevrotain/gast@11.0.3: + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + dev: false + + /@chevrotain/regexp-to-ast@11.0.3: + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + dev: false + + /@chevrotain/types@11.0.3: + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + dev: false + + /@chevrotain/utils@11.0.3: + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + dev: false + + /@codemirror/autocomplete@6.20.0: + resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} + dependencies: + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + dev: false + + /@codemirror/commands@6.10.1: + resolution: {integrity: sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==} + dependencies: + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + dev: false + + /@codemirror/lang-angular@0.1.4: + resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.12.1 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-cpp@6.0.3: + resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/cpp': 1.1.4 + dev: false + + /@codemirror/lang-css@6.3.1: + resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/css': 1.3.0 + dev: false + + /@codemirror/lang-go@6.0.1: + resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/go': 1.0.1 + dev: false + + /@codemirror/lang-html@6.4.11: + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/css': 1.3.0 + '@lezer/html': 1.3.13 + dev: false + + /@codemirror/lang-java@6.0.2: + resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/java': 1.1.3 + dev: false + + /@codemirror/lang-javascript@6.2.4: + resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/lint': 6.9.2 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/javascript': 1.5.4 + dev: false + + /@codemirror/lang-jinja@6.0.0: + resolution: {integrity: sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw==} + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.1 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-json@6.0.2: + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/json': 1.0.3 + dev: false + + /@codemirror/lang-less@6.0.2: + resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.12.1 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-liquid@6.3.1: + resolution: {integrity: sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-markdown@6.5.0: + resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/markdown': 1.6.2 + dev: false + + /@codemirror/lang-php@6.0.2: + resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/php': 1.0.5 + dev: false + + /@codemirror/lang-python@6.2.1: + resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/python': 1.1.18 + dev: false + + /@codemirror/lang-rust@6.0.2: + resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/rust': 1.0.2 + dev: false + + /@codemirror/lang-sass@6.0.2: + resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} + dependencies: + '@codemirror/lang-css': 6.3.1 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/sass': 1.1.0 + dev: false + + /@codemirror/lang-sql@6.10.0: + resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-vue@0.1.3: + resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.12.1 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-wast@6.0.2: + resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@codemirror/lang-xml@6.1.0: + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/xml': 1.0.6 + dev: false + + /@codemirror/lang-yaml@6.1.2: + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + '@lezer/yaml': 1.0.3 + dev: false + + /@codemirror/language-data@6.5.2: + resolution: {integrity: sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg==} + dependencies: + '@codemirror/lang-angular': 0.1.4 + '@codemirror/lang-cpp': 6.0.3 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-go': 6.0.1 + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-java': 6.0.2 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/lang-jinja': 6.0.0 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-less': 6.0.2 + '@codemirror/lang-liquid': 6.3.1 + '@codemirror/lang-markdown': 6.5.0 + '@codemirror/lang-php': 6.0.2 + '@codemirror/lang-python': 6.2.1 + '@codemirror/lang-rust': 6.0.2 + '@codemirror/lang-sass': 6.0.2 + '@codemirror/lang-sql': 6.10.0 + '@codemirror/lang-vue': 0.1.3 + '@codemirror/lang-wast': 6.0.2 + '@codemirror/lang-xml': 6.1.0 + '@codemirror/lang-yaml': 6.1.2 + '@codemirror/language': 6.12.1 + '@codemirror/legacy-modes': 6.5.2 + dev: false + + /@codemirror/language@6.12.1: + resolution: {integrity: sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==} + dependencies: + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + style-mod: 4.1.3 + dev: false + + /@codemirror/legacy-modes@6.5.2: + resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} + dependencies: + '@codemirror/language': 6.12.1 + dev: false + + /@codemirror/lint@6.9.2: + resolution: {integrity: sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==} + dependencies: + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.11: + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + dependencies: + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.5.3: + resolution: {integrity: sha512-MerMzJzlXogk2fxWFU1nKp36bY5orBG59HnPiz0G9nLRebWa0zXuv2siH6PLIHBvv5TH8CkQRqjBs0MlxCZu+A==} + dependencies: + '@marijn/find-cluster-break': 1.0.2 + dev: false + + /@codemirror/theme-one-dark@6.1.3: + resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} + dependencies: + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/highlight': 1.2.3 + dev: false + + /@codemirror/view@6.39.8: + resolution: {integrity: sha512-1rASYd9Z/mE3tkbC9wInRlCNyCkSn+nLsiQKZhEDUUJiUfs/5FHDpCUDaQpoTIaNGeDc6/bhaEAyLmeEucEFPw==} + dependencies: + '@codemirror/state': 6.5.3 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + dev: false + + /@corvu/utils@0.4.2(solid-js@1.9.10): + resolution: {integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==} + peerDependencies: + solid-js: ^1.8 + dependencies: + '@floating-ui/dom': 1.7.4 + solid-js: 1.9.10 + dev: false + + /@cyntler/react-doc-viewer@1.17.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KaH2iuwBP0PiLKu+tiTfq46AadiCdaUQALExAomxkR9TpNaDipTs0HDTneW/oDrnX5bJkb1FhshL/gro8+Q2kg==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@types/mustache': 4.2.6 + '@types/papaparse': 5.5.2 + ajv: 7.2.4 + core-js: 3.47.0 + mustache: 4.2.0 + papaparse: 5.5.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-pdf: 9.2.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + styled-components: 6.1.19(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@develar/schema-utils@2.6.5: + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /@dnd-kit/accessibility@3.1.1(react@18.3.1): + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /@dnd-kit/core@6.3.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + + /@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1)(react@18.3.1): + resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: '>=16.8.0' + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@18.3.1)(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.3.1): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /@edge-runtime/cookies@5.0.2: + resolution: {integrity: sha512-Sd8LcWpZk/SWEeKGE8LT6gMm5MGfX/wm+GPnh1eBEtCpya3vYqn37wYknwAHw92ONoyyREl1hJwxV/Qx2DWNOg==} + engines: {node: '>=16'} + dev: false + + /@egjs/hammerjs@2.0.17: + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + dependencies: + '@types/hammerjs': 2.0.46 + dev: false + + /@electron/asar@3.4.1: + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /@electron/get@2.0.3: + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@electron/notarize@2.5.0: + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} + engines: {node: '>= 10.0.0'} + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@electron/osx-sign@1.3.1: + resolution: {integrity: sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@electron/rebuild@3.6.1: + resolution: {integrity: sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + chalk: 4.1.2 + debug: 4.4.3 + detect-libc: 2.1.2 + fs-extra: 10.1.0 + got: 11.8.6 + node-abi: 3.85.0 + node-api-version: 0.2.1 + node-gyp: 9.4.1 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.3 + tar: 6.2.1 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /@electron/universal@2.0.1: + resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} + engines: {node: '>=16.4'} + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.3.3 + minimatch: 9.0.5 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@emnapi/core@1.8.0: + resolution: {integrity: sha512-ryJnSmj4UhrGLZZPJ6PKVb4wNPAIkW6iyLy+0TRwazd3L1u0wzMe8RfqevAh2HbcSkoeLiSYnOVDOys4JSGYyg==} + requiresBuild: true + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + dev: true + optional: true + + /@emnapi/runtime@1.8.0: + resolution: {integrity: sha512-Z82FDl1ByxqPEPrAYYeTQVlx2FSHPe1qwX465c+96IRS3fTdSYRoJcRxg3g2fEG5I69z1dSEWQlNRRr0/677mg==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + optional: true + + /@emnapi/wasi-threads@1.1.0: + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@emoji-mart/data@1.2.1: + resolution: {integrity: sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==} + dev: false + + /@emoji-mart/react@1.1.1(emoji-mart@5.6.0)(react@18.3.1): + resolution: {integrity: sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==} + peerDependencies: + emoji-mart: ^5.2 + react: ^16.8 || ^17 || ^18 + dependencies: + emoji-mart: 5.6.0 + react: 18.3.1 + dev: false + + /@emotion/babel-plugin@11.13.5: + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.28.4 + '@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@1.2.2: + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/is-prop-valid@1.4.0: + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + dependencies: + '@emotion/memoize': 0.9.0 + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@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.27)(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.28.4 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + '@types/react': 18.3.27 + 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.2.3 + 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.27)(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.28.4 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@18.3.27)(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.27 + react: 18.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@emotion/unitless@0.10.0: + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@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 + + /@eslint-community/eslint-utils@4.9.1(eslint@9.39.2): + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.2: + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/config-array@0.21.1: + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/config-helpers@0.4.2: + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.17.0 + dev: true + + /@eslint/core@0.17.0: + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + dev: true + + /@eslint/eslintrc@3.3.3: + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.39.2: + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.7: + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/plugin-kit@0.4.1: + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + dev: true + + /@expensify/react-native-live-markdown@0.1.319(expensify-common@2.0.169)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-FLiJ9wWSUPzbE87ftXrgf8GxM3Yawu8vQwAVhnTBNhMMs6fMEEp9cIShIYYNJ43oAiAb6KYNvU25YxVMvDk+WQ==} + engines: {node: '>= 18.0.0'} + peerDependencies: + expensify-common: '>=2.0.148' + react: '*' + react-native: '*' + react-native-worklets: '>=0.6.0' + dependencies: + expensify-common: 2.0.169 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-worklets: 0.6.0(@babel/core@7.28.5)(react-native@0.81.5)(react@19.1.0) + dev: false + + /@expo/cli@54.0.20(expo-router@6.0.21)(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-cwsXmhftvS0p9NNYOhXGnicBAZl9puWwRt19Qq5eQ6njLnaj8WvcR+kDZyADtgZxBsZiyVlrKXvnjt43HXywQA==} + hasBin: true + peerDependencies: + expo: '*' + expo-router: '*' + react-native: '*' + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true + dependencies: + '@0no-co/graphql.web': 1.2.0 + '@expo/code-signing-certificates': 0.0.5 + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devcert': 1.2.1 + '@expo/env': 2.0.8 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.12(expo@54.0.30) + '@expo/osascript': 2.3.8 + '@expo/package-manager': 1.9.9 + '@expo/plist': 0.4.8 + '@expo/prebuild-config': 54.0.8(expo@54.0.30) + '@expo/schema-utils': 0.1.8 + '@expo/spawn-async': 1.7.2 + '@expo/ws-tunnel': 1.0.6 + '@expo/xcpretty': 4.3.2 + '@react-native/dev-middleware': 0.81.5 + '@urql/core': 5.2.0 + '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0) + accepts: 1.3.8 + arg: 5.0.2 + better-opn: 3.0.2 + bplist-creator: 0.1.0 + bplist-parser: 0.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + compression: 1.8.1 + connect: 3.7.0 + debug: 4.4.3 + env-editor: 0.4.2 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-router: 6.0.21(@expo/metro-runtime@6.1.2)(@react-native-masked-view/masked-view@0.3.2)(@types/react@19.1.17)(expo-constants@18.0.12)(expo-linking@8.0.11)(expo@54.0.30)(react-dom@19.1.0)(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + expo-server: 1.0.5 + freeport-async: 2.0.0 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.1.7 + minimatch: 9.0.5 + node-forge: 1.3.3 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 3.0.1 + pretty-bytes: 5.6.0 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + qrcode-terminal: 0.11.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + require-from-string: 2.0.2 + requireg: 0.2.2 + resolve: 1.22.11 + resolve-from: 5.0.0 + resolve.exports: 2.0.3 + semver: 7.7.3 + send: 0.19.2 + slugify: 1.6.6 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + tar: 7.5.2 + terminal-link: 2.1.1 + undici: 6.22.0 + wrap-ansi: 7.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - graphql + - supports-color + - utf-8-validate + dev: false + + /@expo/code-signing-certificates@0.0.5: + resolution: {integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==} + dependencies: + node-forge: 1.3.3 + nullthrows: 1.1.1 + dev: false + + /@expo/config-plugins@54.0.4: + resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==} + dependencies: + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 + '@expo/plist': 0.4.8 + '@expo/sdk-runtime-versions': 1.0.0 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + resolve-from: 5.0.0 + semver: 7.7.3 + slash: 3.0.0 + slugify: 1.6.6 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/config-types@54.0.10: + resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} + dev: false + + /@expo/config@12.0.13: + resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} + dependencies: + '@babel/code-frame': 7.10.4 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + resolve-workspace-root: 2.0.0 + semver: 7.7.3 + slugify: 1.6.6 + sucrase: 3.35.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/devcert@1.2.1: + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} + dependencies: + '@expo/sudo-prompt': 9.3.2 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/devtools@0.1.8(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==} + peerDependencies: + react: '*' + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + dependencies: + chalk: 4.1.2 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@expo/env@2.0.8: + resolution: {integrity: sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==} + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/fingerprint@0.15.4: + resolution: {integrity: sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + arg: 5.0.2 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + ignore: 5.3.2 + minimatch: 9.0.5 + p-limit: 3.1.0 + resolve-from: 5.0.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/image-utils@0.8.8: + resolution: {integrity: sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==} + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + getenv: 2.0.0 + jimp-compact: 0.16.1 + parse-png: 2.1.0 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + semver: 7.7.3 + temp-dir: 2.0.0 + unique-string: 2.0.0 + dev: false + + /@expo/json-file@10.0.8: + resolution: {integrity: sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==} + dependencies: + '@babel/code-frame': 7.10.4 + json5: 2.2.3 + dev: false + + /@expo/metro-config@54.0.12(expo@54.0.30): + resolution: {integrity: sha512-Xhv1z/ak/cuJWeLxlnWr2u22q2AM/klASbjpP5eE34y91lGWa2NUwrFWoS830MhJ6kuAqtGdoQhwyPa3TES7sA==} + peerDependencies: + expo: '*' + peerDependenciesMeta: + expo: + optional: true + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.29.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.30.2 + minimatch: 9.0.5 + postcss: 8.4.33 + resolve-from: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@expo/metro-runtime@6.1.2(expo@54.0.30)(react-dom@19.1.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==} + peerDependencies: + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + anser: 1.4.10 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + pretty-format: 29.7.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + dev: false + + /@expo/metro@54.2.0: + resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==} + dependencies: + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-minify-terser: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@expo/osascript@2.3.8: + resolution: {integrity: sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==} + engines: {node: '>=12'} + dependencies: + '@expo/spawn-async': 1.7.2 + exec-async: 2.2.0 + dev: false + + /@expo/package-manager@1.9.9: + resolution: {integrity: sha512-Nv5THOwXzPprMJwbnXU01iXSrCp3vJqly9M4EJ2GkKko9Ifer2ucpg7x6OUsE09/lw+npaoUnHMXwkw7gcKxlg==} + dependencies: + '@expo/json-file': 10.0.8 + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + npm-package-arg: 11.0.3 + ora: 3.4.0 + resolve-workspace-root: 2.0.0 + dev: false + + /@expo/plist@0.0.18: + resolution: {integrity: sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w==} + dependencies: + '@xmldom/xmldom': 0.7.13 + base64-js: 1.5.1 + xmlbuilder: 14.0.0 + dev: false + + /@expo/plist@0.4.8: + resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + dev: false + + /@expo/prebuild-config@54.0.8(expo@54.0.30): + resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==} + peerDependencies: + expo: '*' + dependencies: + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + resolve-from: 5.0.0 + semver: 7.7.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/schema-utils@0.1.8: + resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==} + dev: false + + /@expo/sdk-runtime-versions@1.0.0: + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + dev: false + + /@expo/spawn-async@1.7.2: + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + dependencies: + cross-spawn: 7.0.6 + dev: false + + /@expo/sudo-prompt@9.3.2: + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + dev: false + + /@expo/vector-icons@15.0.3(expo-font@14.0.10)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==} + peerDependencies: + expo-font: '>=14.0.4' + react: '*' + react-native: '*' + dependencies: + expo-font: 14.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@expo/ws-tunnel@1.0.6: + resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} + dev: false + + /@expo/xcpretty@4.3.2: + resolution: {integrity: sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==} + hasBin: true + dependencies: + '@babel/code-frame': 7.10.4 + chalk: 4.1.2 + find-up: 5.0.0 + js-yaml: 4.1.1 + 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@1.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} + 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-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-dom@2.1.6(react-dom@19.1.0)(react@19.1.0): + 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: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@floating-ui/react@0.19.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react-dom': 1.3.0(react-dom@18.3.1)(react@18.3.1) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.4.0 + dev: false + + /@floating-ui/utils@0.2.10: + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + dev: false + + /@formatjs/ecma402-abstract@2.3.6: + resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/intl-localematcher': 0.6.2 + decimal.js: 10.6.0 + tslib: 2.8.1 + dev: false + + /@formatjs/fast-memoize@2.2.7: + resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} + dependencies: + tslib: 2.8.1 + dev: false + + /@formatjs/icu-messageformat-parser@2.11.4: + resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-skeleton-parser': 1.8.16 + tslib: 2.8.1 + dev: false + + /@formatjs/icu-skeleton-parser@1.8.16: + resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + tslib: 2.8.1 + dev: false + + /@formatjs/intl-localematcher@0.5.10: + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + dependencies: + tslib: 2.8.1 + dev: false + + /@formatjs/intl-localematcher@0.6.2: + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + dependencies: + tslib: 2.8.1 + dev: false + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@gorhom/bottom-sheet@5.2.8(@types/react@19.1.17)(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-+N27SMpbBxXZQ/IA2nlEV6RGxL/qSFHKfdFKcygvW+HqPG5jVNb1OqehLQsGfBP+Up42i0gW5ppI+DhpB7UCzA==} + peerDependencies: + '@types/react': '*' + '@types/react-native': '*' + react: '*' + react-native: '*' + react-native-gesture-handler: '>=2.16.1' + react-native-reanimated: '>=3.16.0 || >=4.0.0-' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-native': + optional: true + dependencies: + '@gorhom/portal': 1.0.14(react-native@0.81.5)(react@19.1.0) + '@types/react': 19.1.17 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /@gorhom/portal@1.0.14(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + nanoid: 3.3.11 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@hookform/resolvers@5.2.2(react-hook-form@7.70.0): + resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} + peerDependencies: + react-hook-form: ^7.55.0 + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.70.0(react@18.3.1) + dev: false + + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + dev: true + + /@humanfs/node@0.16.7: + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/retry@0.4.3: + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: false + + /@iconify/utils@3.1.0: + resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + mlly: 1.8.0 + dev: false + + /@icons-pack/react-simple-icons@13.8.0(react@18.3.1): + resolution: {integrity: sha512-iZrhL1fSklfCCVn68IYHaAoKfcby3RakUTn2tRPyHBkhr2tkYqeQbjJWf+NizIYBzKBn2IarDJXmTdXd6CuEfw==} + peerDependencies: + react: ^16.13 || ^17 || ^18 || ^19 + dependencies: + react: 18.3.1 + dev: false + + /@ide/backoff@1.0.0: + resolution: {integrity: sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==} + dev: false + + /@img/colour@1.0.0: + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + requiresBuild: true + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.34.5: + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.34.5: + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.2.4: + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.2.4: + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.2.4: + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.2.4: + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-ppc64@1.2.4: + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-riscv64@1.2.4: + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.2.4: + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.2.4: + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.2.4: + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.2.4: + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm64@0.34.5: + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-arm@0.34.5: + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + dev: false + optional: true + + /@img/sharp-linux-ppc64@0.34.5: + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + dev: false + optional: true + + /@img/sharp-linux-riscv64@0.34.5: + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.34.5: + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.34.5: + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.34.5: + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.34.5: + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.8.0 + dev: false + optional: true + + /@img/sharp-wasm32@0.34.5: + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.8.0 + dev: false + optional: true + + /@img/sharp-win32-arm64@0.34.5: + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-ia32@0.34.5: + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.34.5: + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@internationalized/date@3.10.1: + resolution: {integrity: sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==} + dependencies: + '@swc/helpers': 0.5.18 + dev: false + + /@internationalized/number@3.6.5: + resolution: {integrity: sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==} + dependencies: + '@swc/helpers': 0.5.18 + dev: false + + /@isaacs/balanced-match@4.0.1: + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + /@isaacs/brace-expansion@5.0.0: + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/balanced-match': 4.0.1 + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.1.2 + dev: false + + /@isaacs/ttlcache@1.4.1: + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + /@jest/create-cache-key-function@29.7.0: + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.27 + jest-mock: 29.7.0 + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.19.27 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.28.5 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.27 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + /@jridgewell/gen-mapping@0.3.13: + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/remapping@2.3.5: + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.11: + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + /@jridgewell/sourcemap-codec@1.5.5: + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + /@jridgewell/trace-mapping@0.3.31: + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + /@kobalte/core@0.13.11(solid-js@1.9.10): + resolution: {integrity: sha512-hK7TYpdib/XDb/r/4XDBFaO9O+3ZHz4ZWryV4/3BfES+tSQVgg2IJupDnztKXB0BqbSRy/aWlHKw1SPtNPYCFQ==} + peerDependencies: + solid-js: ^1.8.15 + dependencies: + '@floating-ui/dom': 1.7.4 + '@internationalized/date': 3.10.1 + '@internationalized/number': 3.6.5 + '@kobalte/utils': 0.9.1(solid-js@1.9.10) + '@solid-primitives/props': 3.2.2(solid-js@1.9.10) + '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.10) + solid-js: 1.9.10 + solid-presence: 0.1.8(solid-js@1.9.10) + solid-prevent-scroll: 0.1.10(solid-js@1.9.10) + dev: false + + /@kobalte/utils@0.9.1(solid-js@1.9.10): + resolution: {integrity: sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==} + peerDependencies: + solid-js: ^1.8.8 + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) + '@solid-primitives/keyed': 1.5.2(solid-js@1.9.10) + '@solid-primitives/map': 0.4.13(solid-js@1.9.10) + '@solid-primitives/media': 2.3.3(solid-js@1.9.10) + '@solid-primitives/props': 3.2.2(solid-js@1.9.10) + '@solid-primitives/refs': 1.1.2(solid-js@1.9.10) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@kurkle/color@0.3.4: + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + dev: false + + /@lezer/common@1.5.0: + resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==} + dev: false + + /@lezer/cpp@1.1.4: + resolution: {integrity: sha512-aYSdZyUueeTgnfXQntiGUqKNW5WujlAsIbbHzkfJDneSZoyjPg8ObmWG3bzDPVYMC/Kf4l43WJLCunPnYFfQ0g==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/css@1.3.0: + resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/go@1.0.1: + resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/highlight@1.2.3: + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + dependencies: + '@lezer/common': 1.5.0 + dev: false + + /@lezer/html@1.3.13: + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/java@1.1.3: + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/javascript@1.5.4: + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/json@1.0.3: + resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/lr@1.4.5: + resolution: {integrity: sha512-/YTRKP5yPPSo1xImYQk7AZZMAgap0kegzqCSYHjAL9x1AZ0ZQW+IpcEzMKagCsbTsLnVeWkxYrCNeXG8xEPrjg==} + dependencies: + '@lezer/common': 1.5.0 + dev: false + + /@lezer/markdown@1.6.2: + resolution: {integrity: sha512-iNSdKrIK0FfOjVPVpV0fu7OykdncYpEzf4vkG9szFf60ql/ObZShoVbM9u1tgkogDOmubms1CyoNS2/unOXWNw==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + dev: false + + /@lezer/php@1.0.5: + resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/python@1.1.18: + resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/rust@1.0.2: + resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/sass@1.1.0: + resolution: {integrity: sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/xml@1.0.6: + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@lezer/yaml@1.0.3: + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + dependencies: + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@liquidglass/react@0.1.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tO90pmHmDTQqe+lYacjYaTfH0xnvuA+Bj1h5wq1y1GlDVFvXY3cT6sGLA6lJHYpUReC38FhmV0dyRdwrxx6TWg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@lokesh.dhakar/quantize@1.4.0: + resolution: {integrity: sha512-+//cqVWKis//t0YH62EDtwaFSPG/CDtYNg4CZmzNmG2d5W17Iu3fuDAdpQXCDHUDrrU9q0veze4A7tPZXlR/mg==} + dev: false + + /@lottiefiles/dotlottie-react@0.13.5(react@19.1.0): + resolution: {integrity: sha512-4U5okwjRqDPkjB572hfZtLXJ/LGfCo6vDwUB2KIPEUoSgqbIlw+UrbnaqVp3GS+dRvhMD27F2JObpHpYRlpF0Q==} + peerDependencies: + react: ^17 || ^18 || ^19 + dependencies: + '@lottiefiles/dotlottie-web': 0.44.0 + react: 19.1.0 + dev: false + + /@lottiefiles/dotlottie-web@0.44.0: + resolution: {integrity: sha512-IUWKVciDJI/BMWDWnh7j0Ngd0N8q9ySRAwm84aDqIE07qpmdZ7x1rkIpBaU1yHSNqNYHeh1Rxsl+LC3CY4f0KA==} + dev: false + + /@malept/cross-spawn-promise@2.0.0: + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + dependencies: + cross-spawn: 7.0.6 + dev: true + + /@malept/flatpak-bundler@0.4.0: + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@mantine/core@5.10.5(@emotion/react@11.14.0)(@mantine/hooks@5.10.5)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-F4tqHSEVM9D6/iSqHfPda+Xl5XgSEPHAAkT01Zwzj4Jnbd10qGrlqr/SFUop2CIcuKYnmra9XltUahUPXBC2BQ==} + peerDependencies: + '@mantine/hooks': 5.10.5 + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/react': 0.19.2(react-dom@18.3.1)(react@18.3.1) + '@mantine/hooks': 5.10.5(react@18.3.1) + '@mantine/styles': 5.10.5(@emotion/react@11.14.0)(react-dom@18.3.1)(react@18.3.1) + '@mantine/utils': 5.10.5(react@18.3.1) + '@radix-ui/react-scroll-area': 1.0.2(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-textarea-autosize: 8.3.4(@types/react@18.3.27)(react@18.3.1) + transitivePeerDependencies: + - '@emotion/react' + - '@types/react' + dev: false + + /@mantine/hooks@5.10.5(react@18.3.1): + resolution: {integrity: sha512-hFQp71QZDfivPzfIUOQZfMKLiOL/Cn2EnzacRlbUr55myteTfzYN8YMt+nzniE/6c4IRopFHEAdbKEtfyQc6kg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + dev: false + + /@mantine/styles@5.10.5(@emotion/react@11.14.0)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0NXk8c/XGzuTUkZc6KceF2NaTCMEu5mHR4ru0x+ttb9DGnLpHuGWduTHjSfr4hl6eAJgedD0zauO+VAhDzO9zA==} + peerDependencies: + '@emotion/react': '>=11.9.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + clsx: 1.1.1 + csstype: 3.0.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@mantine/utils@5.10.5(react@18.3.1): + resolution: {integrity: sha512-FGMq4dGs5HhDAtI0z46uzxzKKPmZ3h5uKUyKg1ZHoFR1mBtcUMbB6FylFmHqKFRWlJ5IXqX9dwmiVrLYUOfTmA==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.3.1 + dev: false + + /@marijn/find-cluster-break@1.0.2: + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + dev: false + + /@mermaid-js/parser@0.6.3: + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + dependencies: + langium: 3.3.1 + dev: false + + /@mixmark-io/domino@2.2.0: + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + dev: false + + /@motionone/animation@10.18.0: + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + dev: false + + /@motionone/dom@10.18.0: + resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 + dev: false + + /@motionone/easing@10.18.0: + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + dev: false + + /@motionone/generators@10.18.0: + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + dev: false + + /@motionone/types@10.17.1: + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + dev: false + + /@motionone/utils@10.18.0: + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + dev: false + + /@napi-rs/wasm-runtime@0.2.12: + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + requiresBuild: true + dependencies: + '@emnapi/core': 1.8.0 + '@emnapi/runtime': 1.8.0 + '@tybys/wasm-util': 0.10.1 + dev: true + optional: true + + /@next/env@15.5.9: + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + dev: false + + /@next/eslint-plugin-next@15.2.2: + resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} + dependencies: + fast-glob: 3.3.1 + dev: true + + /@next/swc-darwin-arm64@15.5.7: + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.5.7: + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.5.7: + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.5.7: + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.5.7: + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.5.7: + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.5.7: + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.5.7: + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/third-parties@15.5.9(next@15.5.9)(react@18.3.1): + resolution: {integrity: sha512-kX8u/o+NMUwib5Rn+J9zhx47wZZzgxW3Q/OTuqG4gcZS80jARZCU/9bQ5hGL6V9XGDWZiR/Lycs7Dg8Y+xOfCw==} + peerDependencies: + next: ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + dependencies: + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + third-party-capital: 1.0.20 + 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.20.1 + + /@nolyfill/is-core-module@1.0.39: + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + dev: true + + /@novu/client@2.6.6: + resolution: {integrity: sha512-XQSZVJaNMxCmrB9UkIC/06bQPdDwYiYEkJOjrgXFLU5N2WVnB75A25jptZuHzR2fLIsE+b1Vw1y2G2+OkzqFyw==} + engines: {node: '>=10'} + deprecated: April 3, 2025 marks the end of support for @novu/client. Users can migrate to the new @novu/js package. For more information, visit https://docs.novu.co/platform/sdks/javascript + dependencies: + '@novu/shared': 2.6.6 + dev: false + + /@novu/js@3.11.2: + resolution: {integrity: sha512-fe9QIlvalUBWvHkpPTYdfJfFk/U+DMojkXE2DjdDVnpnViPYffh/MwuJm2GzCAouCAUV6paZcf/pg0OR3ww4KQ==} + dependencies: + '@floating-ui/dom': 1.7.4 + '@kobalte/core': 0.13.11(solid-js@1.9.10) + '@types/json-logic-js': 2.0.8 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + event-target-polyfill: 0.0.4 + mitt: 3.0.1 + partysocket: 1.1.10 + socket.io-client: 4.7.2 + solid-floating-ui: 0.3.1(@floating-ui/dom@1.7.4)(solid-js@1.9.10) + solid-js: 1.9.10 + solid-motionone: 1.0.4(solid-js@1.9.10) + tailwind-merge: 2.6.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@novu/nextjs@3.11.2(next@15.5.9)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gQ0AEQPQ4AtucyjZ0G61BX/1lFqiBMqYyNiK9cv31gk/91QEDWmvePgm3RJqJCHCD79jzXTde04Mpl0lZeKI8Q==} + peerDependencies: + next: '>=13.5.2 || ^14.0.0 || ^15.0.0' + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + '@novu/react': 3.11.2(react-dom@18.3.1)(react@18.3.1) + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@novu/notification-center@2.0.0(@types/react@18.3.27)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-jzhk+KebehYkc2XSUMnkp+Zd18lfPLCSMBwnsYy5V+yE2QIRM1Lb73LQyNhRw71LfriSFFfAown7xlD1+L4/Vw==} + deprecated: April 3, 2025 marks the end of support for @novu/notification-center. Users can migrate to the new @novu/react or @novu/js package. For more information, visit https://docs.novu.co/platform/inbox/overview. To migrate to the new Novu refer to https://docs.novu.co/platform/inbox/react/migration-guide + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@18.3.27)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0)(@types/react@18.3.27)(react@18.3.1) + '@mantine/core': 5.10.5(@emotion/react@11.14.0)(@mantine/hooks@5.10.5)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@mantine/hooks': 5.10.5(react@18.3.1) + '@novu/client': 2.6.6 + '@novu/shared': 2.6.6 + '@tanstack/react-query': 4.42.0(react-dom@18.3.1)(react@18.3.1) + acorn-jsx: 5.3.2(acorn@8.15.0) + axios: 1.13.2 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.merge: 4.6.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-infinite-scroll-component: 6.1.1(react@18.3.1) + socket.io-client: 4.7.2 + tslib: 2.8.1 + webfontloader: 1.6.28 + transitivePeerDependencies: + - '@types/react' + - acorn + - bufferutil + - debug + - react-native + - supports-color + - utf-8-validate + dev: false + + /@novu/react@3.11.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-IIwYRJQP90pn7R/9EHf/AaKRPjls9JVinLGNheeHAMYVcKN2M4R2yMAVWADJ5TcAQ55ZRIBfpwI/4qCy1wLaMg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + '@novu/js': 3.11.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /@novu/shared@2.6.6: + resolution: {integrity: sha512-Y4YrvvJHX8yopkkvb4MnS+u59JBjUsrJBYqcn/STKkbbdzmSPccVwA0GUTiCZivUKSBtrTvllIHtP7Bi5ATQ4A==} + dev: false + + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.7.3 + dev: true + + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@number-flow/react@0.5.10(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-a8Wh5eNITn7Km4xbddAH7QH8eNmnduR6k34ER1hkHSGO4H2yU1DDnuAWLQM99vciGInFODemSc0tdxrXkJEpbA==} + peerDependencies: + react: ^18 || ^19 + react-dom: ^18 || ^19 + dependencies: + esm-env: 1.2.2 + number-flow: 0.5.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@parcel/watcher-android-arm64@2.5.1: + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.5.1: + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.5.1: + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.5.1: + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.5.1: + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-musl@2.5.1: + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.5.1: + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.5.1: + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.5.1: + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.5.1: + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-arm64@2.5.1: + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.5.1: + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.5.1: + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.5.1: + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@posthog/core@1.9.0: + resolution: {integrity: sha512-j7KSWxJTUtNyKynLt/p0hfip/3I46dWU2dk+pt7dKRoz2l5CYueHuHK4EO7Wlgno5yo1HO4sc4s30MXMTICHJw==} + dependencies: + cross-spawn: 7.0.6 + dev: false + + /@radix-ui/number@1.0.0: + resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==} + dependencies: + '@babel/runtime': 7.28.4 + dev: false + + /@radix-ui/number@1.1.1: + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.28.4 + dev: false + + /@radix-ui/primitive@1.1.3: + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + dev: false + + /@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==} + 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-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-accordion@1.2.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + 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-collapsible': 1.1.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-accordion@1.2.12(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + 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-collapsible': 1.1.12(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-collection': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-alert-dialog@1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dialog': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-arrow@1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-avatar@1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-avatar@1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==} + 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-context': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-checkbox@1.3.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-checkbox@1.3.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-collapsible@1.1.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collapsible@1.1.12(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.27)(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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-context-menu@2.2.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-context-menu@2.2.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} + 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-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-menu': 2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.2(@types/react@18.3.27)(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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.2(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-context@1.1.3(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} + 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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.3(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-dialog@1.0.0(@types/react@18.3.27)(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.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) + '@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.27)(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.27)(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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.27)(react@18.3.1) + dev: false + + /@radix-ui/react-dialog@1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@radix-ui/react-direction@1.0.0(react@18.3.1): + resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-direction@1.1.1(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + 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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-direction@1.1.1(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.1.17 + react: 19.1.0 + 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.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) + '@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.27)(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.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-dropdown-menu@2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-menu': 2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.27)(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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + 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.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) + 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.27)(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.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-form@0.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-hover-card@1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-hover-card@1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-icons@1.3.2(react@18.3.1): + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + dependencies: + 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.28.4 + '@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.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-id@1.1.1(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-label@2.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-label@2.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-label@2.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + 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-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.27)(react@18.3.1) + dev: false + + /@radix-ui/react-menu@2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + 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-collection': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@radix-ui/react-menubar@1.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} + 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-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-menubar@1.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} + 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-collection': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-menu': 2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + 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-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==} + 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/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.27)(react@18.3.1) + dev: false + + /@radix-ui/react-popover@1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + 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: + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/rect': 1.1.1 + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-popper@1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + 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: + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.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) + dev: false + + /@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.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 + 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.27)(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.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.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) + dev: false + + /@radix-ui/react-primitive@1.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.28.4 + '@radix-ui/react-slot': 1.0.1(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.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.1.4(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-progress@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-progress@1.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==} + 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-context': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-progress@1.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==} + 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-context': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.4(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-radio-group@1.3.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-radio-group@1.3.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + 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-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-roving-focus@1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + 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-collection': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-scroll-area@1.0.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.28.4 + '@radix-ui/number': 1.0.0 + '@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-direction': 1.0.0(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.1(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-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-scroll-area@1.2.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + 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/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-select@2.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + 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/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.27)(react@18.3.1) + dev: false + + /@radix-ui/react-select@2.2.6(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + 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/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@radix-ui/react-separator@1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + 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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-separator@1.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-slider@1.3.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} + 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/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + 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.28.4 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.0.1(react@18.3.1): + resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.28.4 + '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.2.0(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-slot@1.2.3(@types/react@18.3.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.2.3(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-slot@1.2.4(@types/react@18.3.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.2.4(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-switch@1.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-switch@1.2.6(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tabs@1.1.13(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + 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-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-toast@1.2.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + 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-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-toggle-group@1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-toggle-group@1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + 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-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-toggle': 1.1.10(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-toggle@1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + 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-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-toggle@1.1.10(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + 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-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-toolbar@1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} + 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-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + 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.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tooltip@1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-popper': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + 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.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.27)(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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + 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.28.4 + '@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.27)(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.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + 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.28.4 + '@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.27)(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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.17)(react@19.1.0): + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-use-is-hydrated@0.1.0(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + 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.27 + react: 18.3.1 + use-sync-external-store: 1.6.0(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.28.4 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.27)(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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-use-previous@1.1.1(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + 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.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-previous@1.1.1(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-use-rect@1.1.1(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.1 + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-rect@1.1.1(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.1 + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-use-size@1.1.1(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + 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.27)(react@18.3.1) + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-size@1.1.1(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + 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@19.1.17)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-visually-hidden@1.2.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + 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@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@types/react': 19.1.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + dev: false + + /@radix-ui/react-visually-hidden@1.2.4(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==} + 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.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/rect@1.1.1: + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + dev: false + + /@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5): + resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.65 <1.0 + dependencies: + merge-options: 3.0.4 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@react-native-masked-view/masked-view@0.3.2(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-XwuQoW7/GEgWRMovOQtX3A4PrXhyaZm0lVUiY8qJDvdngjLms9Cpdck6SmGAUNqQwcj2EadHC1HwL0bEyoa/SQ==} + peerDependencies: + react: '>=16' + react-native: '>=0.57' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@react-native-picker/picker@2.11.1(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-ThklnkK4fV3yynnIIRBkxxjxR4IFbdMNJVF6tlLdOJ/zEFUEFUEdXY0KmH0iYzMwY8W4/InWsLiA7AkpAbnexA==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /@react-native/assets-registry@0.81.5: + resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} + engines: {node: '>= 20.19.4'} + + /@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.28.5): + resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==} + engines: {node: '>= 20.19.4'} + dependencies: + '@babel/traverse': 7.28.5 + '@react-native/codegen': 0.81.5(@babel/core@7.28.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: false + + /@react-native/babel-preset@0.81.5(@babel/core@7.28.5): + resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.28.5) + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.5) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@react-native/codegen@0.81.5(@babel/core@7.28.5): + resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + glob: 7.2.3 + hermes-parser: 0.29.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + + /@react-native/community-cli-plugin@0.81.5: + resolution: {integrity: sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': '*' + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + dependencies: + '@react-native/dev-middleware': 0.81.5 + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + semver: 7.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /@react-native/debugger-frontend@0.81.5: + resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==} + engines: {node: '>= 20.19.4'} + + /@react-native/dev-middleware@0.81.5: + resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==} + engines: {node: '>= 20.19.4'} + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.81.5 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.2.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /@react-native/gradle-plugin@0.81.5: + resolution: {integrity: sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==} + engines: {node: '>= 20.19.4'} + + /@react-native/js-polyfills@0.81.5: + resolution: {integrity: sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==} + engines: {node: '>= 20.19.4'} + + /@react-native/normalize-colors@0.74.89: + resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} + dev: false + + /@react-native/normalize-colors@0.79.7: + resolution: {integrity: sha512-RrvewhdanEWhlyrHNWGXGZCc6MY0JGpNgRzA8y6OomDz0JmlnlIsbBHbNpPnIrt9Jh2KaV10KTscD1Ry8xU9gQ==} + dev: false + + /@react-native/normalize-colors@0.81.5: + resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==} + + /@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@types/react': ^19.1.0 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.1.17 + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + + /@react-navigation/bottom-tabs@7.9.0(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-024FWdHp3ZsE5rP8tmGI4vh+1z3wg8u8E9Frep8eeGoYo1h9rQhvgofQDGxknmrKsb7t8o8Dim+IZSvl57cPFQ==} + peerDependencies: + '@react-navigation/native': ^7.1.26 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + dependencies: + '@react-navigation/elements': 2.9.3(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.26(react-native@0.81.5)(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5)(react@19.1.0) + sf-symbols-typescript: 2.2.0 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + dev: false + + /@react-navigation/core@7.13.7(react@19.1.0): + resolution: {integrity: sha512-k2ABo3250vq1ovOh/iVwXS6Hwr5PVRGXoPh/ewVFOOuEKTvOx9i//OBzt8EF+HokBxS2HBRlR2b+aCOmscRqBw==} + peerDependencies: + react: '>= 18.2.0' + dependencies: + '@react-navigation/routers': 7.5.3 + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.1.0 + react-is: 19.2.3 + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + dev: false + + /@react-navigation/elements@2.9.3(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-3+eyvWiVPIEf6tN9UdduhOEHcTuNe3R5WovgiVkfH9+jApHMTZDc2loePTpY/i2HDJhObhhChpJzO6BVjrpdYQ==} + peerDependencies: + '@react-native-masked-view/masked-view': '>= 0.2.0' + '@react-navigation/native': ^7.1.26 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + peerDependenciesMeta: + '@react-native-masked-view/masked-view': + optional: true + dependencies: + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.26(react-native@0.81.5)(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + dev: false + + /@react-navigation/native-stack@7.9.0(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-C/mNPhI0Pnerl7C2cB+6fAkdgSmfKECMERrbyfjx3P6JmEuTC54o+GV1c62FUmlRaRUassVHbtw4EeaY2uLh0g==} + peerDependencies: + '@react-navigation/native': ^7.1.26 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + dependencies: + '@react-navigation/elements': 2.9.3(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.26(react-native@0.81.5)(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5)(react@19.1.0) + sf-symbols-typescript: 2.2.0 + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + dev: false + + /@react-navigation/native@7.1.26(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-RhKmeD0E2ejzKS6z8elAfdfwShpcdkYY8zJzvHYLq+wv183BBcElTeyMLcIX6wIn7QutXeI92Yi21t7aUWfqNQ==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + dependencies: + '@react-navigation/core': 7.13.7(react@19.1.0) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + dev: false + + /@react-navigation/routers@7.5.3: + resolution: {integrity: sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==} + dependencies: + nanoid: 3.3.11 + dev: false + + /@react-pdf/fns@3.1.2: + resolution: {integrity: sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==} + dev: false + + /@react-pdf/font@4.0.4: + resolution: {integrity: sha512-8YtgGtL511txIEc9AjiilpZ7yjid8uCd8OGUl6jaL3LIHnrToUupSN4IzsMQpVTCMYiDLFnDNQzpZsOYtRS/Pg==} + dependencies: + '@react-pdf/pdfkit': 4.1.0 + '@react-pdf/types': 2.9.2 + fontkit: 2.0.4 + is-url: 1.2.4 + dev: false + + /@react-pdf/image@3.0.4: + resolution: {integrity: sha512-z0ogVQE0bKqgXQ5smgzIU857rLV7bMgVdrYsu3UfXDDLSzI7QPvzf6MFTFllX6Dx2rcsF13E01dqKPtJEM799g==} + dependencies: + '@react-pdf/png-js': 3.0.0 + jay-peg: 1.1.1 + dev: false + + /@react-pdf/layout@4.4.2: + resolution: {integrity: sha512-gNu2oh8MiGR+NJZYTJ4c4q0nWCESBI6rKFiodVhE7OeVAjtzZzd6l65wsN7HXdWJqOZD3ttD97iE+tf5SOd/Yg==} + dependencies: + '@react-pdf/fns': 3.1.2 + '@react-pdf/image': 3.0.4 + '@react-pdf/primitives': 4.1.1 + '@react-pdf/stylesheet': 6.1.2 + '@react-pdf/textkit': 6.1.0 + '@react-pdf/types': 2.9.2 + emoji-regex-xs: 1.0.0 + queue: 6.0.2 + yoga-layout: 3.2.1 + dev: false + + /@react-pdf/pdfkit@4.1.0: + resolution: {integrity: sha512-Wm/IOAv0h/U5Ra94c/PltFJGcpTUd/fwVMVeFD6X9tTTPCttIwg0teRG1Lqq617J8K4W7jpL/B0HTH0mjp3QpQ==} + dependencies: + '@babel/runtime': 7.28.4 + '@react-pdf/png-js': 3.0.0 + browserify-zlib: 0.2.0 + crypto-js: 4.2.0 + fontkit: 2.0.4 + jay-peg: 1.1.1 + linebreak: 1.1.0 + vite-compatible-readable-stream: 3.6.1 + dev: false + + /@react-pdf/png-js@3.0.0: + resolution: {integrity: sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==} + dependencies: + browserify-zlib: 0.2.0 + dev: false + + /@react-pdf/primitives@4.1.1: + resolution: {integrity: sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==} + dev: false + + /@react-pdf/reconciler@2.0.0(react@18.3.1): + resolution: {integrity: sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + object-assign: 4.1.1 + react: 18.3.1 + scheduler: 0.25.0-rc-603e6108-20241029 + dev: false + + /@react-pdf/render@4.3.2: + resolution: {integrity: sha512-el5KYM1sH/PKcO4tRCIm8/AIEmhtraaONbwCrBhFdehoGv6JtgnXiMxHGAvZbI5kEg051GbyP+XIU6f6YbOu6Q==} + dependencies: + '@babel/runtime': 7.28.4 + '@react-pdf/fns': 3.1.2 + '@react-pdf/primitives': 4.1.1 + '@react-pdf/textkit': 6.1.0 + '@react-pdf/types': 2.9.2 + abs-svg-path: 0.1.1 + color-string: 1.9.1 + normalize-svg-path: 1.1.0 + parse-svg-path: 0.1.2 + svg-arc-to-cubic-bezier: 3.2.0 + dev: false + + /@react-pdf/renderer@4.3.2(react@18.3.1): + resolution: {integrity: sha512-EhPkj35gO9rXIyyx29W3j3axemvVY5RigMmlK4/6Ku0pXB8z9PEE/sz4ZBOShu2uot6V4xiCR3aG+t9IjJJlBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + '@babel/runtime': 7.28.4 + '@react-pdf/fns': 3.1.2 + '@react-pdf/font': 4.0.4 + '@react-pdf/layout': 4.4.2 + '@react-pdf/pdfkit': 4.1.0 + '@react-pdf/primitives': 4.1.1 + '@react-pdf/reconciler': 2.0.0(react@18.3.1) + '@react-pdf/render': 4.3.2 + '@react-pdf/types': 2.9.2 + events: 3.3.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + queue: 6.0.2 + react: 18.3.1 + dev: false + + /@react-pdf/stylesheet@6.1.2: + resolution: {integrity: sha512-E3ftGRYUQGKiN3JOgtGsLDo0hGekA6dmkmi/MYACytmPTKxQRBSO3126MebmCq+t1rgU9uRlREIEawJ+8nzSbw==} + dependencies: + '@react-pdf/fns': 3.1.2 + '@react-pdf/types': 2.9.2 + color-string: 1.9.1 + hsl-to-hex: 1.0.0 + media-engine: 1.0.3 + postcss-value-parser: 4.2.0 + dev: false + + /@react-pdf/textkit@6.1.0: + resolution: {integrity: sha512-sFlzDC9CDFrJsnL3B/+NHrk9+Advqk7iJZIStiYQDdskbow8GF/AGYrpIk+vWSnh35YxaGbHkqXq53XOxnyrjQ==} + dependencies: + '@react-pdf/fns': 3.1.2 + bidi-js: 1.0.3 + hyphen: 1.13.0 + unicode-properties: 1.4.1 + dev: false + + /@react-pdf/types@2.9.2: + resolution: {integrity: sha512-dufvpKId9OajLLbgn9q7VLUmyo1Jf+iyGk2ZHmCL8nIDtL8N1Ejh9TH7+pXXrR0tdie1nmnEb5Bz9U7g4hI4/g==} + dependencies: + '@react-pdf/font': 4.0.4 + '@react-pdf/primitives': 4.1.1 + '@react-pdf/stylesheet': 6.1.2 + dev: false + + /@reduxjs/toolkit@2.11.2(react-redux@9.2.0)(react@18.3.1): + resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + '@standard-schema/spec': 1.1.0 + '@standard-schema/utils': 0.3.0 + immer: 11.1.3 + react: 18.3.1 + react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.1 + dev: false + + /@remirror/core-constants@3.0.0: + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + dev: false + + /@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.5): + resolution: {integrity: sha512-lvzjoYn9nfJzBD5qdm3Ut6G3+Or2wEacYIDJ49h9+19WSChVnxv4ojf+rNmQ78ncuxIt/bfbMvDLMeMP0xze6g==} + peerDependencies: + '@codemirror/autocomplete': ^6.0.0 + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + '@lezer/highlight': ^1.0.0 + '@lezer/lr': ^1.0.0 + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /@replit/codemirror-lang-solidity@6.0.2(@codemirror/language@6.12.1): + resolution: {integrity: sha512-/dpTVH338KFV6SaDYYSadkB4bI/0B0QRF/bkt1XS3t3QtyR49mn6+2k0OUQhvt2ZSO7kt10J+OPilRAtgbmX0w==} + peerDependencies: + '@codemirror/language': ^6.0.0 + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/highlight': 1.2.3 + dev: false + + /@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.20.0)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.11)(@codemirror/lang-javascript@6.2.4)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/javascript@1.5.4)(@lezer/lr@1.4.5): + resolution: {integrity: sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==} + peerDependencies: + '@codemirror/autocomplete': ^6.0.0 + '@codemirror/lang-css': ^6.0.1 + '@codemirror/lang-html': ^6.2.0 + '@codemirror/lang-javascript': ^6.1.1 + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + '@lezer/highlight': ^1.0.0 + '@lezer/javascript': ^1.2.0 + '@lezer/lr': ^1.0.0 + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/lang-css': 6.3.1 + '@codemirror/lang-html': 6.4.11 + '@codemirror/lang-javascript': 6.2.4 + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + '@lezer/common': 1.5.0 + '@lezer/highlight': 1.2.3 + '@lezer/javascript': 1.5.4 + '@lezer/lr': 1.4.5 + dev: false + + /@revenuecat/purchases-js-hybrid-mappings@17.26.0: + resolution: {integrity: sha512-FBVSrPANEX7qz8F5kQi86vUiT3M7+lOGcty3ayuvcXvmAciVZBMvWXjFCGkv1dhPpkhTyVhS+7wBcRr8KizBLA==} + dependencies: + '@revenuecat/purchases-js': 1.23.0 + dev: false + + /@revenuecat/purchases-js@1.23.0: + resolution: {integrity: sha512-CtYO0Tk/+MSI4Ea16xs269v81wZWWISdBmYPIHmxclnuCfsV5zFl7bzV1LqO2za7xKWJwLwc5tcLeQng2bsY+w==} + dev: false + + /@revenuecat/purchases-typescript-internal@17.26.0: + resolution: {integrity: sha512-I9MbHSJm3TXrLwbh9KjTyInt1ZkZw20ahuNnlFOfR8QxazccagjXu7Tm8um9rIAofY1lvJf8DjQptfOvBJ0UQQ==} + dev: false + + /@rn-primitives/accordion@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-gt1NQC6XTbSN6KEqX3QDbvqO4kXFDKhQGiljL/pq1WO0iJNVaV47/3E8fLOZLEuj2FSkQblNhSvVc4WU/7qHoA==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-accordion': 1.2.12(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/alert-dialog@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-/XxvQVRMnIyQo29iuQ631CHjghGKY8U4k3gbsS2MCGP0hglZVFoBRiAF3Bgyr16LxWRu1DoPltvzwOrUCsB+YQ==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-alert-dialog': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/aspect-ratio@1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-IUQ6MR26AV1ckN+U3m8UjlgJMxB53sqPL3ri2rrGtmFPtq+Gv2luGEL79gWXIPZuDdXiBBwiyTUg6gao3JkZtw==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rn-primitives/avatar@1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-ic029KaJRADdjmjPzpaSaZ9QrtgGF8DnAA7TcQ/gYqUfLXjkbfzsjARKv7NtEoJLjWAcjIAK6R8JkcbMfPtYig==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rn-primitives/checkbox@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-FU/c81eoo6zGm4J4uCccjnqijrQ0grMkt6W3xhnOFkxqxiU2QrnlXN7ddhm2yN+s8CNnke4bOj/xr78wIaYfiw==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-checkbox': 1.3.3(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/collapsible@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-JLmGpQ+7VBqNVS0QqpWqHakIpwzbpbPyaWy/czCQa97mcz+TqUHXVtHXuf2UWyW/Cix/JRAro+Vpld4YN0glPg==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-collapsible': 1.1.12(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/context-menu@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-sHmqVeRyPM0UgTZIwmHmjQfRLiPZu1lIDwGmqTLPdiQNsN+P1zsDVgrMFqbd+GTBkHQWJaM03DpSe9neKAUnQQ==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-context-menu': 2.2.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/utils': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/dialog@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-18q+SZe7ioyMQRYIL+aSleqque1Ky18LOQGA8kDPryrGMf16LYStd61SshMlluqhL2T00ZkEjsSVgpU5ZXvcnQ==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/dropdown-menu@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-TJDDr8VQfw9CRZ7xZ6kBYLVMqL1xFVC5ZZ4sfRmWP6PCT0lNks4XqGuTFLeVVlNLPSmzt9GKC2DZqzDXui8/NQ==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/utils': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/hooks@1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-BR97reSu7uVDpyMeQdRJHT0w8KdS6jdYnOL6xQtqS2q3H6N7vXBlX4LFERqJZphD+aziJFIAJ3HJF1vtt6XlpQ==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rn-primitives/hover-card@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-YesqV3rEIhvsarA1Aq6pmkNlmQn5rWpmjHP4s4JIrceaQjSwl9Rmnvzp7qHg0CN3AOd803hNyplMn9vn8Z3g6Q==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-hover-card': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/popover': 1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/label@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-eThBr6vn2jS81ZS4JNcg0+02TkEircH4bZmjF4IZUDl4XRpevwK95NyOkbfhGYmpVbAuisAVxDmvNOQ4OVjfug==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-label': 2.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/menubar@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-kcGHHqHHBEtC8+Oz9rUt39XSY69opxSF+VJyJtAkQra8ewKqf6gJofU2KHwQT8XmpbartxUBHkI8yjVHQ6zGkw==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-menubar': 1.1.16(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/utils': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/popover@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-QJ2T+RcF1FyTQy58Nz8Bwy5lnan5Rt7xQPl8rB2n7DBCGOnZNhEub5LoHm+gjmskGo9t1JyNKoEAD7I4j/7jQQ==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-popover': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/portal@1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-a2DSce7TcSfcs0cCngLadAJOvx/+mdH9NRu+GxkX8NPRsGGhJvDEOqouMgDqLwx7z9mjXoUaZcwaVcemUSW9/A==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + zustand: 5.0.9(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + dev: false + + /@rn-primitives/progress@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-bbO4WGSNAd2idYDW0ma4xCX9UFOjNK3U4F4hLRhMKglz3c/QVYfpKvlGQ0Y0d7kpelA7MQizvFeqGGYfxSuisw==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-progress': 1.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/radio-group@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-H/u3E4S6FmvDyWSgs3uLg0I5t12i8E2JGJRelbKv5QzLSLdq8684dLfCbwuNjs/OzDAi5x1l27bf9+Jw42MvNw==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-radio-group': 1.3.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/select@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-W3qFkdSAFPnjNMM7II5MiLCItjWOGXr8f+3obPtLAHcWrcsX/d1KogmplWXwmhBvVStCgE1OpJAD3DE2CHx9Rw==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-select': 2.2.6(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/separator@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-1suBbXNm7cNEP/eKshh3xsn5dPNp532qU9fBfBA5mW9ZN5pUO3wrwv974heluVX/pOXBZ+li3HGN/Aos134stA==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-separator': 1.1.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/slot@1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-cpbn+JLjSeq3wcA4uqgFsUimMrWYWx2Ks7r5rkwd1ds1utxynsGkLOKpYVQkATwWrYhtcoF1raxIKEqXuMN+/w==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rn-primitives/switch@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-M4r4LvLUFgn3SIkrMuEkDIxnRbHPLZF2cvKhdHmsk1vk6DSIw3WxYEA+0GkU6a8wnOCFzWRl4kHh5+x86bo1/w==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-switch': 1.2.6(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/tabs@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-sKqVYQD1s46eS8kGBsCGxJrtZ4my+sjXD5m2auGSdTJmJ8dNYqZJEI1caiMm64ZvRuQDe2bFsekAFGexBD4qUQ==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-tabs': 1.1.13(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/toggle-group@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-xCbYZzGzCbr/3pu3xE9pEKzuXU5LHT0ZlK9WMdECQUHLRjSI2A6KnUiZJ+JqZ3lzcVlgCE2lZeZXmpvVyBXnNQ==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-toggle-group': 1.1.11(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/utils': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/toggle@1.2.0(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-pVhlIdGCOaxBmcrSUYF3EUTeqOoLHCYEuj/qo64Ai89DnI5aSmReBgpttY5v/r0gNrku9dJZfrOe+uGzWNUn8Q==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-toggle': 1.1.10(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/tooltip@1.2.0(@rn-primitives/portal@1.3.0)(@types/react@19.1.17)(react-dom@19.1.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-Fn1Y/maW1o64QI+nmBj2jBI/KdCEXv8kVGbDjjDFI68KUxDjuig/hACLiD7fEbLBhZqB/QnHUSRsnPUUOOVGdA==} + peerDependencies: + '@rn-primitives/portal': '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + '@radix-ui/react-tooltip': 1.2.8(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@rn-primitives/hooks': 1.3.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/portal': 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/slot': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + '@rn-primitives/types': 1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + dev: false + + /@rn-primitives/types@1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-b+6zKgdKVqAfaFPSfhwlQL0dnPQXPpW890m3eguC0VDI1eOsoEvUfVb6lmgH4bum9MmI0xymq4tOUI/fsKLoCQ==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rn-primitives/utils@1.2.0(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-vLXV5NuxIHDeb4Bw57FzdUh89/g8gz6GERm8TsbJaSUPsDXfnC/ffeYiZJb0LxNteKE3Nr8na4Jy2n26tFil7w==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /@rtsao/scc@1.1.0: + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + dev: true + + /@rushstack/eslint-patch@1.15.0: + resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} + dev: true + + /@schummar/icu-type-parser@1.21.5: + resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} + dev: false + + /@shikijs/core@3.20.0: + resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + /@shikijs/engine-javascript@3.20.0: + resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + /@shikijs/engine-oniguruma@3.20.0: + resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + + /@shikijs/langs@3.20.0: + resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} + dependencies: + '@shikijs/types': 3.20.0 + + /@shikijs/themes@3.20.0: + resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} + dependencies: + '@shikijs/types': 3.20.0 + + /@shikijs/transformers@3.20.0: + resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/types': 3.20.0 + dev: false + + /@shikijs/types@3.20.0: + resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + /@shikijs/vscode-textmate@10.0.2: + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + /@silevis/reactgrid@4.1.17(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZsERvyRSR3j55xvHicSRLuca8NH5yakZklbpWj1AQ6mA2ht7YlQjVMQ94q7ZL7UcPSdgavxBIU4vtDrlYvaXeA==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.2.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.2.0 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sass: 1.97.1 + tslib: 2.8.1 + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@solid-primitives/event-listener@2.4.3(solid-js@1.9.10): + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/keyed@1.5.2(solid-js@1.9.10): + resolution: {integrity: sha512-BgoEdqPw48URnI+L5sZIHdF4ua4Las1eWEBBPaoSFs42kkhnHue+rwCBPL2Z9ebOyQ75sUhUfOETdJfmv0D6Kg==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + solid-js: 1.9.10 + dev: false + + /@solid-primitives/map@0.4.13(solid-js@1.9.10): + resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/trigger': 1.2.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/media@2.3.3(solid-js@1.9.10): + resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.10) + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.10) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/props@3.2.2(solid-js@1.9.10): + resolution: {integrity: sha512-lZOTwFJajBrshSyg14nBMEP0h8MXzPowGO0s3OeiR3z6nXHTfj0FhzDtJMv+VYoRJKQHG2QRnJTgCzK6erARAw==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/refs@1.1.2(solid-js@1.9.10): + resolution: {integrity: sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/resize-observer@2.1.3(solid-js@1.9.10): + resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.10) + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.10) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/rootless@1.5.2(solid-js@1.9.10): + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/static-store@0.1.2(solid-js@1.9.10): + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/transition-group@1.1.2(solid-js@1.9.10): + resolution: {integrity: sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + solid-js: 1.9.10 + dev: false + + /@solid-primitives/trigger@1.2.2(solid-js@1.9.10): + resolution: {integrity: sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /@solid-primitives/utils@6.3.2(solid-js@1.9.10): + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + solid-js: 1.9.10 + dev: false + + /@standard-schema/spec@1.1.0: + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + dev: false + + /@standard-schema/utils@0.3.0: + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + dev: false + + /@supabase/auth-js@2.89.0: + resolution: {integrity: sha512-wiWZdz8WMad8LQdJMWYDZ2SJtZP5MwMqzQq3ehtW2ngiI3UTgbKiFrvMUUS3KADiVlk4LiGfODB2mrYx7w2f8w==} + engines: {node: '>=20.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@supabase/functions-js@2.89.0: + resolution: {integrity: sha512-XEueaC5gMe5NufNYfBh9kPwJlP5M2f+Ogr8rvhmRDAZNHgY6mI35RCkYDijd92pMcNM7g8pUUJov93UGUnqfyw==} + engines: {node: '>=20.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@supabase/postgrest-js@2.89.0: + resolution: {integrity: sha512-/b0fKrxV9i7RNOEXMno/I1862RsYhuUo+Q6m6z3ar1f4ulTMXnDfv0y4YYxK2POcgrOXQOgKYQx1eArybyNvtg==} + engines: {node: '>=20.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + + /@supabase/realtime-js@2.89.0: + resolution: {integrity: sha512-aMOvfDb2a52u6PX6jrrjvACHXGV3zsOlWRzZsTIOAJa0hOVvRp01AwC1+nLTGUzxzezejrYeCX+KnnM1xHdl+w==} + engines: {node: '>=20.0.0'} + dependencies: + '@types/phoenix': 1.6.7 + '@types/ws': 8.18.1 + tslib: 2.8.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@supabase/ssr@0.8.0(@supabase/supabase-js@2.89.0): + resolution: {integrity: sha512-/PKk8kNFSs8QvvJ2vOww1mF5/c5W8y42duYtXvkOSe+yZKRgTTZywYG2l41pjhNomqESZCpZtXuWmYjFRMV+dw==} + peerDependencies: + '@supabase/supabase-js': ^2.76.1 + dependencies: + '@supabase/supabase-js': 2.89.0 + cookie: 1.1.1 + dev: false + + /@supabase/storage-js@2.89.0: + resolution: {integrity: sha512-6zKcXofk/M/4Eato7iqpRh+B+vnxeiTumCIP+Tz26xEqIiywzD9JxHq+udRrDuv6hXE+pmetvJd8n5wcf4MFRQ==} + engines: {node: '>=20.0.0'} + dependencies: + iceberg-js: 0.8.1 + tslib: 2.8.1 + dev: false + + /@supabase/supabase-js@2.89.0: + resolution: {integrity: sha512-KlaRwSfFA0fD73PYVMHj5/iXFtQGCcX7PSx0FdQwYEEw9b2wqM7GxadY+5YwcmuEhalmjFB/YvqaoNVF+sWUlg==} + engines: {node: '>=20.0.0'} + dependencies: + '@supabase/auth-js': 2.89.0 + '@supabase/functions-js': 2.89.0 + '@supabase/postgrest-js': 2.89.0 + '@supabase/realtime-js': 2.89.0 + '@supabase/storage-js': 2.89.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.5): + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.5): + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + dev: true + + /@svgr/babel-preset@8.1.0(@babel/core@7.28.5): + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.5) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.5) + dev: true + + /@svgr/core@8.1.0(typescript@5.9.3): + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@svgr/hast-util-to-babel-ast@8.0.0: + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.28.5 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.9.3): + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 8.1.0(typescript@5.9.3) + cosmiconfig: 8.3.6(typescript@5.9.3) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + dev: true + + /@swc/core-darwin-arm64@1.15.8: + resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-x64@1.15.8: + resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm-gnueabihf@1.15.8: + resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-gnu@1.15.8: + resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-musl@1.15.8: + resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-gnu@1.15.8: + resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-musl@1.15.8: + resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-arm64-msvc@1.15.8: + resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-ia32-msvc@1.15.8: + resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-x64-msvc@1.15.8: + resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core@1.15.8: + resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.8 + '@swc/core-darwin-x64': 1.15.8 + '@swc/core-linux-arm-gnueabihf': 1.15.8 + '@swc/core-linux-arm64-gnu': 1.15.8 + '@swc/core-linux-arm64-musl': 1.15.8 + '@swc/core-linux-x64-gnu': 1.15.8 + '@swc/core-linux-x64-musl': 1.15.8 + '@swc/core-win32-arm64-msvc': 1.15.8 + '@swc/core-win32-ia32-msvc': 1.15.8 + '@swc/core-win32-x64-msvc': 1.15.8 + dev: false + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + + /@swc/helpers@0.5.18: + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + dependencies: + tslib: 2.8.1 + dev: false + + /@swc/types@0.1.25: + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + dependencies: + '@swc/counter': 0.1.3 + dev: false + + /@syncfusion/ej2-base@32.1.19: + resolution: {integrity: sha512-kWxMNM/cZh6yHQlPM5Mrquqdf9SedNN1WBhscxFtlVsIdqqaZq8FNc2ofuMXFeohti/KaWct5jtzwKo+VFRrkw==} + hasBin: true + dependencies: + '@syncfusion/ej2-icons': 32.1.19 + dev: false + + /@syncfusion/ej2-buttons@32.1.21: + resolution: {integrity: sha512-hnLVdiUScrpvheNyHg+KmFCVCOyEi0s4UspT59+5NN2NDIWw8BsZbtx/XIiqrYtDn2orLUwIX3NhKVOLjijvhg==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + dev: false + + /@syncfusion/ej2-calendars@32.1.21: + resolution: {integrity: sha512-ps5+WyWhX+vwMm2DpTwRXP0lc7Lvak0cA9BhVE8pnkbR3IZfogo0pMQpVeJcnAmmhoihJoC9Pc8UyBAcsde/Qg==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-inputs': 32.1.20 + '@syncfusion/ej2-lists': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-charts@32.1.19: + resolution: {integrity: sha512-q9YkMTw4AEh8XcCo0HBFHEDGCV+McWq2gf8cPxKHCexcLF1iooRtG6CLSCmMb5Op0Fg4wIeIEEKcGYhf8iwoow==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-calendars': 32.1.21 + '@syncfusion/ej2-data': 32.1.19 + '@syncfusion/ej2-excel-export': 32.1.19 + '@syncfusion/ej2-navigations': 32.1.19 + '@syncfusion/ej2-pdf-export': 32.1.19 + '@syncfusion/ej2-svg-base': 32.1.19 + dev: false + + /@syncfusion/ej2-compression@32.1.19: + resolution: {integrity: sha512-EzCpNNRI/F2KQkD6mhrMcDiQ7pbY5GZik80EQctFXyF87Ov5nn9+8qfMr42gM5tTwKLBtCgFXpj4sIlkwY2gGA==} + dependencies: + '@syncfusion/ej2-file-utils': 32.1.19 + dev: false + + /@syncfusion/ej2-data@32.1.19: + resolution: {integrity: sha512-/MeGbdM3TxesOS0zj8xUQ6dscD7KHU81yS7d5cT2h4L9H0DgmOMpvVBH3PP0cbDGjikch0nI36ghqyc2zNxUVg==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + dev: false + + /@syncfusion/ej2-dropdowns@32.1.21: + resolution: {integrity: sha512-/zQf9KnmdZK5g5h+/+/ohus9mNeZycKf6lD0oAMZk4mHCgp0nzEDdF7CXrTM54WivH7A9WfHVoTiGwLovhTtJA==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-data': 32.1.19 + '@syncfusion/ej2-inputs': 32.1.20 + '@syncfusion/ej2-lists': 32.1.19 + '@syncfusion/ej2-navigations': 32.1.19 + '@syncfusion/ej2-notifications': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-excel-export@32.1.19: + resolution: {integrity: sha512-BF05J1CJQTSFKe3u+bKM99t81N5Tbhe9y3B1LCKWKT7T6HOV5hPqQKxENeJpOiSttwimS89VCqsjmgK3XNGrPw==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-compression': 32.1.19 + dev: false + + /@syncfusion/ej2-file-utils@32.1.19: + resolution: {integrity: sha512-B33eTLbuxU6fOAe7KjxdBvfonm835oXNWee140o3IEMHTk1BGj1xL5bKRS8uqmVkrmuH0JacHzBkVM2P4yYSvQ==} + dev: false + + /@syncfusion/ej2-grids@32.1.21: + resolution: {integrity: sha512-ytpnGXE7sO3y8C84/pIOP0rdutVvI6+dtn6t8HGsysPkEL1iP6J1DdmpJtfvAriD+oRrQNi/j6LOqJsYjNb6uQ==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-calendars': 32.1.21 + '@syncfusion/ej2-compression': 32.1.19 + '@syncfusion/ej2-data': 32.1.19 + '@syncfusion/ej2-dropdowns': 32.1.21 + '@syncfusion/ej2-excel-export': 32.1.19 + '@syncfusion/ej2-file-utils': 32.1.19 + '@syncfusion/ej2-inputs': 32.1.20 + '@syncfusion/ej2-lists': 32.1.19 + '@syncfusion/ej2-navigations': 32.1.19 + '@syncfusion/ej2-notifications': 32.1.19 + '@syncfusion/ej2-pdf-export': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + '@syncfusion/ej2-splitbuttons': 32.1.19 + dev: false + + /@syncfusion/ej2-icons@32.1.19: + resolution: {integrity: sha512-qZ0NNP0qWQ9EwkakpCwu27ECGEM5Db9dBscBvpZ2rmq1rDDi9d/8VEu6+EmFED5R6Sh3cGVJpI1izw9fsfsKmg==} + dev: false + + /@syncfusion/ej2-inputs@32.1.20: + resolution: {integrity: sha512-Q/i5ZLV2+OARcMcHHudHGvSFqG2wlMu6UA5hZAjoEqH/hPWdgnJiE0AZ92C6Ee1awHDlNAESW+VO3TlFRGTxKw==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-popups': 32.1.19 + '@syncfusion/ej2-splitbuttons': 32.1.19 + dev: false + + /@syncfusion/ej2-lists@32.1.19: + resolution: {integrity: sha512-uUwmASVpS3H52aXDNcyfJUljTcG1p1O90Bh6XPbKlXXJ38Np/y8b6kzwgTZgjSzk5OK+hhT6Cgz0QFGgskSeng==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-data': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-navigations@32.1.19: + resolution: {integrity: sha512-eBPHbkQV0bAwiUJ4qvhh/6co6ElSu5oOaV/T0YlyphnedFU49vFb2CS34YhV5fuEXgq1yViIzbk1xsZTl1VHjg==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-data': 32.1.19 + '@syncfusion/ej2-inputs': 32.1.20 + '@syncfusion/ej2-lists': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-notifications@32.1.19: + resolution: {integrity: sha512-fKuBAzHUk7HJV7x6QnA0820vIi9t1EcGfL9CxjTxpKMVhlxIXAo6SFWXGPE4cCbHd8VKnm0VTmezdSZIg95GPw==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-pdf-export@32.1.19: + resolution: {integrity: sha512-uBaydsgjN1TcLIOBJw3SFXucfqxbP9+G6oZybkP96EyZIOKms7H2WkkB+zROgmsR2krGuRyDuJfhW8+tuL6zjA==} + dependencies: + '@syncfusion/ej2-compression': 32.1.19 + dev: false + + /@syncfusion/ej2-popups@32.1.19: + resolution: {integrity: sha512-tLvUwroBP8nlnpX/TmBh9VgDckqnYAgv6weAqVYoS7KC7Osfm+FdB09I82d/448luzD9Vt5Cm51dumLLGjZ6sQ==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-buttons': 32.1.21 + dev: false + + /@syncfusion/ej2-react-base@32.1.21: + resolution: {integrity: sha512-lO8CYEufJitbR9zrErIDO819yGCjRIBN5+2xnHMKcxuGUIz3u+UoPXQw7vY26jBuaXc4Va9UdXmBdyJbwCGiQA==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + dev: false + + /@syncfusion/ej2-react-spreadsheet@32.1.21: + resolution: {integrity: sha512-WsD+T07KlkeXHYa+LXPNO3VZdrEPlDbpkQ/CyhUicQTXclXsHeq3Pjpm1IothH3n/Yky1rx8lxqk1VHU9WYs1w==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-react-base': 32.1.21 + '@syncfusion/ej2-spreadsheet': 32.1.21 + dev: false + + /@syncfusion/ej2-splitbuttons@32.1.19: + resolution: {integrity: sha512-KHG4DDBx+uK/eBIRLM+Saa17ScUK+gMj3h0+XQFeDrSynZhwOH9lxdCVUkjpW8lCjEdfKYy7xpe8fV5egNI/cA==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-popups': 32.1.19 + dev: false + + /@syncfusion/ej2-spreadsheet@32.1.21: + resolution: {integrity: sha512-YtwVkY4KFZx375ugeJ+bv6PR8M3FefFYTcvs2m3rxtkgilxpbOmrcTY6zEL6B0venjq8Iy2pg+kCR8xo+O0PUA==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + '@syncfusion/ej2-charts': 32.1.19 + '@syncfusion/ej2-dropdowns': 32.1.21 + '@syncfusion/ej2-grids': 32.1.21 + '@syncfusion/ej2-navigations': 32.1.19 + dev: false + + /@syncfusion/ej2-svg-base@32.1.19: + resolution: {integrity: sha512-pXjstNDrGrte/rv17711N0IgYCy7gF9pKqEW/hVB8kQqazYLWRvt0Ni2qlFwVua0RQxHd7xmGRxVbS3OrS3r5w==} + dependencies: + '@syncfusion/ej2-base': 32.1.19 + dev: false + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@tailwindcss/node@4.1.18: + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + dev: true + + /@tailwindcss/oxide-android-arm64@4.1.18: + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-darwin-arm64@4.1.18: + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-darwin-x64@4.1.18: + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-freebsd-x64@4.1.18: + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18: + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm64-gnu@4.1.18: + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm64-musl@4.1.18: + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-x64-gnu@4.1.18: + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-x64-musl@4.1.18: + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-wasm32-wasi@4.1.18: + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dev: true + optional: true + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + /@tailwindcss/oxide-win32-arm64-msvc@4.1.18: + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-win32-x64-msvc@4.1.18: + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide@4.1.18: + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + dev: true + + /@tailwindcss/postcss@4.1.18: + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 + dev: true + + /@tailwindcss/typography@0.5.19(tailwindcss@4.1.18): + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.18 + dev: false + + /@tanstack/query-core@4.41.0: + resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} + dev: false + + /@tanstack/query-core@5.90.16: + resolution: {integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==} + dev: false + + /@tanstack/query-devtools@5.92.0: + resolution: {integrity: sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==} + dev: false + + /@tanstack/react-query-devtools@5.91.2(@tanstack/react-query@5.90.16)(react@18.3.1): + resolution: {integrity: sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==} + peerDependencies: + '@tanstack/react-query': ^5.90.14 + react: ^18 || ^19 + dependencies: + '@tanstack/query-devtools': 5.92.0 + '@tanstack/react-query': 5.90.16(react@18.3.1) + react: 18.3.1 + dev: false + + /@tanstack/react-query@4.42.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-j0tiofkzE3CSrYKmVRaKuwGgvCE+P2OOEDlhmfjeZf5ufcuFHwYwwgw3j08n4WYPVZ+OpsHblcFYezhKA3jDwg==} + 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 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.41.0 + 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 + + /@tanstack/react-query@5.90.16(react@18.3.1): + resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} + peerDependencies: + react: ^18 || ^19 + dependencies: + '@tanstack/query-core': 5.90.16 + react: 18.3.1 + dev: false + + /@tanstack/react-query@5.90.16(react@19.1.0): + resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} + peerDependencies: + react: ^18 || ^19 + dependencies: + '@tanstack/query-core': 5.90.16 + react: 19.1.0 + dev: false + + /@tanstack/react-table@8.21.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@tanstack/table-core': 8.21.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@tanstack/table-core@8.21.3: + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + dev: false + + /@tiptap/core@3.14.0(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-nm0VWVA1Vq/jaKY3wyRXViL/kf78yMdH7qETpv4qZXDQLU+pdWV3IGoRTQTKESc7d8L1wL/2uCeByLNUJfrSIw==} + peerDependencies: + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-blockquote@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-I7aOqcVLHBgCeRtMaMHA+ILSS8Sli46fjFq8477stOpQ79TPiBd6e4SDuFCAu58M94mVLMvlPKF2Eh5IvbIMyQ==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-bold@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-T4ma6VLoHm9JupglidD3CfZXm89A3HMv99gLplXNizvy1mlr4R3uC3aBqKw6lAP+NoqCqbIgjwc4YYsqZClNwA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-bubble-menu@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-nraHy+5jumT67J7hWrCuVwVTS2vNj4FpV5kO8epVySBmgEBr/7Pyi4w7mQA1VRVOMdjeN9iypbgQ2rKhpfaoTw==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-bullet-list@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-luqPX4u52hiOAHJ95mYsNE+x+9dZxsM461Xny9d/eTXLjAcnwS7MghjrnpljvyYsSXNiwQtxUyEr4uEZZJ5gIQ==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-character-count@3.14.0(@tiptap/extensions@3.14.0): + resolution: {integrity: sha512-zFsY68XMAngRh4D5ILhV4Y1WSW4Fv4ZdfYspf4XgG6HjUm9LhzndkYHQ7aSLoUAmjz0CA+Pwox7PuP2WnV+BMA==} + peerDependencies: + '@tiptap/extensions': ^3.14.0 + dependencies: + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-code-block-lowlight@3.14.0(@tiptap/core@3.14.0)(@tiptap/extension-code-block@3.14.0)(@tiptap/pm@3.14.0)(highlight.js@11.11.1)(lowlight@3.3.0): + resolution: {integrity: sha512-vkiDvPZUadrjAGNzvJYYXl5R+U1XmGALSbm+VlrGCR7iXHgYaMHdkqxHwGZMSqtsF2szPEqcAzLZShlAKl+AkA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/extension-code-block': ^3.14.0 + '@tiptap/pm': ^3.14.0 + highlight.js: ^11 + lowlight: ^2 || ^3 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/extension-code-block': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + highlight.js: 11.11.1 + lowlight: 3.3.0 + dev: false + + /@tiptap/extension-code-block@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-hRSdIhhm3Q9JBMQdKaifRVFnAa4sG+M7l1QcTKR3VSYVy2/oR0U+aiOifi5OvMRBUwhaR71Ro+cMT9FH9s26Kg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-code@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-Sx9yLorzS+oqNmXID4jt0G5tDnsEgU0HtEXPLD3KNt/ltVxWJU0AXwCsp1/Dg0HIDL868vWpJ2jC1t/4oaf9kA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-collaboration@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/y-tiptap@3.0.1)(yjs@13.6.29): + resolution: {integrity: sha512-6DgquRiAw/Mf8Y5KqQ+O9muZAmAWU9RaK5tZHrd8+OLkiGBxH891cZ2WA5jNaCl4T9hSJrpcMNJ3lxmBbxLGPg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + '@tiptap/y-tiptap': ^3.0.0 + yjs: ^13 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7)(yjs@13.6.29) + yjs: 13.6.29 + dev: false + + /@tiptap/extension-color@3.14.0(@tiptap/extension-text-style@3.14.0): + resolution: {integrity: sha512-jrHc4HQmAQlU1PlPu0St2T+abKAjs67FV6kpdPUXdlPjXVqm1g3AzSll2QcNoTXNQyH2cZhVTEC6rYqJDwcq5w==} + peerDependencies: + '@tiptap/extension-text-style': ^3.14.0 + dependencies: + '@tiptap/extension-text-style': 3.14.0(@tiptap/core@3.14.0) + dev: false + + /@tiptap/extension-details@3.14.0(@tiptap/core@3.14.0)(@tiptap/extension-text-style@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-YJyup+/ejKlikCkyLgClTT3ZidZ1B3/vvveEtIY+veM0aCbnw6HThunZk2U7dPJIpAtP7Qo9emUOSuBBCTENaA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/extension-text-style': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/extension-text-style': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-document@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-O3D7/GPB3XrWGy0y/b4LMHiY0eTd+dyIbSdiFtmUnbC/E9lqQLw43GiqvD9Gm6AyKhBA+Z45dKMbaOe1c6eTwQ==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-dropcursor@3.14.0(@tiptap/extensions@3.14.0): + resolution: {integrity: sha512-IwHyiZKLjV9WSBlQFS+afMjucIML8wFAKkG8UKCu+CVOe/Qd1ImDGyv6rzPlCmefJkDHIUWS+c2STapJlUD1VQ==} + peerDependencies: + '@tiptap/extensions': ^3.14.0 + dependencies: + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-emoji@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/suggestion@3.14.0)(emojibase@17.0.0): + resolution: {integrity: sha512-kOmRiqHeWWyajW4+EydxfayR/Nsn/GoIthbp/SNXiJl4z3CKSUXICRj8aPSeLxCyiKETZLJVDL0v3oHvmw/+0Q==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + '@tiptap/suggestion': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + '@tiptap/suggestion': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + emoji-regex: 10.6.0 + emojibase-data: 15.3.2(emojibase@17.0.0) + is-emoji-supported: 0.0.5 + transitivePeerDependencies: + - emojibase + dev: false + + /@tiptap/extension-floating-menu@3.14.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-+ErwDF74NzX4JV0nXMSIUT9V8FDdo85r0SaBZ8lb2NLmElaA3LDklcNV7SsoKlRcwsAXtFkqQbDwXLNGQLYSPQ==} + requiresBuild: true + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@floating-ui/dom': 1.7.4 + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + optional: true + + /@tiptap/extension-font-family@3.14.0(@tiptap/extension-text-style@3.14.0): + resolution: {integrity: sha512-xY8xtvCAU+kdHYx2tg8lGgegttf4XuEZhW8TVXmrbMe50MVY5saujZzSxojx/etdEsXkrmamT8VVNJREmwiFsQ==} + peerDependencies: + '@tiptap/extension-text-style': ^3.14.0 + dependencies: + '@tiptap/extension-text-style': 3.14.0(@tiptap/core@3.14.0) + dev: false + + /@tiptap/extension-gapcursor@3.14.0(@tiptap/extensions@3.14.0): + resolution: {integrity: sha512-hMg2U59+c9FreYtTvzxx5GWKejdZLRITMLEu4OTfrgQok6uF4qkzGEEqmYqPiHk08TBqAg18Y5bbpyqTsuit9A==} + peerDependencies: + '@tiptap/extensions': ^3.14.0 + dependencies: + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-hard-break@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-XKxr8usQp+kFevhDK6Ccmnq1CIkLmPClhKwbt7AClGLKLBtEVAS1qUgcmKudkw8cD8Q2/69twI37LXa23sfuLA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-heading@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-4xpahSo3b1dN2nwA0XKXLQVz9nZ/vE443a/Y5QLWeXiu3v9wkcMs/5kQ5ysFeDZRBTfVUWBqhngI7zhvDUx2zQ==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-highlight@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-D4SsD4karzlRIIHarZ9C0+gCQ0CPtp2LFyG93RE8GQzi+RgV+B2AaAiWPizXfRs9AN93neLBQ33EkuR9CbDzUw==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-history@3.14.0(@tiptap/extensions@3.14.0): + resolution: {integrity: sha512-wHDCVXTHcrbOuA6sUFxAZ980/TQa8F6cytP6HfP8J/nDlNDJ/hiov3RIw7kkkHrlHZYG+Qu8EprqFZU6OHAzNQ==} + peerDependencies: + '@tiptap/extensions': ^3.14.0 + dependencies: + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-horizontal-rule@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-65O4T9vPKLUKO1fLowh5jqtfQlH5eaIL7qb/uj5sXMMg8O7TCvBIRkwNuYsFTkJmTk4vBy+fjZ0uwSY3DFkO1g==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-image@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-lmRU2bhKMDPo+00AiGXZu15jBA9Gmw6QixBWzRrUtsYuFrVAYYCUNIA6mDH7b80935ISqYI+YH1ZlJEmsMptJw==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-italic@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-Arl5EaG4wdyipwvKjsI7Krlk3OkmqvLfF0YfGwsd5AVDxTiYuiDGgz7RF8J2kttbBeiUTqwME5xpkryQK3F+fg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-link@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-xaeJIktD42rJ4t9fbQpKe+yYNZ+YFIK96cp1Kdm0hZHv/8MPMNRiF85TRY+9U1aoyh5uRcspgCj7EKQb2Hs7qg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + linkifyjs: 4.3.2 + dev: false + + /@tiptap/extension-list-item@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-19Dcp8HCFdhINmRy0KQLFfz9ZEuVwFWGAAjYG7BvMvkd9k4sJ5vCv5fej59G99rhsc+tCmik77w+SLksOcxwKQ==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-list-keymap@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-1oPbvNnQjeOxkHZcUbWPx/IY9o4fT3QGk/9A9cIjFrJRD2AHzbYfPDHNHINtg7Bj0jWz74cHvAHcaxP+M27jkA==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-list@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-rsjFH0Vd/4UbDsjwMLay7oz72VVu1r35t8ofAzy5587jn5JAjflaZs05XbRRMD2imUTK41dyajVSh8CqSnDEJw==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-mathematics@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(katex@0.16.27): + resolution: {integrity: sha512-czy1Yi6ObEsKy9xuPceEyRvVsg5nvwW31mQQTBMxEBHjHUq5gsQqaxIqQVu4kwcTjW2GgSIWfULKWsO11hRYhA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + katex: ^0.16.4 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + katex: 0.16.27 + dev: false + + /@tiptap/extension-mention@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@tiptap/suggestion@3.14.0): + resolution: {integrity: sha512-PGSAKke1pUuGEadqthvSyJLHLh4eVwRoOMsAAmxr1P0UqATpEgVMHAeyEXrRf5FORN0Wu1LzgiuXPFLkhZhfzg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + '@tiptap/suggestion': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + '@tiptap/suggestion': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-ordered-list@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-/fXjVL4JajkJQoc213iiput0bCXC4ztUPUpvNuI62VcgFKHcTvX4eYxED1VflotCx0OdkyY9yYD8PtvyO5lkmA==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-paragraph@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-NFxk2yNo3Cvh9g8evea+yTLNV48se7MbMcVizTnVhobqtBKv793qsb5FM5Hu30Y72FQPNfH+LRoap4XZyBPfVw==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-placeholder@3.14.0(@tiptap/extensions@3.14.0): + resolution: {integrity: sha512-sBiAs1gumdSZXO0ezMSmOkHnlzZNZ1fttm6GriAMIp5xfCvo/0LD6bHPXtvOAbT9ovLQX8mH5+iPZh2jKta7oQ==} + peerDependencies: + '@tiptap/extensions': ^3.14.0 + dependencies: + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-strike@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-R8BbAhnWpisBml6okMKl98hY4tJjedTTgyTkx8tPabIJ92nS9IURKEk3foWB9uHxdTOBUqTvVT+2ScDf9r6QHg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-subscript@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-PUO698roA3mB3mFBf6Ig4MwEpP7sVX1QPAi7F7xM9ZacvVMJEAPLFl6KDjJljYP2h5vE2wNOFk4aGl3vRquEwA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-superscript@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-SPkwHz6yVMIzlPJS8ellQIQUB5MKiw36kMi+PO904IuKKbR9wONg8ud0wG5cgg5ni5d2jkQGG+mnI0kwDDts2Q==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-table@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-tt1OlzqlsRsTazARGpvwPJmKEu+jiMFuaueNM28V+AADtaIPyE160V6w2bkdeWQeaBWqZjOUGZaMjpsKqWXR+g==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/extension-task-item@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-hUUNrqqYffEJpPRRvPHidbvzAQgaHZ12c918MUqquWf/AfpmnTDYJplHpbh2gUbtg0nivNFgags7VJdnJeKlVQ==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-task-list@3.14.0(@tiptap/extension-list@3.14.0): + resolution: {integrity: sha512-uFJkjxF8+yVewU/JR2PWgY2TGKqa0GntMPe/prozyIrKW6felcQ+Pypa6Mr3luk5e8C6GQB8Uh5+cVhLVTjZ/w==} + peerDependencies: + '@tiptap/extension-list': ^3.14.0 + dependencies: + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-text-align@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-CaxxlbAvfofZZ7KPL28Kg8xuMv8t4rvt5GPwZAqE+jd3rwrucpovpX/SdgclYDc75xs0t8qeoxDFe9HQmG5XZA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-text-style@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-YZID7tvcMr5XLdq1PBxpIQi3dZFS2/LRAqIZHJ85FcG0EJkeRdM+y32+DXAWGvbwgAZaZOOvrgOfthQ/oqCdZg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-text@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-XlpnD87LQ7lLcDcBenHgzxv3uivQzPdVHM16CY4lXR4aKDIp2mxjPZr4twHT+cOnRQHc8VYpRgkEo6LLX6VylA==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-typography@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-vqRP6muQI/o95bchhmdGDGFRnJkOVs8zAkzuL5FCc0GmwJAPKy+GHoRP9hfgYlawCqzi8exVDXiY6WkknN87Yg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-underline@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-zmnWlsi2g/tMlThHby0Je9O+v24j4d+qcXF3nuzLUUaDsGCEtOyC9RzwITft59ViK+Nc2PD2W/J14rsB0j+qoQ==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extension-youtube@3.14.0(@tiptap/core@3.14.0): + resolution: {integrity: sha512-scXwDYrjivhNyPkGYPAmU4FGqXF+1QPJkJ6uoEgVGd9FYujQIYyjcLGjsgyYirIo/KLagk3gKeqT6oTTc3TH1w==} + peerDependencies: + '@tiptap/core': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + dev: false + + /@tiptap/extensions@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-qQBVKqzU4ZVjRn8W0UbdfE4LaaIgcIWHOMrNnJ+PutrRzQ6ZzhmD/kRONvRWBfG9z3DU7pSKGwVYSR2hztsGuQ==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/pm@3.14.0: + resolution: {integrity: sha512-xrZmqI5jl4yMeAsu8p8gVP9S3An5h2MBi8BQHNnZmpyzkUrlpd40vlT6u13SWIqVi5ZWhBZ6U3rL7mkVLZuRKg==} + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + dev: false + + /@tiptap/react@3.14.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0)(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Eo/nLyKxHvnLIF4gI2WFhGJiVrqfA6XL9kismVG9NwBNF/NblMDmZZu6Z2SH/ONJQz2Egn7UBPNp3BMq/qZDcg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^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 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + '@types/use-sync-external-store': 0.0.6 + fast-equals: 5.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-floating-menu': 3.14.0(@floating-ui/dom@1.7.4)(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + transitivePeerDependencies: + - '@floating-ui/dom' + dev: false + + /@tiptap/starter-kit@3.14.0: + resolution: {integrity: sha512-fHsC4oDVzvMU9btg+IUmu/eqPquapjJ341qaNI7cCeSCKjjE6XJEN6WcONLAVId2OZUwML0IX1Jgl+6gJxU9Jw==} + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/extension-blockquote': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-bold': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-bullet-list': 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-code': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-code-block': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-document': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-dropcursor': 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-gapcursor': 3.14.0(@tiptap/extensions@3.14.0) + '@tiptap/extension-hard-break': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-heading': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-horizontal-rule': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-italic': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-link': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-list': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/extension-list-item': 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-list-keymap': 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-ordered-list': 3.14.0(@tiptap/extension-list@3.14.0) + '@tiptap/extension-paragraph': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-strike': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-text': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extension-underline': 3.14.0(@tiptap/core@3.14.0) + '@tiptap/extensions': 3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/suggestion@3.14.0(@tiptap/core@3.14.0)(@tiptap/pm@3.14.0): + resolution: {integrity: sha512-B9BQ9Tck8HsISDc6jZmtaSpl8KK69JbKHfU0ntILxgj8aBASElewO+W8WE49JSTxuyJGRgnhGSgaGpM4LhbLAg==} + peerDependencies: + '@tiptap/core': ^3.14.0 + '@tiptap/pm': ^3.14.0 + dependencies: + '@tiptap/core': 3.14.0(@tiptap/pm@3.14.0) + '@tiptap/pm': 3.14.0 + dev: false + + /@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7)(yjs@13.6.29): + resolution: {integrity: sha512-F3hj5X77ckmyIywbCQpKgyX3xKra2/acJPWaV5R9wqp0cUPBmm62FYbkQ6HaqxH1VhCkUhhAZcDSQjbjj7tnWw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + dependencies: + lib0: 0.2.117 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + y-protocols: 1.0.7(yjs@13.6.29) + yjs: 13.6.29 + dev: false + + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: false + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tybys/wasm-util@0.10.1: + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + /@types/babel__generator@7.27.0: + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + dependencies: + '@babel/types': 7.28.5 + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + /@types/babel__traverse@7.28.0: + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + dependencies: + '@babel/types': 7.28.5 + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.19.27 + '@types/responselike': 1.0.3 + dev: true + + /@types/canvas-confetti@1.9.0: + resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} + dev: true + + /@types/color-convert@2.0.4: + resolution: {integrity: sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==} + dependencies: + '@types/color-name': 1.1.5 + dev: true + + /@types/color-name@1.1.5: + resolution: {integrity: sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg==} + dev: true + + /@types/color@4.2.0: + resolution: {integrity: sha512-6+xrIRImMtGAL2X3qYkd02Mgs+gFGs+WsK0b7VVMaO4mYRISwyTjcqNrO0mNSmYEoq++rSLDB2F5HDNmqfOe+A==} + dependencies: + '@types/color-convert': 2.0.4 + dev: true + + /@types/colorthief@2.6.0: + resolution: {integrity: sha512-GZBHPzkgEsyZqO7a9rhqkcW2BJZW+UpRlIUorY8vfOk7BVFVZMuDvZRPyaExv7ML0DaeB/t78PUOTkGo/THDpQ==} + dev: true + + /@types/d3-array@3.2.2: + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + dev: false + + /@types/d3-axis@3.0.6: + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + dependencies: + '@types/d3-selection': 3.0.11 + dev: false + + /@types/d3-brush@3.0.6: + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + dependencies: + '@types/d3-selection': 3.0.11 + dev: false + + /@types/d3-chord@3.0.6: + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + dev: false + + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false + + /@types/d3-contour@3.0.6: + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + dev: false + + /@types/d3-delaunay@6.0.4: + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + dev: false + + /@types/d3-dispatch@3.0.7: + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + dev: false + + /@types/d3-drag@3.0.7: + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + dependencies: + '@types/d3-selection': 3.0.11 + dev: false + + /@types/d3-dsv@3.0.7: + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + dev: false + + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false + + /@types/d3-fetch@3.0.7: + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + dependencies: + '@types/d3-dsv': 3.0.7 + dev: false + + /@types/d3-force@3.0.10: + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + dev: false + + /@types/d3-format@3.0.4: + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + dev: false + + /@types/d3-geo@3.1.0: + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + dependencies: + '@types/geojson': 7946.0.16 + dev: false + + /@types/d3-hierarchy@3.1.7: + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + dev: false + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + dependencies: + '@types/d3-color': 3.1.3 + dev: false + + /@types/d3-path@3.1.1: + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + dev: false + + /@types/d3-polygon@3.0.2: + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + dev: false + + /@types/d3-quadtree@3.0.6: + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + dev: false + + /@types/d3-random@3.0.3: + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + dev: false + + /@types/d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + dev: false + + /@types/d3-scale@4.0.9: + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + dependencies: + '@types/d3-time': 3.0.4 + dev: false + + /@types/d3-selection@3.0.11: + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + dev: false + + /@types/d3-shape@3.1.7: + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + dependencies: + '@types/d3-path': 3.1.1 + dev: false + + /@types/d3-time-format@4.0.3: + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + dev: false + + /@types/d3-time@3.0.4: + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false + + /@types/d3-transition@3.0.9: + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + dependencies: + '@types/d3-selection': 3.0.11 + dev: false + + /@types/d3-zoom@3.0.8: + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + dev: false + + /@types/d3@7.4.3: + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 2.1.0 + + /@types/diff@7.0.2: + resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + dev: true + + /@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==} + + /@types/fs-extra@9.0.13: + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + dependencies: + '@types/node': 20.19.27 + dev: true + + /@types/geojson@7946.0.16: + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + dev: false + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.19.27 + + /@types/hammerjs@2.0.46: + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + dev: false + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + /@types/jju@1.4.5: + resolution: {integrity: sha512-5Yx4wOq3X+xArOlyZcuAK1Pli4vW0E6nQ6UC8jWdbcY5OlBsoElFTOf4kggYKls/NCHdShAK6UR8NRSQARUNfQ==} + dev: true + + /@types/json-logic-js@2.0.8: + resolution: {integrity: sha512-WgNsDPuTPKYXl0Jh0IfoCoJoAGGYZt5qzpmjuLSEg7r0cKp/kWtWp0HAsVepyPSPyXiHo6uXp/B/kW/2J1fa2Q==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/jszip@3.4.1: + resolution: {integrity: sha512-TezXjmf3lj+zQ651r6hPqvSScqBLvyPI9FxdXBqpEwBijNGQ2NXpaFW/7joGzveYkKQUil7iiDHLo6LV71Pc0A==} + deprecated: This is a stub types definition. jszip provides its own type definitions, so you do not need this installed. + dependencies: + jszip: 3.10.1 + dev: false + + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: false + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.19.27 + dev: true + + /@types/linkify-it@5.0.0: + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + dev: false + + /@types/lodash@4.17.21: + resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + dev: true + + /@types/markdown-it@14.1.2: + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + dev: false + + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + + /@types/mdurl@2.0.0: + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + dev: false + + /@types/ms@2.1.0: + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + /@types/mustache@4.2.6: + resolution: {integrity: sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==} + dev: false + + /@types/ndarray@1.0.14: + resolution: {integrity: sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==} + dev: false + + /@types/node@20.19.27: + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} + dependencies: + undici-types: 6.21.0 + + /@types/pako@2.0.4: + resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + dev: false + + /@types/papaparse@5.5.2: + resolution: {integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==} + dependencies: + '@types/node': 20.19.27 + dev: false + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/phoenix@1.6.7: + resolution: {integrity: sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==} + dev: false + + /@types/plist@3.0.5: + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + requiresBuild: true + dependencies: + '@types/node': 20.19.27 + xmlbuilder: 15.1.1 + dev: true + optional: true + + /@types/prismjs@1.26.5: + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + dev: false + + /@types/prop-types@15.7.15: + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + /@types/raf@3.4.3: + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + requiresBuild: true + dev: false + optional: true + + /@types/react-dom@18.3.7(@types/react@18.3.27): + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + dependencies: + '@types/react': 18.3.27 + + /@types/react-reconciler@0.28.9(@types/react@18.3.27): + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} + peerDependencies: + '@types/react': '*' + dependencies: + '@types/react': 18.3.27 + dev: false + + /@types/react-reconciler@0.32.3(@types/react@18.3.27): + resolution: {integrity: sha512-cMi5ZrLG7UtbL7LTK6hq9w/EZIRk4Mf1Z5qHoI+qBh7/WkYkFXQ7gOto2yfUvPzF5ERMAhaXS5eTQ2SAnHjLzA==} + peerDependencies: + '@types/react': '*' + dependencies: + '@types/react': 18.3.27 + dev: false + + /@types/react-syntax-highlighter@15.5.13: + resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} + dependencies: + '@types/react': 19.1.17 + dev: true + + /@types/react@18.3.27: + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + /@types/react@19.1.17: + resolution: {integrity: sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==} + dependencies: + csstype: 3.2.3 + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 20.19.27 + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + /@types/stylis@4.2.5: + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + dev: false + + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + requiresBuild: true + dev: false + optional: true + + /@types/turndown@5.0.6: + resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==} + dev: true + + /@types/unist@2.0.11: + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + dev: false + + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + /@types/use-sync-external-store@0.0.6: + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + dev: false + + /@types/verror@1.10.11: + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + requiresBuild: true + dev: true + optional: true + + /@types/ws@8.18.1: + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + dependencies: + '@types/node': 20.19.27 + dev: false + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + /@types/yargs@17.0.35: + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + dependencies: + '@types/yargs-parser': 21.0.3 + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 20.19.27 + dev: true + optional: true + + /@typescript-eslint/eslint-plugin@8.51.0(@typescript-eslint/parser@8.51.0)(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.51.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.51.0 + eslint: 9.39.2 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@8.51.0(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.51.0 + debug: 4.4.3 + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/project-service@8.51.0(typescript@5.9.3): + resolution: {integrity: sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@8.51.0: + resolution: {integrity: sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/visitor-keys': 8.51.0 + dev: true + + /@typescript-eslint/tsconfig-utils@8.51.0(typescript@5.9.3): + resolution: {integrity: sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + typescript: 5.9.3 + dev: true + + /@typescript-eslint/type-utils@8.51.0(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@8.51.0: + resolution: {integrity: sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@8.51.0(typescript@5.9.3): + resolution: {integrity: sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/project-service': 8.51.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/visitor-keys': 8.51.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@8.51.0(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@8.51.0: + resolution: {integrity: sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.51.0 + eslint-visitor-keys: 4.2.1 + dev: true + + /@uiw/codemirror-extensions-basic-setup@4.25.4(@codemirror/autocomplete@6.20.0)(@codemirror/commands@6.10.1)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8): + resolution: {integrity: sha512-YzNwkm0AbPv1EXhCHYR5v0nqfemG2jEB0Z3Att4rBYqKrlG7AA9Rhjc3IyBaOzsBu18wtrp9/+uhTyu7TXSRng==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/commands': 6.10.1 + '@codemirror/language': 6.12.1 + '@codemirror/lint': 6.9.2 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + dev: false + + /@uiw/codemirror-extensions-langs@4.25.4(@codemirror/autocomplete@6.20.0)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.11)(@codemirror/lang-javascript@6.2.4)(@codemirror/language-data@6.5.2)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/javascript@1.5.4)(@lezer/lr@1.4.5): + resolution: {integrity: sha512-mLcEEg8Gt0wzNPaeI350INSLHlXv7qV8eYzQt3oExN+rDB54zL0k2pVhR445wZXDQKbP/fMWuq3qv8SiL/3pxQ==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/language-data': '>=6.0.0' + dependencies: + '@codemirror/language': 6.12.1 + '@codemirror/language-data': 6.5.2 + '@replit/codemirror-lang-nix': 6.0.1(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.5) + '@replit/codemirror-lang-solidity': 6.0.2(@codemirror/language@6.12.1) + '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.20.0)(@codemirror/lang-css@6.3.1)(@codemirror/lang-html@6.4.11)(@codemirror/lang-javascript@6.2.4)(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8)(@lezer/common@1.5.0)(@lezer/highlight@1.2.3)(@lezer/javascript@1.5.4)(@lezer/lr@1.4.5) + codemirror-lang-mermaid: 0.5.0 + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/lang-css' + - '@codemirror/lang-html' + - '@codemirror/lang-javascript' + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + - '@lezer/highlight' + - '@lezer/javascript' + - '@lezer/lr' + dev: false + + /@uiw/codemirror-theme-vscode@4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8): + resolution: {integrity: sha512-9ob5EtLqrXBFl8uf4eFRkXjyjfyfBRVsJdt7xbc33f+2/I29/2v2nEdU/xw40+dhloxF/h1Ry281f8wAs97MWQ==} + dependencies: + '@uiw/codemirror-themes': 4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8) + transitivePeerDependencies: + - '@codemirror/language' + - '@codemirror/state' + - '@codemirror/view' + dev: false + + /@uiw/codemirror-theme-xcode@4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8): + resolution: {integrity: sha512-h6tDJeNE1pNkbKBRloiq06SgYfsZAbYXvlMobvwR0gd156TZHgOSwwZb/NRQZkP2TDjNyFU26UTEomUJHzVcXA==} + dependencies: + '@uiw/codemirror-themes': 4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8) + transitivePeerDependencies: + - '@codemirror/language' + - '@codemirror/state' + - '@codemirror/view' + dev: false + + /@uiw/codemirror-themes@4.25.4(@codemirror/language@6.12.1)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8): + resolution: {integrity: sha512-2SLktItgcZC4p0+PfFusEbAHwbuAWe3bOOntCevVgHtrWGtGZX3IPv2k8IKZMgOXtAHyGKpJvT9/nspPn/uCQg==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + dependencies: + '@codemirror/language': 6.12.1 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + dev: false + + /@uiw/react-codemirror@4.25.4(@babel/runtime@7.28.4)(@codemirror/autocomplete@6.20.0)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.39.8)(codemirror@6.0.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ipO067oyfUw+DVaXhQCxkB0ZD9b7RnY+ByrprSYSKCHaULvJ3sqWYC/Zen6zVQ8/XC4o5EPBfatGiX20kC7XGA==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + dependencies: + '@babel/runtime': 7.28.4 + '@codemirror/commands': 6.10.1 + '@codemirror/state': 6.5.3 + '@codemirror/theme-one-dark': 6.1.3 + '@codemirror/view': 6.39.8 + '@uiw/codemirror-extensions-basic-setup': 4.25.4(@codemirror/autocomplete@6.20.0)(@codemirror/commands@6.10.1)(@codemirror/language@6.12.1)(@codemirror/lint@6.9.2)(@codemirror/search@6.5.11)(@codemirror/state@6.5.3)(@codemirror/view@6.39.8) + codemirror: 6.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + dev: false + + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + /@unrs/resolver-binding-android-arm-eabi@1.11.1: + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-android-arm64@1.11.1: + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-arm64@1.11.1: + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-x64@1.11.1: + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-freebsd-x64@1.11.1: + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1: + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-musleabihf@1.11.1: + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-gnu@1.11.1: + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-musl@1.11.1: + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-ppc64-gnu@1.11.1: + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-gnu@1.11.1: + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-musl@1.11.1: + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-s390x-gnu@1.11.1: + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-gnu@1.11.1: + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-musl@1.11.1: + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-wasm32-wasi@1.11.1: + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + dev: true + optional: true + + /@unrs/resolver-binding-win32-arm64-msvc@1.11.1: + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-ia32-msvc@1.11.1: + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-x64-msvc@1.11.1: + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@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 + + /@urql/exchange-retry@1.3.2(@urql/core@5.2.0): + resolution: {integrity: sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==} + peerDependencies: + '@urql/core': ^5.0.0 + dependencies: + '@urql/core': 5.2.0 + wonka: 6.3.5 + dev: false + + /@usebasejump/shared@0.0.3: + resolution: {integrity: sha512-qO9AnKnt5ALvMylnnlTuePrNM+cVs5aCbylzFfMN8ZgCOARWuir5PzZxB3CAVdtDzJpSYioLghYF0kaX1ryAZQ==} + dev: false + + /@vercel/analytics@1.6.1(next@15.5.9)(react@18.3.1): + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + peerDependencies: + '@remix-run/react': ^2 + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + dependencies: + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + dev: false + + /@vercel/edge-config-fs@0.1.0: + resolution: {integrity: sha512-NRIBwfcS0bUoUbRWlNGetqjvLSwgYH/BqKqDN7vK1g32p7dN96k0712COgaz6VFizAm9b0g6IG6hR6+hc0KCPg==} + dev: false + + /@vercel/edge-config@1.4.3(next@15.5.9): + resolution: {integrity: sha512-8vTDATodRrH49wMzKEjZ8/5H2qs1aPkD0uRK585f/Fx4YN2wfHfY/3td9OFrh+gdnCq07z8A5f0hoY6xhBcPkg==} + engines: {node: '>=14.6'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + next: '>=1' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + next: + optional: true + dependencies: + '@vercel/edge-config-fs': 0.1.0 + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + dev: false + + /@vercel/speed-insights@1.3.1(next@15.5.9)(react@18.3.1): + resolution: {integrity: sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==} + peerDependencies: + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + dependencies: + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + dev: false + + /@xmldom/xmldom@0.7.13: + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} + engines: {node: '>=10.0.0'} + deprecated: this version is no longer supported, please update to at least 0.8.* + dev: false + + /@xmldom/xmldom@0.8.11: + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + /@xterm/addon-fit@0.10.0(@xterm/xterm@5.5.0): + resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + dependencies: + '@xterm/xterm': 5.5.0 + dev: false + + /@xterm/addon-web-links@0.11.0(@xterm/xterm@5.5.0): + resolution: {integrity: sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + dependencies: + '@xterm/xterm': 5.5.0 + dev: false + + /@xterm/xterm@5.5.0: + resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + dev: false + + /@yarnpkg/lockfile@1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /abs-svg-path@0.1.1: + resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-jsx@5.3.2(acorn@8.15.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.15.0 + + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adler-32@1.3.1: + resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} + engines: {node: '>=0.8'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + /agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@7.2.4: + resolution: {integrity: sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + dev: false + + /anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + /ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /app-builder-bin@5.0.0-alpha.10: + resolution: {integrity: sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==} + dev: true + + /app-builder-lib@25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8): + resolution: {integrity: sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 25.1.8 + electron-builder-squirrel-windows: 25.1.8 + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.1 + '@electron/rebuild': 3.6.1 + '@electron/universal': 2.0.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 25.1.7 + builder-util-runtime: 9.2.10 + chromium-pickle-js: 0.2.0 + config-file-ts: 0.2.8-rc1 + debug: 4.4.3 + dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 25.1.8(dmg-builder@25.1.8) + electron-publish: 25.1.7 + form-data: 4.0.5 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.7 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.1.1 + resedit: 1.7.2 + sanitize-filename: 1.6.3 + semver: 7.7.3 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + dev: true + + /archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + dev: true + + /archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: true + + /archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + dev: true + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + dependencies: + tslib: 2.8.1 + dev: false + + /aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + dev: true + + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + dev: true + + /array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + dev: true + + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: false + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + dev: true + + /array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + dev: true + + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + requiresBuild: true + dev: true + optional: true + + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + dev: false + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + requiresBuild: true + dev: true + optional: true + + /async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + dev: true + + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /autoprefixer@10.4.17(postcss@8.4.33): + resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001762 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: false + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + + /awesome-phonenumber@5.11.0: + resolution: {integrity: sha512-25GfikMIo6CBQIqvjoewo4uiu5Ai7WqEC8gxesH3LDwCY43oEdkLaT15a+8adC7uWIJCGh+YQiBY5bjmDpoQcg==} + engines: {node: '>=14'} + dev: false + + /axe-core@4.11.0: + resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} + engines: {node: '>=4'} + dev: true + + /axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + dev: true + + /babel-jest@29.7.0(@babel/core@7.28.5): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.28.5 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.28.4 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.47.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + dependencies: + '@babel/types': 7.28.5 + dev: false + + /babel-plugin-react-native-web@0.21.2: + resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} + dev: false + + /babel-plugin-syntax-hermes-parser@0.29.1: + resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==} + dependencies: + hermes-parser: 0.29.1 + + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.5): + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + dependencies: + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - '@babel/core' + dev: false + + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) + + /babel-preset-expo@54.0.9(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.30)(react-refresh@0.14.2): + resolution: {integrity: sha512-8J6hRdgEC2eJobjoft6mKJ294cLxmi3khCUy2JJQp4htOYYkllSLUq6vudWJkTJiIuGdVR4bR6xuz2EvJLWHNg==} + peerDependencies: + '@babel/runtime': ^7.20.0 + expo: '*' + react-refresh: '>=0.14.0 <1.0.0' + peerDependenciesMeta: + '@babel/runtime': + optional: true + expo: + optional: true + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) + '@babel/preset-react': 7.28.5(@babel/core@7.28.5) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/runtime': 7.28.4 + '@react-native/babel-preset': 0.81.5(@babel/core@7.28.5) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.5) + debug: 4.4.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-refresh: 0.14.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: false + + /babel-preset-jest@29.6.3(@babel/core@7.28.5): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + + /badgin@1.2.3: + resolution: {integrity: sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==} + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + hasBin: true + + /better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + dependencies: + open: 8.4.2 + dev: false + + /bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + dependencies: + require-from-string: 2.0.2 + dev: false + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + dependencies: + bluebird: 3.7.2 + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + requiresBuild: true + dev: true + optional: true + + /bplist-creator@0.1.0: + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + dependencies: + stream-buffers: 2.2.0 + dev: false + + /bplist-parser@0.3.1: + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: false + + /bplist-parser@0.3.2: + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: false + + /brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + dependencies: + base64-js: 1.5.1 + dev: false + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: false + + /browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001762 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builder-util-runtime@9.2.10: + resolution: {integrity: sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==} + engines: {node: '>=12.0.0'} + dependencies: + debug: 4.4.3 + sax: 1.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /builder-util@25.1.7: + resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.10 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.10 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-ci: 3.0.1 + js-yaml: 4.1.1 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.2.1 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false + + /caniuse-lite@1.0.30001762: + resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} + + /canvas-confetti@1.9.4: + resolution: {integrity: sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==} + dev: false + + /canvas@3.2.0: + resolution: {integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==} + engines: {node: ^18.12.0 || >= 20.9.0} + requiresBuild: true + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + dev: false + + /canvg@3.0.11: + resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + '@babel/runtime': 7.28.4 + '@types/raf': 3.4.3 + core-js: 3.47.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + dev: false + optional: true + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + /cfb@1.2.2: + resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} + engines: {node: '>=0.8'} + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chart.js@4.5.1: + resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} + engines: {pnpm: '>=8'} + dependencies: + '@kurkle/color': 0.3.4 + dev: false + + /chevrotain-allstar@0.3.1(chevrotain@11.0.3): + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.22 + dev: false + + /chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: false + + /chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + '@types/node': 20.19.27 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + /chromium-edge-launcher@0.2.0: + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + dependencies: + '@types/node': 20.19.27 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + + /chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + dev: true + + /ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + /class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + dependencies: + clsx: 2.1.1 + dev: false + + /classnames@2.5.0: + resolution: {integrity: sha512-FQuRlyKinxrb5gwJlfVASbSrDlikDJ07426TrfPsdGLvtochowmkbnSFdQGJ2aoXrSetq5KqGV9emvWpy+91xA==} + dev: false + + /classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + optional: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + + /clsx@1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /cmdk@0.2.1(@types/react@18.3.27)(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.27)(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 + + /cobe@0.6.5: + resolution: {integrity: sha512-MA8bu81EFY6JjQpj+FovEuhyJ25khx2Q7Lh+ot/UkCJe5yKyDgzdc6u2lGZIOmsZTXK6Itg1i4lQZIJZbPWnAg==} + dependencies: + phenomenon: 1.6.0 + dev: false + + /codemirror-lang-mermaid@0.5.0: + resolution: {integrity: sha512-Taw/2gPCyNArQJCxIP/HSUif+3zrvD+6Ugt7KJZ2dUKou/8r3ZhcfG8krNTZfV2iu8AuGnymKuo7bLPFyqsh/A==} + dependencies: + '@codemirror/language': 6.12.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.5 + dev: false + + /codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + dependencies: + '@codemirror/autocomplete': 6.20.0 + '@codemirror/commands': 6.10.1 + '@codemirror/language': 6.12.1 + '@codemirror/lint': 6.9.2 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.3 + '@codemirror/view': 6.39.8 + dev: false + + /codepage@1.15.0: + resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==} + engines: {node: '>=0.8'} + dev: false + + /color-bits@1.1.1: + resolution: {integrity: sha512-KOU0xOussQ1b7jDqEb2wx89ZGdCepRI30c0LZRUrjcb6zS0sgfxYt0UmocvG6EhTvbraJZQjZZn7wN10tFWgjg==} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + dependencies: + color-name: 2.1.0 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + dev: false + + /color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + dependencies: + color-name: 2.1.0 + dev: false + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + dev: false + + /colorthief@2.6.0: + resolution: {integrity: sha512-yL3B7laeOr4kH9XasFF5rl+9Taz+Pmt/CRbaTI6XepZFyQvk4K/abaGKIAsngVpxKkgFeoJ2IwdRpS228icrig==} + dependencies: + '@lokesh.dhakar/quantize': 1.4.0 + file-type: 16.5.4 + ndarray-pixels: 4.1.0 + sharp: 0.33.5 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /comment-json@4.5.1: + resolution: {integrity: sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==} + engines: {node: '>= 6'} + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + dev: false + + /compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + dev: true + + /compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.54.0 + dev: false + + /compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + dev: false + + /config-file-ts@0.2.8-rc1: + resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==} + dependencies: + glob: 10.5.0 + typescript: 5.9.3 + dev: true + + /connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + dev: false + + /core-js-compat@3.47.0: + resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + dependencies: + browserslist: 4.28.1 + dev: false + + /core-js@3.47.0: + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + requiresBuild: true + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + requiresBuild: true + dev: true + optional: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + dev: false + + /cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + dependencies: + layout-base: 2.0.1 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.9.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.9.3 + dev: true + + /country-flag-icons@1.6.4: + resolution: {integrity: sha512-Z3Zi419FI889tlElMsVhCIS5eRkiLDWixr576J5DPiTe5RGxpbRi+enMpHdYVp5iK5WFjr8P/RgyIFAGhFsiFg==} + dev: false + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + /crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + dev: true + + /crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + requiresBuild: true + dependencies: + buffer: 5.7.1 + dev: true + optional: true + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /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 + + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: false + + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.1.0 + dev: false + + /css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + dependencies: + utrie: 1.0.2 + dev: false + + /css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + dev: true + + /css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: true + + /csstype@3.0.9: + resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false + + /csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + /cwise-compiler@1.1.3: + resolution: {integrity: sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==} + dependencies: + uniq: 1.0.1 + dev: false + + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + dev: false + + /cytoscape-fcose@2.2.0(cytoscape@3.33.1): + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + dev: false + + /cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + dev: false + + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false + + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + dependencies: + delaunator: 5.0.1 + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: false + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false + + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false + + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false + + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: false + + /d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dev: false + + /dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + dependencies: + d3: 7.9.0 + lodash-es: 4.17.22 + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + + /dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dev: false + + /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'} + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + dependencies: + robust-predicates: 3.0.2 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + /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==} + requiresBuild: true + dev: true + optional: true + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + + /dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dev: false + + /diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + dev: false + + /dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + dependencies: + minimatch: 3.1.2 + p-limit: 3.1.0 + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8): + resolution: {integrity: sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==} + dependencies: + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) + builder-util: 25.1.7 + builder-util-runtime: 9.2.10 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - bluebird + - electron-builder-squirrel-windows + - supports-color + dev: true + + /dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + requiresBuild: true + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + dev: true + optional: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + optionalDependencies: + '@types/trusted-types': 2.0.7 + dev: false + + /domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + dependencies: + dotenv: 16.4.7 + + /dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + /dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.9.4 + dev: true + + /electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8): + resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} + dependencies: + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) + archiver: 5.3.2 + builder-util: 25.1.7 + fs-extra: 10.1.0 + transitivePeerDependencies: + - bluebird + - dmg-builder + - supports-color + dev: true + + /electron-builder@25.1.8(electron-builder-squirrel-windows@25.1.8): + resolution: {integrity: sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) + builder-util: 25.1.7 + builder-util-runtime: 9.2.10 + chalk: 4.1.2 + dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - electron-builder-squirrel-windows + - supports-color + dev: true + + /electron-publish@25.1.7: + resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 25.1.7 + builder-util-runtime: 9.2.10 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + /electron@33.4.11: + resolution: {integrity: sha512-xmdAs5QWRkInC7TpXGNvzo/7exojubk+72jn1oJL7keNeIlw7xNglf8TGtJtkR4rWC5FJq0oXiIXPS9BcK2Irg==} + engines: {node: '>= 12.20.55'} + hasBin: true + requiresBuild: true + dependencies: + '@electron/get': 2.0.3 + '@types/node': 20.19.27 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /emoji-mart@5.6.0: + resolution: {integrity: sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==} + dev: false + + /emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + dev: false + + /emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojibase-data@15.3.2(emojibase@17.0.0): + resolution: {integrity: sha512-TpDyTDDTdqWIJixV5sTA6OQ0P0JfIIeK2tFRR3q56G9LK65ylAZ7z3KyBXokpvTTJ+mLUXQXbLNyVkjvnTLE+A==} + peerDependencies: + emojibase: '*' + dependencies: + emojibase: 17.0.0 + dev: false + + /emojibase@17.0.0: + resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} + engines: {node: '>=18.12.0'} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + dependencies: + once: 1.4.0 + + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + dev: false + + /enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + dev: true + + /entities@2.0.3: + resolution: {integrity: sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==} + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + dev: false + + /env-editor@0.4.2: + resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} + engines: {node: '>=8'} + dev: false + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + + /es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + + /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 + + /es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + + /es-toolkit@1.43.0: + resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} + dev: false + + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + requiresBuild: true + dev: true + optional: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + /escape-string-regexp@4.0.0: + 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 + + /eslint-config-next@15.2.2(eslint@9.39.2)(typescript@5.9.3): + resolution: {integrity: sha512-g34RI7RFS4HybYFwGa/okj+8WZM+/fy+pEM+aqRQoVvM4gQhKrd4wIEddKmlZfWD75j8LTwB5zwkmNv3DceH1A==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 15.2.2 + '@rushstack/eslint-patch': 1.15.0 + '@typescript-eslint/eslint-plugin': 8.51.0(@typescript-eslint/parser@8.51.0)(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.51.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2) + eslint-plugin-react: 7.37.5(eslint@9.39.2) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2) + typescript: 5.9.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2): + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.2 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.51.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) + get-tsconfig: 4.13.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.12.1(@typescript-eslint/parser@8.51.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2): + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + debug: 3.2.7 + eslint: 9.39.2 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.51.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2): + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 8.51.0(eslint@9.39.2)(typescript@5.9.3) + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.2 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.51.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2): + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.2 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + dev: true + + /eslint-plugin-react-hooks@5.2.0(eslint@9.39.2): + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + dependencies: + eslint: 9.39.2 + dev: true + + /eslint-plugin-react@7.37.5(eslint@9.39.2): + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + dev: true + + /eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + dev: false + + /espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /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'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /event-target-polyfill@0.0.4: + resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /exec-async@2.2.0: + resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /expensify-common@2.0.169: + resolution: {integrity: sha512-0AimE2f+0vR0fGyCRaffqlaNOUQnlZFuDzoi6n7Pl4Hrr9WoRltYZwM9gSKnV9yv1K3uV7xjZodiHT0yuQFvqw==} + dependencies: + awesome-phonenumber: 5.11.0 + classnames: 2.5.0 + clipboard: 2.0.11 + html-entities: 2.5.3 + jquery: 3.6.0 + localforage: 1.10.0 + lodash: 4.17.21 + prop-types: 15.8.1 + punycode: 2.3.1 + react: 16.12.0 + react-dom: 16.12.0(react@16.12.0) + semver: 7.7.3 + simply-deferred: github.com/Expensify/simply-deferred/77a08a95754660c7bd6e0b6979fdf84e8e831bf5 + ua-parser-js: 1.0.41 + dev: false + + /expo-apple-authentication@8.0.8(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-TwCHWXYR1kS0zaeV7QZKLWYluxsvqL31LFJubzK30njZqeWoWO89HZ8nZVaeXbFV1LrArKsze4BmMb+94wS0AQ==} + peerDependencies: + expo: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-application@7.0.8(expo@54.0.30): + resolution: {integrity: sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-asset@12.0.12(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + '@expo/image-utils': 0.8.8 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-audio@1.1.1(expo-asset@12.0.12)(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-CPCpJ+0AEHdzWROc0f00Zh6e+irLSl2ALos/LPvxEeIcJw1APfBa4DuHPkL4CQCWsVe7EnUjFpdwpqsEUWcP0g==} + peerDependencies: + expo: '*' + expo-asset: '*' + react: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-asset: 12.0.12(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-auth-session@7.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-XDnKkudvhHSKkZfJ+KkodM+anQcrxB71i+h0kKabdLa5YDXTQ81aC38KRc3TMqmnBDHAu0NpfbzEVd9WDFY3Qg==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + expo-application: 7.0.8(expo@54.0.30) + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + expo-crypto: 15.0.8(expo@54.0.30) + expo-linking: 8.0.11(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-web-browser: 15.0.10(expo@54.0.30)(react-native@0.81.5) + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - expo + - supports-color + dev: false + + /expo-av@16.0.8(expo@54.0.30)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-cmVPftGR/ca7XBgs7R6ky36lF3OC0/MM/lpgX/yXqfv0jASTsh7AYX9JxHCwFmF+Z6JEB1vne9FDx4GiLcGreQ==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /expo-blur@15.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-build-properties@1.0.10(expo@54.0.30): + resolution: {integrity: sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q==} + peerDependencies: + expo: '*' + dependencies: + ajv: 8.17.1 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + semver: 7.7.3 + dev: false + + /expo-clipboard@8.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-VKoBkHIpZZDJTB0jRO4/PZskHdMNOEz3P/41tmM6fDuODMpqhvyWK053X0ebspkxiawJX9lX33JXHBCvVsTTOA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-constants@18.0.12(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-WzcKYMVNRRu4NcSzfIVRD5aUQFnSpTZgXFrlWmm19xJoDa4S3/PQNi6PNTBRc49xz9h8FT7HMxRKaC8lr0gflA==} + peerDependencies: + expo: '*' + react-native: '*' + dependencies: + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-crypto@15.0.8(expo@54.0.30): + resolution: {integrity: sha512-aF7A914TB66WIlTJvl5J6/itejfY78O7dq3ibvFltL9vnTALJ/7LYHvLT4fwmx9yUNS6ekLBtDGWivFWnj2Fcw==} + peerDependencies: + expo: '*' + dependencies: + base64-js: 1.5.1 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-dev-client@6.0.20(expo@54.0.30): + resolution: {integrity: sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-dev-launcher: 6.0.20(expo@54.0.30) + expo-dev-menu: 7.0.18(expo@54.0.30) + expo-dev-menu-interface: 2.0.0(expo@54.0.30) + expo-manifests: 1.0.10(expo@54.0.30) + expo-updates-interface: 2.0.0(expo@54.0.30) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-dev-launcher@6.0.20(expo@54.0.30): + resolution: {integrity: sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA==} + peerDependencies: + expo: '*' + dependencies: + ajv: 8.17.1 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-dev-menu: 7.0.18(expo@54.0.30) + expo-manifests: 1.0.10(expo@54.0.30) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-dev-menu-interface@2.0.0(expo@54.0.30): + resolution: {integrity: sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-dev-menu@7.0.18(expo@54.0.30): + resolution: {integrity: sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-dev-menu-interface: 2.0.0(expo@54.0.30) + dev: false + + /expo-device@8.0.10(expo@54.0.30): + resolution: {integrity: sha512-jd5BxjaF7382JkDMaC+P04aXXknB2UhWaVx5WiQKA05ugm/8GH5uaz9P9ckWdMKZGQVVEOC8MHaUADoT26KmFA==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + ua-parser-js: 0.7.41 + dev: false + + /expo-document-picker@14.0.8(expo@54.0.30): + resolution: {integrity: sha512-3tyQKpPqWWFlI8p9RiMX1+T1Zge5mEKeBuXWp1h8PEItFMUDSiOJbQ112sfdC6Hxt8wSxreV9bCRl/NgBdt+fA==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-eas-client@1.0.8: + resolution: {integrity: sha512-5or11NJhSeDoHHI6zyvQDW2cz/yFyE+1Cz8NTs5NK8JzC7J0JrkUgptWtxyfB6Xs/21YRNifd3qgbBN3hfKVgA==} + dev: false + + /expo-file-system@19.0.21(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==} + peerDependencies: + expo: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-font@14.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-UqyNaaLKRpj4pKAP4HZSLnuDQqueaO5tB1c/NWu5vh1/LF9ulItyyg2kF/IpeOp0DeOLk0GY0HrIXaKUMrwB+Q==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + fontfaceobserver: 2.3.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-haptics@15.0.8(expo@54.0.30): + resolution: {integrity: sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-image-loader@6.0.0(expo@54.0.30): + resolution: {integrity: sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-image-picker@17.0.10(expo@54.0.30): + resolution: {integrity: sha512-a2xrowp2trmvXyUWgX3O6Q2rZaa2C59AqivKI7+bm+wLvMfTEbZgldLX4rEJJhM8xtmEDTNU+lzjtObwzBRGaw==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-image-loader: 6.0.0(expo@54.0.30) + dev: false + + /expo-json-utils@0.15.0: + resolution: {integrity: sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==} + dev: false + + /expo-keep-awake@15.0.8(expo@54.0.30)(react@19.1.0): + resolution: {integrity: sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==} + peerDependencies: + expo: '*' + react: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + dev: false + + /expo-linear-gradient@15.0.8(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-V2d8Wjn0VzhPHO+rrSBtcl+Fo+jUUccdlmQ6OoL9/XQB7Qk3d9lYrqKDJyccwDxmQT10JdST3Tmf2K52NLc3kw==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-linking@8.0.11(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - expo + - supports-color + dev: false + + /expo-manifests@1.0.10(expo@54.0.30): + resolution: {integrity: sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ==} + peerDependencies: + expo: '*' + dependencies: + '@expo/config': 12.0.13 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-json-utils: 0.15.0 + transitivePeerDependencies: + - supports-color + dev: false + + /expo-modules-autolinking@3.0.23: + resolution: {integrity: sha512-YZnaE0G+52xftjH5nsIRaWsoVBY38SQCECclpdgLisdbRY/6Mzo7ndokjauOv3mpFmzMZACHyJNu1YSAffQwTg==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + commander: 7.2.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + dev: false + + /expo-modules-core@3.0.29(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-navigation-bar@5.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-r9rdLw8mY6GPMQmVVOY/r1NBBw74DZefXHF60HxhRsdNI2kjc1wLdfWfR2rk4JVdOvdMDujnGrc9HQmqM3n8Jg==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-notifications@0.32.15(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-gnJcauheC2S0Wl0RuJaFkaBRVzCG011j5hlG0TEbsuOCPBuB/F30YEk8yurK8Psv+zHkVfeiJ5AC+nL0LWk0WA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + '@expo/image-utils': 0.8.8 + '@ide/backoff': 1.0.0 + abort-controller: 3.0.0 + assert: 2.1.0 + badgin: 1.2.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-application: 7.0.8(expo@54.0.30) + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-router@6.0.21(@expo/metro-runtime@6.1.2)(@react-native-masked-view/masked-view@0.3.2)(@types/react@19.1.17)(expo-constants@18.0.12)(expo-linking@8.0.11)(expo@54.0.30)(react-dom@19.1.0)(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-wjTUjrnWj6gRYjaYl1kYfcRnNE4ZAQ0kz0+sQf6/mzBd/OU6pnOdD7WrdAW3pTTpm52Q8sMoeX98tNQEddg2uA==} + peerDependencies: + '@expo/metro-runtime': ^6.1.2 + '@react-navigation/drawer': ^7.5.0 + '@testing-library/react-native': '>= 12.0.0' + expo: '*' + expo-constants: ^18.0.12 + expo-linking: ^8.0.11 + react: '*' + react-dom: '*' + react-native: '*' + react-native-gesture-handler: '*' + react-native-reanimated: '*' + react-native-safe-area-context: '>= 5.4.0' + react-native-screens: '*' + react-native-web: '*' + react-server-dom-webpack: ~19.0.3 || ~19.1.4 || ~19.2.3 + peerDependenciesMeta: + '@react-navigation/drawer': + optional: true + '@testing-library/react-native': + optional: true + react-dom: + optional: true + react-native-gesture-handler: + optional: true + react-native-reanimated: + optional: true + react-native-web: + optional: true + react-server-dom-webpack: + optional: true + dependencies: + '@expo/metro-runtime': 6.1.2(expo@54.0.30)(react-dom@19.1.0)(react-native@0.81.5)(react@19.1.0) + '@expo/schema-utils': 0.1.8 + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-tabs': 1.1.13(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + '@react-navigation/bottom-tabs': 7.9.0(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.26(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native-stack': 7.9.0(@react-native-masked-view/masked-view@0.3.2)(@react-navigation/native@7.1.26)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0) + client-only: 0.0.1 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + expo-linking: 8.0.11(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-server: 1.0.5 + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-fast-compare: 3.2.2 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + semver: 7.6.3 + server-only: 0.0.1 + sf-symbols-typescript: 2.2.0 + shallowequal: 1.1.0 + use-latest-callback: 0.2.6(react@19.1.0) + vaul: 1.1.2(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + - '@types/react' + - '@types/react-dom' + - supports-color + dev: false + + /expo-server@1.0.5: + resolution: {integrity: sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==} + engines: {node: '>=20.16.0'} + dev: false + + /expo-sharing@14.0.8(expo@54.0.30): + resolution: {integrity: sha512-A1pPr2iBrxypFDCWVAESk532HK+db7MFXbvO2sCV9ienaFXAk7lIBm6bkqgE6vzRd9O3RGdEGzYx80cYlc089Q==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-splash-screen@31.0.13(expo@54.0.30): + resolution: {integrity: sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==} + peerDependencies: + expo: '*' + dependencies: + '@expo/prebuild-config': 54.0.8(expo@54.0.30) + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-status-bar@3.0.9(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-structured-headers@5.0.0: + resolution: {integrity: sha512-RmrBtnSphk5REmZGV+lcdgdpxyzio5rJw8CXviHE6qH5pKQQ83fhMEcigvrkBdsn2Efw2EODp4Yxl1/fqMvOZw==} + dev: false + + /expo-system-ui@6.0.9(expo@54.0.30)(react-native-web@0.21.2)(react-native@0.81.5): + resolution: {integrity: sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==} + peerDependencies: + expo: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + dependencies: + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + transitivePeerDependencies: + - supports-color + dev: false + + /expo-tracking-transparency@6.0.8(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-4/NW47Kmrtj3J0udUmzxiq01gRY+vG8wFsUop6CTOVWlk+2MypjDFwBSscHcyiS2dJGNQLOQSBZ1RNhLdgSBOQ==} + peerDependencies: + expo: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo-updates-interface@2.0.0(expo@54.0.30): + resolution: {integrity: sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==} + peerDependencies: + expo: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /expo-updates@29.0.15(expo@54.0.30)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-6Qj+g56nnCksKKnEPQFm19dfWvYB5EggQNN3SaLbIj4LI40k/pjQwqYStEuwTU+Ow+PG0AqxIhQ3NvgVPEzLvg==} + hasBin: true + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + dependencies: + '@expo/code-signing-certificates': 0.0.5 + '@expo/plist': 0.4.8 + '@expo/spawn-async': 1.7.2 + arg: 4.1.0 + chalk: 4.1.2 + debug: 4.4.3 + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + expo-eas-client: 1.0.8 + expo-manifests: 1.0.10(expo@54.0.30) + expo-structured-headers: 5.0.0 + expo-updates-interface: 2.0.0(expo@54.0.30) + getenv: 2.0.0 + glob: 13.0.0 + ignore: 5.3.2 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + resolve-from: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /expo-web-browser@15.0.10(expo@54.0.30)(react-native@0.81.5): + resolution: {integrity: sha512-fvDhW4bhmXAeWFNFiInmsGCK83PAqAcQaFyp/3pE/jbdKmFKoRCWr46uZGIfN4msLK/OODhaQ/+US7GSJNDHJg==} + peerDependencies: + expo: '*' + react-native: '*' + dependencies: + expo: 54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /expo@54.0.30(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.21)(react-native-webview@13.16.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-6q+aFfKL0SpT8prfdpR3V8HcN51ov0mCGuwQTzyuk6eeO9rg7a7LWbgPv9rEVXGZEuyULstL8LGNwHqusand7Q==} + hasBin: true + peerDependencies: + '@expo/dom-webview': '*' + '@expo/metro-runtime': '*' + react: '*' + react-native: '*' + react-native-webview: '*' + peerDependenciesMeta: + '@expo/dom-webview': + optional: true + '@expo/metro-runtime': + optional: true + react-native-webview: + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@expo/cli': 54.0.20(expo-router@6.0.21)(expo@54.0.30)(react-native@0.81.5) + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devtools': 0.1.8(react-native@0.81.5)(react@19.1.0) + '@expo/fingerprint': 0.15.4 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.12(expo@54.0.30) + '@expo/metro-runtime': 6.1.2(expo@54.0.30)(react-dom@19.1.0)(react-native@0.81.5)(react@19.1.0) + '@expo/vector-icons': 15.0.3(expo-font@14.0.10)(react-native@0.81.5)(react@19.1.0) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 54.0.9(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.30)(react-refresh@0.14.2) + expo-asset: 12.0.12(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-constants: 18.0.12(expo@54.0.30)(react-native@0.81.5) + expo-file-system: 19.0.21(expo@54.0.30)(react-native@0.81.5) + expo-font: 14.0.10(expo@54.0.30)(react-native@0.81.5)(react@19.1.0) + expo-keep-awake: 15.0.8(expo@54.0.30)(react@19.1.0) + expo-modules-autolinking: 3.0.23 + expo-modules-core: 3.0.29(react-native@0.81.5)(react@19.1.0) + pretty-format: 29.7.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-webview: 13.16.0(react-native@0.81.5)(react@19.1.0) + react-refresh: 0.14.2 + whatwg-url-without-unicode: 8.0.0-3 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - graphql + - supports-color + - utf-8-validate + dev: false + + /exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /extract-colors@4.2.1: + resolution: {integrity: sha512-QAWcuwxnL9pisK7YfuG8qab6IF7UD6bbKTjiM+QTJ9Xvfi7fBymQd/xTFaPhkzkB5kyq+wla3AHanM7LInFLaQ==} + dev: false + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + requiresBuild: true + dev: true + optional: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-equals@5.4.0: + resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} + engines: {node: '>=6.0.0'} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + 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==} + dev: true + + /fast-png@6.4.0: + resolution: {integrity: sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==} + dependencies: + '@types/pako': 2.0.4 + iobuffer: 5.4.0 + pako: 2.1.0 + dev: false + + /fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + dev: false + + /fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + dependencies: + reusify: 1.1.0 + + /fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: false + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false + + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + dependencies: + cross-fetch: 3.2.0 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + dev: false + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fdir@6.5.0(picomatch@4.0.3): + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.3 + + /fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + dev: false + + /fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + dev: false + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /file-saver@2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + dev: false + + /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 + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.8 + dev: true + + /flags@4.0.2(next@15.5.9)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-qNMPc10TKe/5pA0evWxS0vDm3AMpicB7uf6e/+828chNAWUoVziRJfyOcBWwadl4zBhmTfPz+hxTVpNKF7+/PA==} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + '@sveltejs/kit': '*' + next: '*' + react: '*' + react-dom: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@edge-runtime/cookies': 5.0.2 + jose: 5.10.0 + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + dev: true + + /flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + dev: true + + /flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + /follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /fontfaceobserver@2.3.0: + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} + dev: false + + /fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + dependencies: + '@swc/helpers': 0.5.18 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + dev: false + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + /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 + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /frac@1.1.2: + resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==} + engines: {node: '>=0.8'} + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /framer-motion@12.23.26(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 12.23.23 + motion-utils: 12.23.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + + /freeport-async@2.0.0: + resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==} + engines: {node: '>=8'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + dev: false + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /geist@1.5.1(next@15.5.9): + resolution: {integrity: sha512-mAHZxIsL2o3ZITFaBVFBnwyDOw+zNLYum6A6nIjpzCGIO8QtC3V76XF2RnZTyLx1wlDTmMDy8jg3Ib52MIjGvQ==} + peerDependencies: + next: '>=13.2.0' + dependencies: + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + dev: false + + /generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + dev: false + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + 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'} + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.3 + dev: true + + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + dev: true + + /get-them-args@1.3.2: + resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} + dev: false + + /get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /getenv@2.0.0: + resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} + engines: {node: '>=6'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + /glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + dev: true + optional: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: false + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + dev: true + + /good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + dependencies: + delegate: 3.2.0 + dev: false + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /gsap@3.14.2: + resolution: {integrity: sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==} + dev: false + + /hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + dev: false + + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + dev: false + + /hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + dev: false + + /hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + 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@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + 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.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + 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@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + dev: false + + /hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + /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.3 + 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.3 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + + /hast@1.0.0: + resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==} + deprecated: Renamed to rehype + 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 + + /hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + + /hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + + /hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + dependencies: + hermes-estree: 0.29.1 + + /hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + dependencies: + hermes-estree: 0.32.0 + + /hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + dev: false + + /highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + dev: false + + /hjson@3.2.2: + resolution: {integrity: sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==} + hasBin: true + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.4.3 + dev: false + + /hsl-to-hex@1.0.0: + resolution: {integrity: sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==} + dependencies: + hsl-to-rgb-for-reals: 1.1.1 + dev: false + + /hsl-to-rgb-for-reals@1.1.1: + resolution: {integrity: sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==} + dev: false + + /html-entities@2.5.3: + resolution: {integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==} + dev: false + + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + + /html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + /html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + dev: false + + /html2pdf.js@0.10.3: + resolution: {integrity: sha512-RcB1sh8rs5NT3jgbN5zvvTmkmZrsUrxpZ/RI8TMbvuReNZAdJZG5TMfA2TBP6ZXxpXlWf9NB/ciLXVb6W2LbRQ==} + dependencies: + es6-promise: 4.2.8 + html2canvas: 1.4.1 + jspdf: 3.0.4 + dev: false + + /http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + dev: true + + /http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /hyphen@1.13.0: + resolution: {integrity: sha512-flZoIooovWALhu04Z3ooPWQldjTOgLDs5DlbUxTjnIyhQKu9ukljKWwElFCUyVi6TBk210bMBlaMG8eW3bXU+g==} + dev: false + + /hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + dev: false + + /i18next@25.7.3(typescript@5.9.3): + resolution: {integrity: sha512-2XaT+HpYGuc2uTExq9TVRhLsso+Dxym6PWaKpn36wfBmTI779OQ7iP/XaZHzrnGyzU4SHpFrTYLKfVyBfAhVNA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.4 + typescript: 5.9.3 + dev: false + + /iceberg-js@0.8.1: + resolution: {integrity: sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==} + engines: {node: '>=20.0.0'} + dev: false + + /iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + requiresBuild: true + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + dev: true + optional: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + /ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + dev: true + + /image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + dependencies: + queue: 6.0.2 + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + dev: false + + /immer@11.1.3: + resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==} + dev: false + + /immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + dev: false + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + dev: false + + /inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + dependencies: + css-in-js-utils: 3.1.0 + dev: false + + /input-format@0.3.14(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gHMrgrbCgmT4uK5Um5eVDUohuV9lcs95ZUUN9Px2Y0VIfjTzT2wF8Q3Z4fwLFm7c5Z2OXCm53FHoovj6SlOKdg==} + peerDependencies: + react: '>=18.1.0' + react-dom: '>=18.1.0' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /install@0.13.0: + resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} + engines: {node: '>= 0.10'} + dev: false + + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /intl-messageformat@10.7.18: + resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/icu-messageformat-parser': 2.11.4 + tslib: 2.8.1 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /iobuffer@5.4.0: + resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} + dev: false + + /iota-array@1.0.0: + resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} + dev: false + + /ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + dev: true + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /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.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: false + + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + dev: false + + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + + /is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + dependencies: + semver: 7.7.3 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: true + + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-emoji-supported@0.0.5: + resolution: {integrity: sha512-WOlXUhDDHxYqcSmFZis+xWhhqXiK2SU0iYiqmth5Ip0FHLZQAt9rKL5ahnilE8/86WH8tZ3bmNNNC+bTzamqlw==} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: false + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: false + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + dev: true + + /is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: true + + /isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + dev: false + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + dev: true + + /its-fine@2.0.0(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==} + peerDependencies: + react: ^19.0.0 + dependencies: + '@types/react-reconciler': 0.28.9(@types/react@18.3.27) + react: 18.3.1 + transitivePeerDependencies: + - '@types/react' + dev: false + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + dev: true + + /jay-peg@1.1.1: + resolution: {integrity: sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==} + dependencies: + restructure: 3.0.2 + dev: false + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.19.27 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.19.27 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.19.27 + jest-util: 29.7.0 + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.19.27 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.19.27 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jimp-compact@0.16.1: + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} + dev: false + + /jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + dev: false + + /jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: false + + /jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + dev: false + + /jquery@3.6.0: + resolution: {integrity: sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + requiresBuild: true + dev: true + optional: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + dev: true + + /jsonrepair@3.13.1: + resolution: {integrity: sha512-WJeiE0jGfxYmtLwBTEk8+y/mYcaleyLXWaqp5bJu0/ZTSeG0KQq/wWQ8pmnkKenEdN6pdnn6QtcoSUkbqDHWNw==} + hasBin: true + dev: false + + /jspdf@3.0.4: + resolution: {integrity: sha512-dc6oQ8y37rRcHn316s4ngz/nOjayLF/FFxBF4V9zamQKRqXxyiH1zagkCdktdWhtoQId5K20xt1lB90XzkB+hQ==} + dependencies: + '@babel/runtime': 7.28.4 + fast-png: 6.4.0 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.47.0 + dompurify: 3.3.1 + html2canvas: 1.4.1 + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + dev: true + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /katex@0.16.27: + resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + dev: false + + /kill-port@2.0.1: + resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} + hasBin: true + dependencies: + get-them-args: 1.3.2 + shell-exec: 1.0.2 + dev: false + + /klaw-sync@6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + dependencies: + graceful-fs: 4.2.11 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /konva@9.3.22: + resolution: {integrity: sha512-yQI5d1bmELlD/fowuyfOp9ff+oamg26WOCkyqUyc+nczD/lhRa3EvD2MZOoc4c1293TAubW9n34fSQLgSeEgSw==} + dev: false + + /lan-network@0.1.7: + resolution: {integrity: sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==} + hasBin: true + dev: false + + /langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + dev: false + + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: true + + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: false + + /layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + dev: false + + /lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + dev: true + + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + dependencies: + isomorphic.js: 0.2.5 + dev: false + + /libphonenumber-js@1.12.33: + resolution: {integrity: sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==} + dev: false + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + /lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /lightningcss-darwin-arm64@1.27.0: + resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /lightningcss-darwin-x64@1.27.0: + resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /lightningcss-freebsd-x64@1.27.0: + resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /lightningcss-linux-arm-gnueabihf@1.27.0: + resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /lightningcss-linux-arm64-gnu@1.27.0: + resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /lightningcss-linux-arm64-musl@1.27.0: + resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /lightningcss-linux-x64-gnu@1.27.0: + resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /lightningcss-linux-x64-musl@1.27.0: + resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /lightningcss-win32-arm64-msvc@1.27.0: + resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /lightningcss-win32-x64-msvc@1.27.0: + resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /lightningcss@1.27.0: + resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.27.0 + lightningcss-darwin-x64: 1.27.0 + lightningcss-freebsd-x64: 1.27.0 + lightningcss-linux-arm-gnueabihf: 1.27.0 + lightningcss-linux-arm64-gnu: 1.27.0 + lightningcss-linux-arm64-musl: 1.27.0 + lightningcss-linux-x64-gnu: 1.27.0 + lightningcss-linux-x64-musl: 1.27.0 + lightningcss-win32-arm64-msvc: 1.27.0 + lightningcss-win32-x64-msvc: 1.27.0 + dev: false + + /lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + /lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + dev: false + + /linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /linkify-it@2.2.0: + resolution: {integrity: sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==} + dependencies: + uc.micro: 1.0.6 + dev: false + + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: false + + /linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + dev: false + + /liquid-glass-react@1.1.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pKzaktaMAEztd93wpWcz2Z5Z9qdLJUNJdMX+n00Ca4XsnrLTQ5xJzm/+GQXZUeuFXe/PQ8ziVMZO6531PyaFJw==} + peerDependencies: + react: '>=19' + react-dom: '>=19' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash-es@4.17.22: + resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: true + + /lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + dev: true + + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + /lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + dependencies: + chalk: 2.4.2 + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /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 + dependencies: + js-tokens: 4.0.0 + + /lottie-react-native@7.3.4(@lottiefiles/dotlottie-react@0.13.5)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-XUh7eGFb7ID8JRdU6U4N4cYQeYmjtdQRvd8ZXJ6xrdSsn5gZD0c79ITOREPcwJg4YupBFHgyV1GXdAHQP+KYUQ==} + peerDependencies: + '@lottiefiles/dotlottie-react': ^0.13.5 + react: '*' + react-native: '>=0.46' + react-native-windows: '>=0.63.x' + peerDependenciesMeta: + '@lottiefiles/dotlottie-react': + optional: true + react-native-windows: + optional: true + dependencies: + '@lottiefiles/dotlottie-react': 0.13.5(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /lottie-react@2.4.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==} + 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: + lottie-web: 5.13.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /lottie-web@5.13.0: + resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.8.1 + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /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 + + /lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + dev: false + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + /lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + + /lucide-react-native@0.545.0(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-v9MC1CJ5jJkBbGvO+jrq9Iqe58pS8FvmdIO1NEr7mzQEx7E2VGfXkl1iaJsKpDSqofYhv4Xrks2I2ewF66HIDA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-native: '*' + react-native-svg: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-svg: 15.12.1(react-native@0.81.5)(react@19.1.0) + dev: false + + /lucide-react@0.479.0(react@18.3.1): + resolution: {integrity: sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 18.3.1 + dev: false + + /lucide-react@0.542.0(react@18.3.1): + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 18.3.1 + dev: false + + /magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + dev: true + + /make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + dev: false + + /make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + dev: false + + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.6.0 + cacache: 16.1.3 + http-cache-semantics: 4.2.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + + /markdown-it@10.0.0: + resolution: {integrity: sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==} + hasBin: true + dependencies: + argparse: 1.0.10 + entities: 2.0.3 + linkify-it: 2.2.0 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: false + + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: false + + /markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + dev: false + + /marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} + hasBin: true + dev: false + + /marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + dev: false + + /marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + /matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + escape-string-regexp: 4.0.0 + dev: true + optional: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + /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@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + 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 + + /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 + + /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 + + /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.3 + 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.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + 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 + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + dev: false + + /mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + 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 + + /mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + 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@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.4 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: false + + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: false + + /media-engine@1.0.3: + resolution: {integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==} + dev: false + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + /memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + dependencies: + is-plain-obj: 2.1.0 + dev: false + + /merge-refs@1.3.0(@types/react@18.3.27): + resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.27 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /mermaid@11.12.2: + resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==} + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.1.0 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.1 + katex: 0.16.27 + khroma: 2.1.0 + lodash-es: 4.17.22 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + dev: false + + /metro-babel-transformer@0.83.3: + resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} + engines: {node: '>=20.19.4'} + dependencies: + '@babel/core': 7.28.5 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.32.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + /metro-cache-key@0.83.3: + resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} + engines: {node: '>=20.19.4'} + dependencies: + flow-enums-runtime: 0.0.6 + + /metro-cache@0.83.3: + resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} + engines: {node: '>=20.19.4'} + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.3 + transitivePeerDependencies: + - supports-color + + /metro-config@0.83.3: + resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} + engines: {node: '>=20.19.4'} + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.3 + metro-cache: 0.83.3 + metro-core: 0.83.3 + metro-runtime: 0.83.3 + yaml: 2.8.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /metro-core@0.83.3: + resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} + engines: {node: '>=20.19.4'} + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.3 + + /metro-file-map@0.83.3: + resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} + engines: {node: '>=20.19.4'} + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + /metro-minify-terser@0.83.3: + resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} + engines: {node: '>=20.19.4'} + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.44.1 + + /metro-resolver@0.83.3: + resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} + engines: {node: '>=20.19.4'} + dependencies: + flow-enums-runtime: 0.0.6 + + /metro-runtime@0.83.3: + resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} + engines: {node: '>=20.19.4'} + dependencies: + '@babel/runtime': 7.28.4 + flow-enums-runtime: 0.0.6 + + /metro-source-map@0.83.3: + resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} + engines: {node: '>=20.19.4'} + dependencies: + '@babel/traverse': 7.28.5 + '@babel/traverse--for-generate-function-map': /@babel/traverse@7.28.5 + '@babel/types': 7.28.5 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.3 + nullthrows: 1.1.1 + ob1: 0.83.3 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + /metro-symbolicate@0.83.3: + resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==} + engines: {node: '>=20.19.4'} + hasBin: true + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.3 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + /metro-transform-plugins@0.83.3: + resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} + engines: {node: '>=20.19.4'} + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + /metro-transform-worker@0.83.3: + resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} + engines: {node: '>=20.19.4'} + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + flow-enums-runtime: 0.0.6 + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-minify-terser: 0.83.3 + metro-source-map: 0.83.3 + metro-transform-plugins: 0.83.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /metro@0.83.3: + resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==} + engines: {node: '>=20.19.4'} + hasBin: true + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.32.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /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-cjk-friendly-gfm-strikethrough@1.2.3(micromark@4.0.2): + resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.4.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-extension-cjk-friendly-util@2.1.1: + resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} + engines: {node: '>=16'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true + dependencies: + get-east-asian-width: 1.4.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + dev: false + + /micromark-extension-cjk-friendly@1.2.3(micromark@4.0.2): + resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + 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.27 + 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@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@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@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@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@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@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + /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@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@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@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + dependencies: + micromark-util-symbol: 2.0.1 + 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@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + /micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + 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@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + dependencies: + micromark-util-types: 2.0.2 + 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 + + /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@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + /micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + /micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + 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@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.12 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.1.2 + dev: false + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + dev: false + + /motion-dom@12.23.23: + resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} + dependencies: + motion-utils: 12.23.6 + dev: false + + /motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + dev: false + + /napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + dev: true + + /nativewind@4.2.1(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0)(tailwindcss@3.4.19): + resolution: {integrity: sha512-10uUB2Dlli3MH3NDL5nMHqJHz1A3e/E6mzjTj6cl7hHECClJ7HpE6v+xZL+GXdbwQSnWE+UWMIMsNz7yOQkAJQ==} + engines: {node: '>=16'} + peerDependencies: + tailwindcss: '>3.3.0' + dependencies: + comment-json: 4.5.1 + debug: 4.4.3 + react-native-css-interop: 0.2.1(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0)(tailwindcss@3.4.19) + tailwindcss: 3.4.19 + transitivePeerDependencies: + - react + - react-native + - react-native-reanimated + - react-native-safe-area-context + - react-native-svg + - supports-color + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /ndarray-ops@1.2.2: + resolution: {integrity: sha512-BppWAFRjMYF7N/r6Ie51q6D4fs0iiGmeXIACKY66fLpnwIui3Wc3CXiD/30mgLbDjPpSLrsqcp3Z62+IcHZsDw==} + dependencies: + cwise-compiler: 1.1.3 + dev: false + + /ndarray-pixels@4.1.0: + resolution: {integrity: sha512-xKPI4zXJ2pkUcVX24zIN1AWqqPWvRWWhRuO6PlY4EdB2VNRauNwA6rDdsAQG/ldQp0sU7nTXgPR/io1duy3Zyg==} + dependencies: + '@types/ndarray': 1.0.14 + ndarray: 1.0.19 + ndarray-ops: 1.2.2 + sharp: 0.33.5 + dev: false + + /ndarray@1.0.19: + resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + dependencies: + iota-array: 1.0.0 + is-buffer: 1.1.6 + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /negotiator@0.6.4: + 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 + + /nested-error-stacks@2.0.1: + resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} + dev: false + + /next-intl-swc-plugin-extractor@4.7.0: + resolution: {integrity: sha512-iAqflu2FWdQMWhwB0B2z52X7LmEpvnMNJXqVERZQ7bK5p9iqQLu70ur6Ka6NfiXLxfb+AeAkUX5qIciQOg+87A==} + dev: false + + /next-intl@4.7.0(next@15.5.9)(react@18.3.1)(typescript@5.9.3): + resolution: {integrity: sha512-gvROzcNr/HM0jTzQlKWQxUNk8jrZ0bREz+bht3wNbv+uzlZ5Kn3J+m+viosub18QJ72S08UJnVK50PXWcUvwpQ==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@formatjs/intl-localematcher': 0.5.10 + '@parcel/watcher': 2.5.1 + '@swc/core': 1.15.8 + negotiator: 1.0.0 + next: 15.5.9(react-dom@18.3.1)(react@18.3.1) + next-intl-swc-plugin-extractor: 4.7.0 + po-parser: 2.1.1 + react: 18.3.1 + typescript: 5.9.3 + use-intl: 4.7.0(react@18.3.1) + transitivePeerDependencies: + - '@swc/helpers' + dev: false + + /next-themes@0.4.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /next@15.5.9(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001762 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + dev: true + + /node-abi@3.85.0: + resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} + engines: {node: '>=10'} + dependencies: + semver: 7.7.3 + + /node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + requiresBuild: true + dev: true + optional: true + + /node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + dev: false + + /node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + dependencies: + semver: 7.7.3 + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + engines: {node: '>= 6.13.0'} + dev: false + + /node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.7.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + /node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-svg-path@1.1.0: + resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + dependencies: + svg-arc-to-cubic-bezier: 3.2.0 + dev: false + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.3 + validate-npm-package-name: 5.0.1 + dev: false + + /npm@11.7.0: + resolution: {integrity: sha512-wiCZpv/41bIobCoJ31NStIWKfAxxYyD1iYnWCtiyns8s5v3+l8y0HCP/sScuH6B5+GhIfda4HQKiqeGZwJWhFw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + dev: false + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/metavuln-calculator' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + /number-flow@0.5.8: + resolution: {integrity: sha512-FPr1DumWyGi5Nucoug14bC6xEz70A1TnhgSHhKyfqjgji2SOTz+iLJxKtv37N5JyJbteGYCm6NQ9p1O4KZ7iiA==} + dependencies: + esm-env: 1.2.2 + dev: false + + /ob1@0.83.3: + resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} + engines: {node: '>=20.19.4'} + dependencies: + flow-enums-runtime: 0.0.6 + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + /object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + dev: true + + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + /oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /ora@3.4.0: + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.9.2 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + /package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + dev: false + + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: false + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /papaparse@5.5.3: + resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + dependencies: + '@types/unist': 2.0.11 + 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==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-png@2.1.0: + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} + dependencies: + pngjs: 3.4.0 + dev: false + + /parse-svg-path@0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + dev: false + + /parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + dependencies: + entities: 6.0.1 + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /partysocket@1.1.10: + resolution: {integrity: sha512-ACfn0P6lQuj8/AqB4L5ZDFcIEbpnIteNNObrlxqV1Ge80GTGhjuJ2sNKwNQlFzhGi4kI7fP/C1Eqh8TR78HjDQ==} + dependencies: + event-target-polyfill: 0.0.4 + dev: false + + /patch-package@8.0.1: + resolution: {integrity: sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==} + engines: {node: '>=14', npm: '>5'} + hasBin: true + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + ci-info: 3.9.0 + cross-spawn: 7.0.6 + find-yarn-workspace-root: 2.0.0 + fs-extra: 10.1.0 + json-stable-stringify: 1.3.0 + klaw-sync: 6.0.0 + minimist: 1.2.8 + open: 7.4.2 + semver: 7.7.3 + slash: 2.0.0 + tmp: 0.2.5 + yaml: 2.8.2 + dev: true + + /path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + dev: false + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + /path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /path2d@0.2.2: + resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + dev: false + + /pdfjs-dist@4.8.69: + resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} + engines: {node: '>=18'} + optionalDependencies: + canvas: 3.2.0 + path2d: 0.2.2 + dev: false + + /pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + dev: true + + /peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + dev: false + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + requiresBuild: true + dev: false + optional: true + + /phenomenon@1.6.0: + resolution: {integrity: sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==} + dev: false + + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: false + + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + /pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + dev: false + + /playwright-core@1.57.0: + resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} + engines: {node: '>=18'} + hasBin: true + dev: false + + /playwright@1.57.0: + resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} + engines: {node: '>=18'} + hasBin: true + dependencies: + playwright-core: 1.57.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + /pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: false + + /po-parser@2.1.1: + resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} + dev: false + + /points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + dev: false + + /points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + dev: false + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + /postcss-import@15.1.0(postcss@8.5.6): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + dev: false + + /postcss-js@4.1.0(postcss@8.5.6): + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + dev: false + + /postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + dependencies: + jiti: 1.21.7 + lilconfig: 3.1.3 + postcss: 8.5.6 + dev: false + + /postcss-nested@6.2.0(postcss@8.5.6): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + dev: false + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + dev: false + + /postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + /posthog-js@1.313.0: + resolution: {integrity: sha512-CL8RkC7m9BTZrix86w0fdnSCVqC/gxrfs6c4Wfkz/CldFD7f2912S2KqnWFmwRVDGIwm9IR82YhublQ88gdDKw==} + dependencies: + '@posthog/core': 1.9.0 + core-js: 3.47.0 + fflate: 0.4.8 + preact: 10.28.1 + web-vitals: 4.2.4 + dev: false + + /posthog-node@5.18.1: + resolution: {integrity: sha512-Hi7cRqAlvuEitdiurXJFdMip+BxcwYoX66at5RErMVP91V+Ph9BspGiawC3mJx/4znjwUjF29kAhf8oZQ2uJ5Q==} + engines: {node: '>=20'} + dependencies: + '@posthog/core': 1.9.0 + dev: false + + /preact@10.28.1: + resolution: {integrity: sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==} + dev: false + + /prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.85.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.6.14(prettier@3.7.4): + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.7.4 + dev: true + + /prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: false + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + /prism-react-renderer@2.4.1(react@18.3.1): + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 18.3.1 + dev: false + + /prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + dev: false + + /proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /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'} + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + /prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + dependencies: + prosemirror-transform: 1.10.5 + dev: false + + /prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + dependencies: + prosemirror-state: 1.4.4 + dev: false + + /prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + dev: false + + /prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + dev: false + + /prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + dev: false + + /prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + dev: false + + /prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + dev: false + + /prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + dev: false + + /prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + dependencies: + prosemirror-model: 1.25.4 + dev: false + + /prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + dev: false + + /prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + dev: false + + /prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + dev: false + + /prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4): + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + dev: false + + /prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + dependencies: + prosemirror-model: 1.25.4 + dev: false + + /prosemirror-view@1.41.4: + resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qrcode-terminal@0.11.0: + resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} + hasBin: true + dev: false + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /radix-ui@1.4.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} + 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-accessible-icon': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-form': 0.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7)(@types/react@18.3.27)(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.27)(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.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-select': 2.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.27)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.27 + '@types/react-dom': 18.3.7(@types/react@18.3.27) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + requiresBuild: true + dependencies: + performance-now: 2.1.0 + dev: false + optional: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-color-palette@7.3.1(react@18.3.1): + resolution: {integrity: sha512-O8eTbogOKExVbhFOCaQ6WACQtGznymLqbd95i4C42PZd8im9OwL1NjuGxswk2JxJR5jfcTu7KQzl7VbpU48m+g==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.8' + dependencies: + react: 18.3.1 + dev: false + + /react-colorful@5.6.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + date-fns: 3.6.0 + react: 18.3.1 + dev: false + + /react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /react-diff-viewer-continued@3.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kMZmUyb3Pv5L9vUtCfIGYsdOHs8mUojblGy1U1Sm0D7FhAOEsH9QhnngEIRo5hXWIPNGupNRJls1TJ6Eqx84eg==} + engines: {node: '>= 8'} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@emotion/css': 11.13.5 + classnames: 2.5.1 + diff: 5.2.0 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - supports-color + dev: false + + /react-dom@16.12.0(react@16.12.0): + resolution: {integrity: sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==} + peerDependencies: + react: ^16.0.0 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.12.0 + scheduler: 0.18.0 + dev: false + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-dom@19.1.0(react@19.1.0): + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + dev: false + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false + + /react-freeze@1.0.4(react@19.1.0): + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=17.0.0' + dependencies: + react: 19.1.0 + dev: false + + /react-hook-form@7.70.0(react@18.3.1): + resolution: {integrity: sha512-COOMajS4FI3Wuwrs3GPpi/Jeef/5W1DRR84Yl5/ShlT3dKVFUfoGiEZ/QE6Uw8P4T2/CLJdcTVYKvWBMQTEpvw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + dependencies: + react: 18.3.1 + dev: false + + /react-i18next@16.5.1(i18next@25.7.3)(react-dom@19.1.0)(react-native@0.81.5)(react@19.1.0)(typescript@5.9.3): + resolution: {integrity: sha512-Hks6UIRZWW4c+qDAnx1csVsCGYeIR4MoBGQgJ+NUoNnO6qLxXuf8zu0xdcinyXUORgGzCdRsexxO1Xzv3sTdnw==} + peerDependencies: + i18next: '>= 25.6.2' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + dependencies: + '@babel/runtime': 7.28.4 + html-parse-stringify: 3.0.1 + i18next: 25.7.3(typescript@5.9.3) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + typescript: 5.9.3 + use-sync-external-store: 1.6.0(react@19.1.0) + dev: false + + /react-icons@5.5.0(react@18.3.1): + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + dependencies: + react: 18.3.1 + dev: false + + /react-infinite-scroll-component@6.1.1(react@18.3.1): + resolution: {integrity: sha512-R8YoOyiNDynSWmfVme5LHslsKrP+/xcRUWR2ies8UgUab9dtyw5ECnMCVPPmnmjjF4MWQmfVdRwRWcWaDgeyMA==} + peerDependencies: + react: '>=16.0.0' + dependencies: + react: 18.3.1 + throttle-debounce: 2.3.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + /react-is@19.2.3: + resolution: {integrity: sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==} + dev: false + + /react-konva@19.2.1(@types/react@18.3.27)(konva@9.3.22)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-sqZWCzQGpdMrU5aeunR0oxUY8UeCPbU8gnAYxMtAn6BT4coeSpiATKOctsoxRu6F56TAcF+s0c6Lul9ansNqQA==} + peerDependencies: + konva: ^8.0.1 || ^7.2.5 || ^9.0.0 || ^10.0.0 + react: ^19.2.0 + react-dom: ^19.2.0 + dependencies: + '@types/react-reconciler': 0.32.3(@types/react@18.3.27) + its-fine: 2.0.0(@types/react@18.3.27)(react@18.3.1) + konva: 9.3.22 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-reconciler: 0.33.0(react@18.3.1) + scheduler: 0.27.0 + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-markdown@10.1.0(@types/react@18.3.27)(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.27 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + 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-native-context-menu-view@1.21.0(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-GVQckdDxKyM4BYqWqiApnfzzk56vLEMWiVLsvs95mPhJJYvzRXx+Ev3T6DVEasWCZxk6PbgtcZaWi9jnXGdhCQ==} + peerDependencies: + react: ^16.8.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-native: '>=0.60.0-rc.0 <1.0.x' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-css-interop@0.2.1(react-native-reanimated@4.1.6)(react-native-safe-area-context@5.6.2)(react-native-svg@15.12.1)(react-native@0.81.5)(react@19.1.0)(tailwindcss@3.4.19): + resolution: {integrity: sha512-B88f5rIymJXmy1sNC/MhTkb3xxBej1KkuAt7TiT9iM7oXz3RM8Bn+7GUrfR02TvSgKm4cg2XiSuLEKYfKwNsjA==} + engines: {node: '>=18'} + peerDependencies: + react: '>=18' + react-native: '*' + react-native-reanimated: '>=3.6.2' + react-native-safe-area-context: '*' + react-native-svg: '*' + tailwindcss: ~3 + peerDependenciesMeta: + react-native-safe-area-context: + optional: true + react-native-svg: + optional: true + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + debug: 4.4.3 + lightningcss: 1.27.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-svg: 15.12.1(react-native@0.81.5)(react@19.1.0) + semver: 7.7.3 + tailwindcss: 3.4.19 + transitivePeerDependencies: + - supports-color + dev: false + + /react-native-drawer-layout@4.2.1(react-native-gesture-handler@2.28.0)(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-liwRJ7ynRU/ogRlUdiK1Yoi1VzUSq2Vu/RU+UgqlMB3XduslZ1DZg/mTX0f1uCEV2dJ4ec+1fRa3OlIierfyZg==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + react-native-gesture-handler: '>= 2.0.0' + react-native-reanimated: '>= 2.0.0' + dependencies: + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + dev: false + + /react-native-email-link@1.16.1(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-uTolJXOa6HKPEiRAQuLKN/OhVwUA4xS++yPV6YiCtRBWxl2q3FUlrJt1G6plfMAEU4qNhmwZnH3tCJ9WNYIDhg==} + peerDependencies: + react: '>=16.8.0' + react-native: '>=0.40.0' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-fit-image@1.5.5: + resolution: {integrity: sha512-Wl3Vq2DQzxgsWKuW4USfck9zS7YzhvLNPpkwUUCF90bL32e1a0zOVQ3WsJILJOwzmPdHfzZmWasiiAUNBkhNkg==} + dependencies: + prop-types: 15.8.1 + dev: false + + /react-native-gesture-handler@2.28.0(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-is-edge-to-edge@1.2.1(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-keyboard-controller@1.20.3(react-native-reanimated@4.1.6)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-OkfEkDFmFHRVdDM/uzAz5jYPjRgDHCZHI8NwcBcOTy7u2BxgcjiEHx/7IG1ct71hHBBcHfSUsMxR2n2cP4SHgA==} + peerDependencies: + react: '*' + react-native: '*' + react-native-reanimated: '>=3.0.0' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0) + dev: false + + /react-native-markdown-display@7.0.2(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-Mn4wotMvMfLAwbX/huMLt202W5DsdpMO/kblk+6eUs55S57VVNni1gzZCh5qpznYLjIQELNh50VIozEfY6fvaQ==} + peerDependencies: + react: '>=16.2.0' + react-native: '>=0.50.4' + dependencies: + css-to-react-native: 3.2.0 + markdown-it: 10.0.0 + prop-types: 15.8.1 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-fit-image: 1.5.5 + dev: false + + /react-native-purchases-ui@9.6.13(react-native-purchases@9.6.13)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-f6lTNX06B1Z8dEDwYlV0WDMgvz7FEdeIf4ETfUZu9XSge7O9iYdjymR9VOa2VFlDyHl/ZhonXy/uGjPzy0N5OQ==} + peerDependencies: + react: '*' + react-native: '>= 0.73.0' + react-native-purchases: 9.6.13 + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + dependencies: + '@revenuecat/purchases-typescript-internal': 17.26.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-purchases: 9.6.13(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /react-native-purchases@9.6.13(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-/+q/ZNKsn8i9Fc8QiObxod9uyhLy6EMW3Yo4quZdvs7C+yfZE/dUUD3K6Tz8KXSUTeGcE/8ZN27WZCGMlH0P9w==} + peerDependencies: + react: '>= 16.6.3' + react-native: '>= 0.73.0' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + dependencies: + '@revenuecat/purchases-js-hybrid-mappings': 17.26.0 + '@revenuecat/purchases-typescript-internal': 17.26.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) + dev: false + + /react-native-reanimated@4.1.6(@babel/core@7.28.5)(react-native-worklets@0.6.0)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: '*' + react-native: '*' + react-native-worklets: '>=0.5.0' + dependencies: + '@babel/core': 7.28.5 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + react-native-worklets: 0.6.0(@babel/core@7.28.5)(react-native@0.81.5)(react@19.1.0) + semver: 7.7.2 + dev: false + + /react-native-safe-area-context@5.6.2(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-screens@4.16.0(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + react: 19.1.0 + react-freeze: 1.0.4(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5)(react@19.1.0) + warn-once: 0.1.1 + dev: false + + /react-native-sound-level@1.3.0: + resolution: {integrity: sha512-FXdl6T4StzYBAiScK6jFVTj9g6n0pPOdWEev/2dABXYo8kwtidmmqnaEqR9CDsMNs6zMSNY5dowGjaEpT0APYQ==} + dev: false + + /react-native-sse@1.2.1: + resolution: {integrity: sha512-zejanlScF+IB9tYnbdry0MT34qjBXbiV/E72qGz33W/tX1bx8MXsbB4lxiuPETc9v/008vYZ60yjIstW22VlVg==} + dev: false + + /react-native-svg-transformer@1.5.2(react-native-svg@15.12.1)(react-native@0.81.5)(typescript@5.9.3): + resolution: {integrity: sha512-eW4hOtrd30s4SRdN4X1XYxTCu1czsxDGQKmfQ3RFbZMN5yw4ZmiKGGr+lXbQW4uDGZvSoGd9FHL1f+rgGoKg8Q==} + peerDependencies: + react-native: '>=0.59.0' + react-native-svg: '>=12.0.0' + dependencies: + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.9.3) + path-dirname: 1.0.2 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + react-native-svg: 15.12.1(react-native@0.81.5)(react@19.1.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /react-native-svg@15.12.1(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + css-select: 5.2.2 + css-tree: 1.1.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + warn-once: 0.1.1 + + /react-native-syntax-highlighter@2.1.0(react-syntax-highlighter@16.1.0): + resolution: {integrity: sha512-upu8gpKT2ZeslXn2d763KwtzzhM9OUHGgJjIKKIUw1JnFAzVwQmKCaFGoI6PkQa7T1LVggBW5k5VoaLFhZDb+g==} + peerDependencies: + react-syntax-highlighter: ^6.0.4 + dependencies: + react-syntax-highlighter: 16.1.0(react@19.1.0) + dev: false + + /react-native-url-polyfill@3.0.0(react-native@0.81.5): + resolution: {integrity: sha512-aA5CiuUCUb/lbrliVCJ6lZ17/RpNJzvTO/C7gC/YmDQhTUoRD5q5HlJfwLWcxz4VgAhHwXKzhxH+wUN24tAdqg==} + peerDependencies: + react-native: '*' + dependencies: + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + whatwg-url-without-unicode: 8.0.0-3 + dev: false + + /react-native-vector-icons@10.3.0: + resolution: {integrity: sha512-IFQ0RE57819hOUdFvgK4FowM5aMXg7C7XKsuGLevqXkkIJatc3QopN0wYrb2IrzUgmdpfP+QVIbI3S6h7M0btw==} + deprecated: react-native-vector-icons package has moved to a new model of per-icon-family packages. See the https://github.com/oblador/react-native-vector-icons/blob/master/MIGRATION.md on how to migrate + hasBin: true + dependencies: + prop-types: 15.8.1 + yargs: 16.2.0 + dev: false + + /react-native-web@0.21.2(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + dependencies: + '@babel/runtime': 7.28.4 + '@react-native/normalize-colors': 0.74.89 + fbjs: 3.0.5 + inline-style-prefixer: 7.0.1 + memoize-one: 6.0.0 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styleq: 0.1.3 + transitivePeerDependencies: + - encoding + dev: false + + /react-native-webview@13.16.0(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==} + peerDependencies: + react: '*' + react-native: '*' + dependencies: + escape-string-regexp: 4.0.0 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-native-worklets@0.6.0(@babel/core@7.28.5)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-yETMNuCcivdYWteuG4eRqgiAk2DzRCrVAaEBIEWPo4emrf3BNjadFo85L5QvyEusrX9QKE3ZEAx8U5A/nbyFgg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: '*' + react-native: '*' + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) + convert-source-map: 2.0.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0) + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + dev: false + + /react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==} + engines: {node: '>= 20.19.4'} + hasBin: true + peerDependencies: + '@types/react': ^19.1.0 + react: ^19.1.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.81.5 + '@react-native/codegen': 0.81.5(@babel/core@7.28.5) + '@react-native/community-cli-plugin': 0.81.5 + '@react-native/gradle-plugin': 0.81.5 + '@react-native/js-polyfills': 0.81.5 + '@react-native/normalize-colors': 0.81.5 + '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5)(react@19.1.0) + '@types/react': 19.1.17 + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.28.5) + babel-plugin-syntax-hermes-parser: 0.29.1 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.1.0 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.26.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 6.2.3 + yargs: 17.7.2 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + + /react-papaparse@4.4.0: + resolution: {integrity: sha512-xTEwHZYJ+1dh9mQDQjjwJXmWyX20DdZ52u+ddw75V+Xm5qsjXSvWmC7c8K82vRwMjKAOH2S9uFyGpHEyEztkUQ==} + engines: {node: '>=8', npm: '>=5'} + dependencies: + '@types/papaparse': 5.5.2 + papaparse: 5.5.3 + dev: false + + /react-pdf@9.2.1(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + 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 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.27 + clsx: 2.1.1 + dequal: 2.0.3 + make-cancellable-promise: 1.3.2 + make-event-props: 1.6.2 + merge-refs: 1.3.0(@types/react@18.3.27) + pdfjs-dist: 4.8.69 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tiny-invariant: 1.3.3 + warning: 4.0.3 + dev: false + + /react-phone-number-input@3.4.14(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-T9MziNuvthzv6+JAhKD71ab/jVXW5U20nQZRBJd6+q+ujmkC+/ISOf2GYo8pIi4VGjdIYRIHDftMAYn3WKZT3w==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + classnames: 2.5.1 + country-flag-icons: 1.6.4 + input-format: 0.3.14(react-dom@18.3.1)(react@18.3.1) + libphonenumber-js: 1.12.33 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-reconciler@0.33.0(react@18.3.1): + resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.2.0 + dependencies: + react: 18.3.1 + scheduler: 0.27.0 + dev: false + + /react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1): + resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + dependencies: + '@types/react': 18.3.27 + '@types/use-sync-external-store': 0.0.6 + react: 18.3.1 + redux: 5.0.1 + use-sync-external-store: 1.6.0(react@18.3.1) + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + /react-remove-scroll-bar@2.3.8(@types/react@18.3.27)(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.27 + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.27)(react@18.3.1) + tslib: 2.8.1 + dev: false + + /react-remove-scroll-bar@2.3.8(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0) + tslib: 2.8.1 + dev: false + + /react-remove-scroll@2.5.4(@types/react@18.3.27)(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.27 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.27)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.27)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.27)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.27)(react@18.3.1) + dev: false + + /react-remove-scroll@2.7.2(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + 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.27 + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.27)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.27)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.27)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.27)(react@18.3.1) + dev: false + + /react-remove-scroll@2.7.2(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + 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': 19.1.17 + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.17)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.17)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.17)(react@19.1.0) + dev: false + + /react-resizable-panels@3.0.6(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /react-style-singleton@2.2.3(@types/react@18.3.27)(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.27 + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /react-style-singleton@2.2.3(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + dev: false + + /react-syntax-highlighter@16.1.0(react@19.1.0): + resolution: {integrity: sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==} + engines: {node: '>= 16.20.2'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.28.4 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 19.1.0 + refractor: 5.0.0 + dev: false + + /react-textarea-autosize@8.3.4(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.28.4 + react: 18.3.1 + use-composed-ref: 1.4.0(@types/react@18.3.27)(react@18.3.1) + use-latest: 1.3.0(@types/react@18.3.27)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react@16.12.0: + resolution: {integrity: sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + /read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /read-excel-file@6.0.1: + resolution: {integrity: sha512-rH6huBFxsjZsUARCYh55O08cn1gqZH8bnLf0kI6y5K7+9yqBVzy8veO4gPV4VGKv4M9rdcRtXTDGZZNwPi1gDA==} + dependencies: + '@xmldom/xmldom': 0.8.11 + fflate: 0.8.2 + unzipper: 0.12.3 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + 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 + + /readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + dependencies: + minimatch: 5.1.6 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + dev: false + + /recharts@3.6.0(@types/react@18.3.27)(react-dom@18.3.1)(react-is@19.2.3)(react@18.3.1)(redux@5.0.1): + resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0)(react@18.3.1) + clsx: 2.1.1 + decimal.js-light: 2.5.1 + es-toolkit: 1.43.0 + eventemitter3: 5.0.1 + immer: 10.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 19.2.3 + react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + reselect: 5.1.1 + tiny-invariant: 1.3.3 + use-sync-external-store: 1.6.0(react@18.3.1) + victory-vendor: 37.3.6 + transitivePeerDependencies: + - '@types/react' + - redux + dev: false + + /redux-thunk@3.1.0(redux@5.0.1): + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + dependencies: + redux: 5.0.1 + dev: false + + /redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + dev: false + + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + + /refractor@5.0.0: + resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==} + dependencies: + '@types/hast': 3.0.4 + '@types/prismjs': 1.26.5 + hastscript: 9.0.1 + parse-entities: 4.0.2 + dev: false + + /regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + dependencies: + regex-utilities: 2.3.0 + + /regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + /regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + dependencies: + regex-utilities: 2.3.0 + + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + + /regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + dev: false + + /regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + dev: false + + /regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + dependencies: + jsesc: 3.1.0 + dev: false + + /rehype-harden@1.1.7: + resolution: {integrity: sha512-j5DY0YSK2YavvNGV+qBHma15J9m0WZmRe8posT5AtKDS6TNWtMVTo6RiqF8SidfcASYz8f3k2J/1RWmq5zTXUw==} + dependencies: + unist-util-visit: 5.0.0 + dev: false + + /rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.27 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + dev: false + + /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 + + /rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + dev: false + + /remark-cjk-friendly-gfm-strikethrough@1.2.3(micromark@4.0.2)(unified@11.0.5): + resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + dependencies: + micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark@4.0.2) + unified: 11.0.5 + transitivePeerDependencies: + - micromark + - micromark-util-types + dev: false + + /remark-cjk-friendly@1.2.3(micromark@4.0.2)(unified@11.0.5): + resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + dependencies: + micromark-extension-cjk-friendly: 1.2.3(micromark@4.0.2) + unified: 11.0.5 + transitivePeerDependencies: + - micromark + - micromark-util-types + 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-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@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-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.1 + 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 + + /remend@1.0.1: + resolution: {integrity: sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /requireg@0.2.2: + resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} + engines: {node: '>= 4.0.0'} + dependencies: + nested-error-stacks: 2.0.1 + rc: 1.2.8 + resolve: 1.7.1 + dev: false + + /resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + pe-library: 0.4.1 + dev: true + + /reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: false + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve-workspace-root@2.0.0: + resolution: {integrity: sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==} + dev: false + + /resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + dev: false + + /resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@1.7.1: + resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} + dependencies: + path-parse: 1.0.7 + dev: false + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + dev: false + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rgbcolor@1.0.1: + resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} + engines: {node: '>= 0.8.15'} + requiresBuild: true + dev: false + optional: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + + /roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + requiresBuild: true + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + dev: true + optional: true + + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false + + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false + + /roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + dependencies: + truncate-utf8-bytes: 1.0.2 + dev: true + + /sass@1.97.1: + resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + dev: false + + /sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + + /scheduler@0.18.0: + resolution: {integrity: sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /scheduler@0.25.0-rc-603e6108-20241029: + resolution: {integrity: sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==} + dev: false + + /scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + /scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + dev: false + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + requiresBuild: true + dev: true + optional: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + /send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + /serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + type-fest: 0.13.1 + dev: true + optional: true + + /seroval-plugins@1.3.3(seroval@1.3.2): + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + dependencies: + seroval: 1.3.2 + dev: false + + /seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + dev: false + + /serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + /server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /sf-symbols-typescript@2.2.0: + resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} + engines: {node: '>=10'} + dev: false + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + + /sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-exec@1.0.2: + resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} + dev: false + + /shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + /shiki@3.20.0: + resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/engine-javascript': 3.20.0 + '@shikijs/engine-oniguruma': 3.20.0 + '@shikijs/langs': 3.20.0 + '@shikijs/themes': 3.20.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.0 + dev: false + + /simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + dependencies: + is-arrayish: 0.3.4 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.7.3 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + optional: true + + /slugify@1.6.6: + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} + dev: false + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + dev: true + + /socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + dev: true + + /solid-floating-ui@0.3.1(@floating-ui/dom@1.7.4)(solid-js@1.9.10): + resolution: {integrity: sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q==} + engines: {node: '>=10'} + peerDependencies: + '@floating-ui/dom': ^1.5 + solid-js: ^1.8 + dependencies: + '@floating-ui/dom': 1.7.4 + solid-js: 1.9.10 + dev: false + + /solid-js@1.9.10: + resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} + dependencies: + csstype: 3.2.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + dev: false + + /solid-motionone@1.0.4(solid-js@1.9.10): + resolution: {integrity: sha512-aqEjgecoO9raDFznu/dEci7ORSmA26Kjj9J4Cn1Gyr0GZuOVdvsNxdxClTL9J40Aq/uYFx4GLwC8n70fMLHiuA==} + peerDependencies: + solid-js: ^1.8.0 + dependencies: + '@motionone/dom': 10.18.0 + '@motionone/utils': 10.18.0 + '@solid-primitives/props': 3.2.2(solid-js@1.9.10) + '@solid-primitives/refs': 1.1.2(solid-js@1.9.10) + '@solid-primitives/transition-group': 1.1.2(solid-js@1.9.10) + csstype: 3.2.3 + solid-js: 1.9.10 + dev: false + + /solid-presence@0.1.8(solid-js@1.9.10): + resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==} + peerDependencies: + solid-js: ^1.8 + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /solid-prevent-scroll@0.1.10(solid-js@1.9.10): + resolution: {integrity: sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==} + peerDependencies: + solid-js: ^1.8 + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.10) + solid-js: 1.9.10 + dev: false + + /sonner@2.0.7(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + requiresBuild: true + dev: true + optional: true + + /ssf@0.11.2: + resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} + engines: {node: '>=0.8'} + dependencies: + frac: 1.1.2 + dev: false + + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: true + + /stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + + /stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + requiresBuild: true + dev: false + optional: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + /stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + + /stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + /stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + dev: true + + /stream-buffers@2.2.0: + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + dev: false + + /streamdown@1.6.10(micromark@4.0.2)(react@18.3.1): + resolution: {integrity: sha512-B4Y3Z/qiXl1Dc+LzAB5c52Cd1QGRiFjaDwP+ERoj1JtCykdRDM8X6HwQnn3YkpkSk0x3R7S/6LrGe1nQiElHQQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + dependencies: + clsx: 2.1.1 + hast: 1.0.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + katex: 0.16.27 + lucide-react: 0.542.0(react@18.3.1) + marked: 16.4.2 + mermaid: 11.12.2 + react: 18.3.1 + rehype-harden: 1.1.7 + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + remark-cjk-friendly: 1.2.3(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 1.2.3(micromark@4.0.2)(unified@11.0.5) + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remend: 1.0.1 + shiki: 3.20.0 + tailwind-merge: 3.4.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/mdast' + - micromark + - micromark-util-types + - supports-color + dev: false + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + /string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + dev: true + + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.1 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /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 + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.2.2 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /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 + + /structured-headers@0.4.1: + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + dev: false + + /style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + dev: false + + /style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + dependencies: + style-to-object: 1.0.14 + 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@6.1.19(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 + css-to-react-native: 3.2.0 + csstype: 3.1.3 + postcss: 8.4.49 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + dev: false + + /styled-jsx@5.1.6(react@18.3.1): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.3.1 + dev: false + + /styleq@0.1.3: + resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + dev: false + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + dev: false + + /stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + dev: false + + /sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + dev: false + + /sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-arc-to-cubic-bezier@3.2.0: + resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} + dev: false + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /svg-pathdata@6.0.3: + resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dev: false + optional: true + + /svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + dev: true + + /tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + dev: false + + /tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + dev: false + + /tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + dev: false + + /tailwind-scrollbar-hide@2.0.0(tailwindcss@4.1.18): + resolution: {integrity: sha512-lqiIutHliEiODwBRHy4G2+Tcayo2U7+3+4frBmoMETD72qtah+XhOk5XcPzC1nJvXhXUdfl2ajlMhUc2qC6CIg==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20' + dependencies: + tailwindcss: 4.1.18 + dev: false + + /tailwind-scrollbar@4.0.2(react@18.3.1)(tailwindcss@4.1.18): + resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==} + engines: {node: '>=12.13.0'} + peerDependencies: + tailwindcss: 4.x + dependencies: + prism-react-renderer: 2.4.1(react@18.3.1) + tailwindcss: 4.1.18 + transitivePeerDependencies: + - react + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.19): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.19 + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@4.1.18): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 4.1.18 + dev: false + + /tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + dev: false + + /tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + /tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + dev: true + + /tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + dev: false + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: false + + /temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: false + + /terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + /text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + dependencies: + utrie: 1.0.2 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /third-party-capital@1.0.20: + resolution: {integrity: sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==} + dev: false + + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + /throttle-debounce@2.3.0: + resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} + engines: {node: '>=8'} + dev: false + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + dev: false + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false + + /tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + dev: false + + /tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + /tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + dependencies: + tmp: 0.2.5 + dev: true + + /tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toidentifier@1.0.1: + 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 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + + /truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + dependencies: + utf8-byte-length: 1.0.5 + dev: true + + /ts-api-utils@2.4.0(typescript@5.9.3): + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.9.3 + dev: true + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /turndown-plugin-gfm@1.0.2: + resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} + dev: false + + /turndown@7.2.2: + resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + dependencies: + '@mixmark-io/domino': 2.2.0 + dev: false + + /tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + requiresBuild: true + dev: true + optional: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + dev: true + + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + /ua-parser-js@0.7.41: + resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} + hasBin: true + dev: false + + /ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + dev: false + + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: false + + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: false + + /ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + dev: false + + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + + /undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + /undici@6.22.0: + resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} + engines: {node: '>=18.17'} + dev: false + + /unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + dev: false + + /unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + dev: false + + /unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + dev: false + + /unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + dev: false + + /unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + dev: false + + /unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + dependencies: + '@types/unist': 3.0.3 + 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 + + /uniq@1.0.1: + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + dev: false + + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: true + + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: false + + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + dev: false + + /unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + dependencies: + '@types/unist': 3.0.3 + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + + /unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + requiresBuild: true + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + dev: true + + /unzipper@0.12.3: + resolution: {integrity: sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==} + dependencies: + bluebird: 3.7.2 + duplexer2: 0.1.4 + fs-extra: 11.3.3 + graceful-fs: 4.2.11 + node-int64: 0.4.0 + dev: false + + /update-browserslist-db@1.2.3(browserslist@4.28.1): + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /use-callback-ref@1.3.3(@types/react@18.3.27)(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.27 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /use-callback-ref@1.3.3(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + react: 19.1.0 + tslib: 2.8.1 + dev: false + + /use-composed-ref@1.4.0(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} + 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.27 + react: 18.3.1 + dev: false + + /use-intl@4.7.0(react@18.3.1): + resolution: {integrity: sha512-jyd8nSErVRRsSlUa+SDobKHo9IiWs5fjcPl9VBUnzUyEQpVM5mwJCgw8eUiylhvBpLQzUGox1KN0XlRivSID9A==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@schummar/icu-type-parser': 1.21.5 + intl-messageformat: 10.7.18 + react: 18.3.1 + dev: false + + /use-isomorphic-layout-effect@1.2.1(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + 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.27 + react: 18.3.1 + dev: false + + /use-latest-callback@0.2.6(react@19.1.0): + resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} + peerDependencies: + react: '>=16.8' + dependencies: + react: 19.1.0 + dev: false + + /use-latest@1.3.0(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} + 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.27 + react: 18.3.1 + use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.27)(react@18.3.1) + dev: false + + /use-sidecar@1.1.3(@types/react@18.3.27)(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.27 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + dev: false + + /use-sidecar@1.1.3(@types/react@19.1.17)(react@19.1.0): + 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': 19.1.17 + detect-node-es: 1.1.0 + react: 19.1.0 + 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-sync-external-store@1.6.0(react@19.1.0): + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 19.1.0 + dev: false + + /utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + dev: false + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + dev: false + + /uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vaul@1.1.2(@types/react-dom@18.3.7)(@types/react@18.3.27)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7)(@types/react@18.3.27)(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' + - '@types/react-dom' + dev: false + + /vaul@1.1.2(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react@19.1.17)(react-dom@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + dev: false + + /verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + requiresBuild: true + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + dev: true + optional: true + + /vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + dev: false + + /vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + /victory-vendor@37.3.6: + resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + + /vite-compatible-readable-stream@3.6.1: + resolution: {integrity: sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + + /vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + dev: false + + /vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + dev: false + + /vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + dev: false + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: false + + /vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.17.5 + dev: false + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: false + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + + /warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + dev: false + + /webfontloader@1.6.28: + resolution: {integrity: sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: false + + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + /whatwg-url-without-unicode@8.0.0-3: + resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==} + engines: {node: '>=10'} + dependencies: + buffer: 5.7.1 + punycode: 2.3.1 + webidl-conversions: 5.0.0 + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + dev: true + + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /wmf@1.0.2: + resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} + engines: {node: '>=0.8'} + dev: false + + /wonka@6.3.5: + resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /word@0.3.0: + resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} + engines: {node: '>=0.8'} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + /ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xcode@3.0.1: + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + dev: false + + /xlsx@0.18.5: + resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.4.3 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xmlbuilder@14.0.0: + resolution: {integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==} + engines: {node: '>=8.0'} + dev: false + + /xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /y-indexeddb@9.0.12(yjs@13.6.29): + resolution: {integrity: sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + dependencies: + lib0: 0.2.117 + yjs: 13.6.29 + dev: false + + /y-protocols@1.0.7(yjs@13.6.29): + resolution: {integrity: sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + dependencies: + lib0: 0.2.117 + yjs: 13.6.29 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: false + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yjs@13.6.29: + resolution: {integrity: sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + dependencies: + lib0: 0.2.117 + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + dev: false + + /zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + dev: true + + /zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + dev: false + + /zustand@5.0.9(@types/react@18.3.27)(react@18.3.1): + resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + dependencies: + '@types/react': 18.3.27 + react: 18.3.1 + dev: false + + /zustand@5.0.9(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + dependencies: + '@types/react': 19.1.17 + react: 19.1.0 + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + + github.com/Expensify/simply-deferred/77a08a95754660c7bd6e0b6979fdf84e8e831bf5: + resolution: {tarball: https://codeload.github.com/Expensify/simply-deferred/tar.gz/77a08a95754660c7bd6e0b6979fdf84e8e831bf5} + name: simply-deferred + version: 3.0.0 + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..f8f575a1d1 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - 'apps/*' + - 'packages/*' + diff --git a/setup.py b/setup.py index dd443090c3..9469e51a5c 100644 --- a/setup.py +++ b/setup.py @@ -678,7 +678,7 @@ def check_requirements(self): "git": "https://git-scm.com/downloads", "uv": "https://github.com/astral-sh/uv#installation", "node": "https://nodejs.org/en/download/", - "npm": "https://docs.npmjs.com/downloading-and-installing-node-js-and-npm", + "pnpm": "https://pnpm.io/installation", "docker": "https://docs.docker.com/get-docker/", # For Redis } @@ -1669,7 +1669,7 @@ def _apply_local_migrations(self): ) except (subprocess.SubprocessError, FileNotFoundError): print_error( - "Node.js/npm not found or Supabase CLI not available. Make sure Node.js is installed." + "Node.js/pnpm not found or Supabase CLI not available. Make sure Node.js and pnpm are installed." ) print_warning("Skipping migration application. Apply manually later.") return @@ -1726,7 +1726,7 @@ def _apply_cloud_migrations(self): ) except (subprocess.SubprocessError, FileNotFoundError): print_error( - "Node.js/npm not found or Supabase CLI not available. Make sure Node.js is installed." + "Node.js/pnpm not found or Supabase CLI not available. Make sure Node.js and pnpm are installed." ) print_warning("Skipping migration application. Apply manually later.") return @@ -1786,9 +1786,9 @@ def install_dependencies(self): return try: - print_info("Installing frontend dependencies with npm...") + print_info("Installing frontend dependencies with pnpm...") subprocess.run( - ["npm", "install"], cwd="frontend", check=True, shell=IS_WINDOWS + ["pnpm", "install"], cwd="frontend", check=True, shell=IS_WINDOWS ) print_success("Frontend dependencies installed.") @@ -1863,7 +1863,7 @@ def start_suna(self): "\nIf that doesn't work, you may need to:" ) print_info(f" 1. {Colors.CYAN}cd frontend{Colors.ENDC}") - print_info(f" 2. {Colors.CYAN}npm run build{Colors.ENDC}") + print_info(f" 2. {Colors.CYAN}pnpm run build{Colors.ENDC}") print_info(f" 3. {Colors.CYAN}cd .. && {compose_cmd_str} up -d{Colors.ENDC}") # Don't exit, let the final instructions show return @@ -1952,7 +1952,7 @@ def final_instructions(self): print( f"\n{Colors.BOLD}{step_num}. Start Frontend (in a new terminal):{Colors.ENDC}") - print(f"{Colors.CYAN} cd frontend && npm run dev{Colors.ENDC}") + print(f"{Colors.CYAN} cd frontend && pnpm run dev{Colors.ENDC}") step_num += 1 print( diff --git a/start.py b/start.py index 3d92bee791..aaa5f94c15 100644 --- a/start.py +++ b/start.py @@ -105,7 +105,7 @@ def print_manual_instructions(compose_cmd_str): step_num += 1 print(f"{Colors.BOLD}{step_num}. Start Frontend (in a new terminal):{Colors.ENDC}") - print(f"{Colors.CYAN} cd frontend && npm run dev{Colors.ENDC}\n") + print(f"{Colors.CYAN} cd frontend && pnpm run dev{Colors.ENDC}\n") step_num += 1 print(f"{Colors.BOLD}{step_num}. Start Backend (in a new terminal):{Colors.ENDC}") @@ -114,7 +114,7 @@ def print_manual_instructions(compose_cmd_str): print(f"{Colors.BOLD}{step_num}. Start Background Worker (in a new terminal):{Colors.ENDC}") print( - f"{Colors.CYAN} cd backend && uv run dramatiq run_agent_background{Colors.ENDC}\n" + f"{Colors.CYAN} cd backend && uv run python run_worker.py --concurrency 8{Colors.ENDC}\n" ) # Show stop commands for local Supabase From c32ecb0f69acc26d8728f525bac0ffd491953999 Mon Sep 17 00:00:00 2001 From: marko-kraemer Date: Sun, 4 Jan 2026 02:09:31 -0500 Subject: [PATCH 002/229] Revert thinking collapsible changes from 6d69a524 --- .../thread/content/ThinkingCollapsible.tsx | 161 ------- .../thread/content/ThreadContent.tsx | 424 +++++------------- .../utils/assistant-message-renderer.tsx | 78 +--- .../src/hooks/messages/utils/index.ts | 4 +- 4 files changed, 121 insertions(+), 546 deletions(-) delete mode 100644 apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx diff --git a/apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx b/apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx deleted file mode 100644 index 005e6138c5..0000000000 --- a/apps/frontend/src/components/thread/content/ThinkingCollapsible.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { ChevronRight } from 'lucide-react'; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; -import { cn } from '@/lib/utils'; - -// Circular progress bar that estimates completion -const CircularProgressBar: React.FC<{ - elapsedSeconds: number; - size?: number; - className?: string; -}> = ({ - elapsedSeconds, - size = 18, - className -}) => { - // Estimate progress using asymptotic curve - // Assumes most tasks complete within 30-60 seconds - // Progress approaches 95% asymptotically, leaving room for actual completion - const expectedDuration = 45; // seconds for "average" task - const progress = Math.min(0.95, 1 - Math.exp(-elapsedSeconds / expectedDuration)); - - const strokeWidth = 2.5; - const radius = (size - strokeWidth) / 2; - const circumference = 2 * Math.PI * radius; - const strokeDashoffset = circumference * (1 - progress); - - return ( - - {/* Background circle track */} - - {/* Progress arc that fills up */} - - - ); -}; - -interface ThinkingCollapsibleProps { - children?: React.ReactNode; - isThinking: boolean; - startTime?: number; - defaultOpen?: boolean; -} - -export const ThinkingCollapsible: React.FC = ({ - children, - isThinking, - startTime, - defaultOpen = false, -}) => { - const [isOpen, setIsOpen] = useState(defaultOpen); - const [elapsedSeconds, setElapsedSeconds] = useState(0); - const stableStartTimeRef = useRef(null); - - // Initialize stable start time - useEffect(() => { - if (isThinking && !stableStartTimeRef.current) { - stableStartTimeRef.current = startTime || Date.now(); - } - if (!isThinking) { - stableStartTimeRef.current = null; - } - }, [isThinking, startTime]); - - // Update elapsed time every second while thinking - useEffect(() => { - if (!isThinking) { - return; - } - - const updateElapsed = () => { - if (stableStartTimeRef.current) { - const elapsed = Math.floor((Date.now() - stableStartTimeRef.current) / 1000); - setElapsedSeconds(elapsed); - } - }; - - updateElapsed(); - const interval = setInterval(updateElapsed, 1000); - - return () => clearInterval(interval); - }, [isThinking]); - - // Format time display - const formatTime = (seconds: number): string => { - if (seconds < 60) { - return `${seconds}s`; - } - const mins = Math.floor(seconds / 60); - const secs = seconds % 60; - return `${mins}m ${secs}s`; - }; - - const hasChildren = React.Children.count(children) > 0; - - if (!isThinking && !hasChildren) { - return null; - } - - return ( - - - - - - -
- {children} -
-
-
- ); -}; - -export default ThinkingCollapsible; - diff --git a/apps/frontend/src/components/thread/content/ThreadContent.tsx b/apps/frontend/src/components/thread/content/ThreadContent.tsx index 8e6c3b2672..a3dfd29d0c 100644 --- a/apps/frontend/src/components/thread/content/ThreadContent.tsx +++ b/apps/frontend/src/components/thread/content/ThreadContent.tsx @@ -1,5 +1,8 @@ import React, { useRef, useState, useEffect, memo, useMemo } from "react"; -import { CircleDashed } from "lucide-react"; +import { CircleDashed as CircleDashedIcon } from "lucide-react"; + +// Cast to fix React types version conflict in monorepo +const CircleDashed = CircleDashedIcon as React.FC>; import { useTranslations } from "next-intl"; import { UnifiedMessage, @@ -17,15 +20,12 @@ import { import { KortixLogo } from "@/components/sidebar/kortix-logo"; import { AgentLoader } from "./loader"; import { ShowToolStream } from "./ShowToolStream"; -import { ThinkingCollapsible } from "./ThinkingCollapsible"; import { ComposioUrlDetector } from "./composio-url-detector"; import { - renderAssistantTextContent, - renderAssistantToolCalls, + renderAssistantMessage, extractTextFromPartialJson, extractTextFromStreamingAskComplete, } from "@/hooks/messages/utils"; -import { useSmoothText } from "@/hooks/messages/useSmoothText"; import { AppIcon } from "../tool-views/shared/AppIcon"; export function renderAttachments( @@ -59,7 +59,6 @@ type MessageGroup = { interface AgentInfo { name: string; avatar: React.ReactNode; - useLogomark?: boolean; } const UserMessageRow = memo(function UserMessageRow({ @@ -167,14 +166,6 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ threadId?: string; onPromptFill?: (message: string) => void; }) { - // Apply smooth typewriter effect to streaming text (120 chars/sec for snappy feel) - // Returns { text, isAnimating } - we continue rendering while animation is in progress - const { text: smoothStreamingText, isAnimating: isSmoothAnimating } = useSmoothText( - streamingTextContent || "", - 120, - true - ); - const toolResultsMap = useMemo(() => { const map = new Map(); group.messages.forEach((msg) => { @@ -200,10 +191,8 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ? assistantMessages[assistantMessages.length - 1].message_id : null; - // Render text content (visible) and tool calls (collapsible) separately - const { renderedTextContent, renderedToolCalls } = useMemo(() => { - const textElements: React.ReactNode[] = []; - const toolElements: React.ReactNode[] = []; + const renderedMessages = useMemo(() => { + const elements: React.ReactNode[] = []; let assistantMessageCount = 0; group.messages.forEach((message, msgIndex) => { @@ -213,7 +202,7 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ isLastGroup && message.message_id === lastAssistantMessageId; const toolResults = toolResultsMap.get(message.message_id) || []; - const renderProps = { + const renderedContent = renderAssistantMessage({ message, toolResults, onToolClick: handleToolClick, @@ -224,35 +213,20 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ t, threadId, onPromptFill, - }; - - // Text content (visible to user) - const textContent = renderAssistantTextContent(renderProps); - if (textContent) { - textElements.push( -
0 ? "mt-3" : ""}> -
{textContent}
-
, - ); - } + }); - // Tool calls (go in collapsible) - const toolCallContent = renderAssistantToolCalls(renderProps); - if (toolCallContent) { - toolElements.push( -
- {toolCallContent} -
, - ); - } + if (!renderedContent) return; - if (textContent || toolCallContent) { - assistantMessageCount++; - } + elements.push( +
0 ? "mt-3" : ""}> +
{renderedContent}
+
, + ); + assistantMessageCount++; } }); - return { renderedTextContent: textElements, renderedToolCalls: toolElements }; + return elements; }, [ group.messages, isLastGroup, @@ -268,21 +242,20 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ]); const streamingContent = useMemo(() => { - // Continue rendering if: - // 1. Currently streaming, OR - // 2. Animation is still in progress (let it finish even after stream ends) - const isStreaming = streamHookStatus === "streaming" || streamHookStatus === "connecting"; - const shouldRender = isLastGroup && !readOnly && smoothStreamingText && (isStreaming || isSmoothAnimating); - - if (!shouldRender) { + if ( + !isLastGroup || + readOnly || + !streamingTextContent || + (streamHookStatus !== "streaming" && streamHookStatus !== "connecting") + ) { return null; } let detectedTag: string | null = null; let tagStartIndex = -1; - const askIndex = smoothStreamingText.indexOf(""); + streamingTextContent.indexOf(""); if (functionCallsIndex !== -1) { const functionCallsContent = - smoothStreamingText.substring(functionCallsIndex); + streamingTextContent.substring(functionCallsIndex); if ( functionCallsContent.includes(' @@ -374,8 +346,7 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ }, [ isLastGroup, readOnly, - smoothStreamingText, - isSmoothAnimating, + streamingTextContent, streamHookStatus, visibleMessages, handleToolClick, @@ -466,11 +437,8 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ); }, [readOnly, isLastGroup, isStreamingText, streamingText, handleToolClick]); - // Split streaming tool calls into: previous (collapsible), current (visible), and ask/complete (visible as text) - const { previousToolCallsContent, currentToolCallContent, askCompleteContent } = useMemo(() => { - if (!isLastGroup || readOnly || !streamingToolCall) { - return { previousToolCallsContent: null, currentToolCallContent: null, askCompleteContent: null }; - } + const streamingToolCallContent = useMemo(() => { + if (!isLastGroup || readOnly || !streamingToolCall) return null; const parsedMetadata = safeJsonParse( streamingToolCall.metadata, @@ -478,7 +446,6 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ); const toolCalls = parsedMetadata.tool_calls || []; - // Check for ask/complete tool const askOrCompleteTool = toolCalls.find((tc: any) => { const toolName = tc.function_name?.replace(/_/g, "-").toLowerCase() || ""; return toolName === "ask" || toolName === "complete"; @@ -508,7 +475,7 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ hasAskOrCompleteInLastMsg && lastMsgMetadata.stream_status === "complete" ) { - return { previousToolCallsContent: null, currentToolCallContent: null, askCompleteContent: null }; + return null; } } @@ -534,55 +501,47 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ const isCurrentlyStreaming = streamHookStatus === "streaming" || streamHookStatus === "connecting"; - // Filter out ask/complete from regular tools for previous calls - const regularTools = toolCalls.filter((tc: any) => { - const tn = tc.function_name?.replace(/_/g, "-").toLowerCase() || ""; - return tn !== "ask" && tn !== "complete"; - }); - - const previousContent = regularTools.length > 0 ? ( -
- {regularTools.map((tc: any, tcIndex: number) => { - const tn = tc.function_name?.replace(/_/g, "-") || ""; - const toolCallContent = JSON.stringify({ - function: { name: tn }, - tool_name: tn, - arguments: tc.arguments || {}, - }); - return ( - - ); - })} + return ( +
+
- ) : null; - - return { - previousToolCallsContent: previousContent, - currentToolCallContent: null, - askCompleteContent: ( -
- -
- ), - }; + ); } - // No ask/complete tool - split regular tools into previous and current - if (toolCalls.length === 0) { - return { - previousToolCallsContent: null, - currentToolCallContent: ( -
+ const isAskOrComplete = toolCalls.some((tc: any) => { + const toolName = tc.function_name?.replace(/_/g, "-").toLowerCase() || ""; + return toolName === "ask" || toolName === "complete"; + }); + + if (isAskOrComplete) return null; + + return ( +
+
+ {toolCalls.length > 0 ? ( + toolCalls.map((tc: any, tcIndex: number) => { + const toolName = tc.function_name?.replace(/_/g, "-") || ""; + const toolCallContent = JSON.stringify({ + function: { name: toolName }, + tool_name: toolName, + arguments: tc.arguments || {}, + }); + + return ( + + ); + }) + ) : ( -
- ), - askCompleteContent: null, - }; - } - - // Split: all except last go to previous, last one stays visible - const previousTools = toolCalls.slice(0, -1); - const lastTool = toolCalls[toolCalls.length - 1]; - - const previousContent = previousTools.length > 0 ? ( -
- {previousTools.map((tc: any, tcIndex: number) => { - const toolName = tc.function_name?.replace(/_/g, "-") || ""; - const toolCallContent = JSON.stringify({ - function: { name: toolName }, - tool_name: toolName, - arguments: tc.arguments || {}, - }); - return ( - - ); - })} -
- ) : null; - - const lastToolName = lastTool.function_name?.replace(/_/g, "-") || ""; - const lastToolContent = JSON.stringify({ - function: { name: lastToolName }, - tool_name: lastToolName, - arguments: lastTool.arguments || {}, - }); - - const currentContent = ( -
- + )} +
); - - return { - previousToolCallsContent: previousContent, - currentToolCallContent: currentContent, - askCompleteContent: null, - }; }, [ isLastGroup, readOnly, @@ -661,15 +566,6 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ handleToolClick, ]); - // Legacy: keep for backward compatibility in non-collapsible paths - const streamingToolCallContent = previousToolCallsContent || currentToolCallContent || askCompleteContent ? ( - <> - {previousToolCallsContent} - {currentToolCallContent} - {askCompleteContent} - - ) : null; - const showLoader = useMemo(() => { if (!isLastGroup || readOnly) return false; if (agentStatus !== "running" && agentStatus !== "connecting") return false; @@ -701,81 +597,25 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ group.messages, ]); - // Track thinking start time - const thinkingStartTimeRef = useRef(null); - - // Determine if we're in a "thinking" state (streaming tools or waiting) - const isThinking = useMemo(() => { - if (!isLastGroup || readOnly) return false; - const isActiveAgent = agentStatus === "running" || agentStatus === "connecting"; - const isActiveStream = streamHookStatus === "streaming" || streamHookStatus === "connecting"; - return isActiveAgent && isActiveStream; - }, [isLastGroup, readOnly, agentStatus, streamHookStatus]); - - // Check if we have any tool content to show in collapsible (streaming + completed) - const hasToolsToCollapse = useMemo(() => { - return !!(streamingContent || previousToolCallsContent || currentToolCallContent || showLoader || renderedToolCalls.length > 0); - }, [streamingContent, previousToolCallsContent, currentToolCallContent, showLoader, renderedToolCalls]); - - // Initialize/reset thinking start time - useEffect(() => { - if (isThinking && hasToolsToCollapse && !thinkingStartTimeRef.current) { - thinkingStartTimeRef.current = Date.now(); - } - if (!isThinking) { - thinkingStartTimeRef.current = null; - } - }, [isThinking, hasToolsToCollapse]); - - // Show the thinking collapsible when: 1) thinking + tools, OR 2) we have completed tool calls - const showThinkingCollapsible = (isThinking && hasToolsToCollapse) || renderedToolCalls.length > 0; - return (
- {agentInfo.useLogomark ? ( - - ) : ( - <> -
- {agentInfo.avatar} -
-

{agentInfo.name}

- - )} +
+ {agentInfo.avatar} +
+

{agentInfo.name}

- {/* Text content is always visible (ask/complete responses, text_content) */} - {renderedTextContent} + {renderedMessages} + {streamingContent} {playbackStreamingContent} - - {/* All tool calls go inside collapsible (collapsed by default like ChatGPT) */} - {showThinkingCollapsible && ( - - {/* Completed tool calls from previous messages */} - {renderedToolCalls} - {/* Streaming content */} - {streamingContent} - {previousToolCallsContent} - {currentToolCallContent} - - )} - - {/* Only ask/complete final response text stays visible */} - {askCompleteContent} - - {/* Show basic loader when waiting and no tools yet */} - {!showThinkingCollapsible && !askCompleteContent && isThinking && showLoader && ( - + {streamingToolCallContent} + {showLoader && ( +
+ +
)}
@@ -881,7 +721,6 @@ export const ThreadContent: React.FC = memo( const rawName = recentAssistantWithAgent.agents.name; const name = typeof rawName === "string" ? rawName : String(rawName || "Kortix"); - const isKortix = name === "Kortix"; return { name, avatar: ( @@ -889,15 +728,12 @@ export const ThreadContent: React.FC = memo(
), - useLogomark: isKortix, }; } const fallbackName = typeof agentName === "string" ? agentName : "Kortix"; - const isKortix = fallbackName === "Kortix" || !fallbackName; return { name: fallbackName || "Kortix", avatar: agentAvatar, - useLogomark: isKortix, }; }, [threadMetadata, displayMessages, agentName, agentAvatar]); @@ -1219,27 +1055,18 @@ export const ThreadContent: React.FC = memo(
{showNewGroupLoader && ( -
+
- {agentInfo.useLogomark ? ( - - ) : ( - <> -
- {agentInfo.avatar} -
-

- {agentInfo.name} -

- - )} +
+ {agentInfo.avatar} +
+

+ {agentInfo.name} +

-
- +
+
@@ -1249,36 +1076,25 @@ export const ThreadContent: React.FC = memo(
- {agentInfo.useLogomark ? ( - - ) : ( - <> -
- {agentInfo.avatar} -
-

- {agentInfo.name} -

- - )} +
+ {agentInfo.avatar} +
+

+ {agentInfo.name} +

- -
- - - {currentToolCall.name || "Using Tool"} - - -
-
+
+ + + {currentToolCall.name || "Using Tool"} + + +
@@ -1291,18 +1107,12 @@ export const ThreadContent: React.FC = memo(
- {agentInfo.useLogomark ? ( - - ) : ( - <> -
- {agentInfo.avatar} -
-

- {agentInfo.name} -

- - )} +
+ {agentInfo.avatar} +
+

+ {agentInfo.name} +

diff --git a/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx b/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx index b9a8186c97..df81546a0c 100644 --- a/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx +++ b/apps/frontend/src/hooks/messages/utils/assistant-message-renderer.tsx @@ -185,10 +185,7 @@ function renderRegularToolCall( ); } -/** - * Renders ONLY text content, ask, and complete tool calls (visible to user) - */ -export function renderAssistantTextContent(props: AssistantMessageRendererProps): React.ReactNode { +export function renderAssistantMessage(props: AssistantMessageRendererProps): React.ReactNode { const { message, threadId, toolResults = [] } = props; const metadata = safeJsonParse(message.metadata, {}); @@ -238,7 +235,7 @@ export function renderAssistantTextContent(props: AssistantMessageRendererProps) } }); - // Render ONLY ask/complete tool calls (user-visible content) + // Render tool calls toolCalls.forEach((toolCall, index) => { const toolName = toolCall.function_name.replace(/_/g, '-'); @@ -265,57 +262,7 @@ export function renderAssistantTextContent(props: AssistantMessageRendererProps) contentParts.push(renderAskToolCall(normalizedToolCall, index, props)); } else if (toolName === 'complete') { contentParts.push(renderCompleteToolCall(normalizedToolCall, index, props)); - } - // Skip all other tool calls - they go in the collapsible - }); - - return contentParts.length > 0 ? contentParts : null; -} - -/** - * Renders ONLY regular tool calls (hidden in collapsible) - */ -export function renderAssistantToolCalls(props: AssistantMessageRendererProps): React.ReactNode { - const { message, toolResults = [] } = props; - const metadata = safeJsonParse(message.metadata, {}); - - const toolCalls = metadata.tool_calls || []; - const contentParts: React.ReactNode[] = []; - - // Render ONLY regular tool calls (not ask/complete) - toolCalls.forEach((toolCall, index) => { - const toolName = toolCall.function_name.replace(/_/g, '-'); - - // Skip ask/complete - they are rendered in text content - if (toolName === 'ask' || toolName === 'complete') { - return; - } - - // Skip approval requests - they are rendered inline with text - if (toolName === 'request-apify-approval' || toolName === 'request_apify_approval') { - return; - } - - // Normalize arguments - handle both string and object types - let normalizedArguments: Record = {}; - if (toolCall.arguments) { - if (typeof toolCall.arguments === 'object' && toolCall.arguments !== null) { - normalizedArguments = toolCall.arguments; - } else if (typeof toolCall.arguments === 'string') { - try { - normalizedArguments = JSON.parse(toolCall.arguments); - } catch { - normalizedArguments = {}; - } - } - } - - const normalizedToolCall = { - ...toolCall, - arguments: normalizedArguments - }; - - if (toolName === 'image-edit-or-generate') { + } else if (toolName === 'image-edit-or-generate') { // Find matching tool result for this call const toolResult = toolResults.find(tr => { const trMeta = safeJsonParse(tr.metadata, {}); @@ -343,22 +290,3 @@ export function renderAssistantToolCalls(props: AssistantMessageRendererProps): return contentParts.length > 0 ? contentParts : null; } - -/** - * Legacy function - renders all content (text + tool calls together) - * @deprecated Use renderAssistantTextContent and renderAssistantToolCalls instead - */ -export function renderAssistantMessage(props: AssistantMessageRendererProps): React.ReactNode { - const textContent = renderAssistantTextContent(props); - const toolCalls = renderAssistantToolCalls(props); - - if (!textContent && !toolCalls) return null; - - return ( - <> - {textContent} - {toolCalls} - - ); -} - diff --git a/apps/frontend/src/hooks/messages/utils/index.ts b/apps/frontend/src/hooks/messages/utils/index.ts index fab653c3de..7688d9aae7 100644 --- a/apps/frontend/src/hooks/messages/utils/index.ts +++ b/apps/frontend/src/hooks/messages/utils/index.ts @@ -52,8 +52,6 @@ export { // Assistant message renderer (web-specific due to React components) export { - renderAssistantMessage, - renderAssistantTextContent, - renderAssistantToolCalls, + renderAssistantMessage, type AssistantMessageRendererProps } from './assistant-message-renderer'; From 58199a62293e15968c558f933ae4dcfe10c7bf66 Mon Sep 17 00:00:00 2001 From: marko-kraemer Date: Sun, 4 Jan 2026 02:33:00 -0500 Subject: [PATCH 003/229] smooth text --- .../plans/shared_package_refactoring.plan.md | 435 ------------------ .../thread/content/ThreadContent.tsx | 45 +- .../thread/file-attachment/index.tsx | 7 +- 3 files changed, 35 insertions(+), 452 deletions(-) delete mode 100644 .cursor/plans/shared_package_refactoring.plan.md diff --git a/.cursor/plans/shared_package_refactoring.plan.md b/.cursor/plans/shared_package_refactoring.plan.md deleted file mode 100644 index 857289efb9..0000000000 --- a/.cursor/plans/shared_package_refactoring.plan.md +++ /dev/null @@ -1,435 +0,0 @@ -# Shared Package Refactoring Plan - -## Overview - -Create a shared TypeScript package at `packages/shared` that contains all platform-agnostic code used by both frontend (Next.js) and mobile (React Native). This eliminates ~40% of duplicated code. - -## Current Duplication Analysis - -| Code | Frontend Location | Mobile Location | Status | - -|------|------------------|-----------------|--------| - -| `streaming-utils.ts` | `frontend/src/hooks/messages/utils/` | `apps/mobile/lib/utils/` | 100% identical | - -| `safeJsonParse` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/message-grouping.ts` | 95% identical | - -| `TOOL_DISPLAY_NAMES` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 95% identical | - -| `getUserFriendlyToolName` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 95% identical | - -| `formatMCPToolName` | `frontend/src/components/thread/utils.ts` | `apps/mobile/lib/utils/tool-display.ts` | 100% identical | - -| `groupMessages` | inline in ThreadContent | `apps/mobile/lib/utils/message-grouping.ts` | 90% identical | - -| Types (`UnifiedMessage`, etc.) | `frontend/src/components/thread/types.ts` | `apps/mobile/api/types.ts` | 95% identical |--- - -## Phase 1: Create Shared Package Structure - -### 1.1 Create Package Directory - -```javascript -packages/ -└── shared/ - ├── package.json - ├── tsconfig.json - ├── src/ - │ ├── index.ts - │ ├── types/ - │ │ ├── index.ts - │ │ ├── messages.ts # UnifiedMessage, ParsedContent, ParsedMetadata - │ │ ├── streaming.ts # StreamingToolCall, StreamingMetadata - │ │ └── agents.ts # Agent, Project, Thread (shared subset) - │ ├── streaming/ - │ │ ├── index.ts - │ │ └── utils.ts # All streaming utility functions - │ ├── tools/ - │ │ ├── index.ts - │ │ ├── display-names.ts # TOOL_DISPLAY_NAMES map - │ │ ├── icon-keys.ts # Tool -> icon name mapping (strings, not components) - │ │ └── formatter.ts # getUserFriendlyToolName, formatMCPToolName - │ └── utils/ - │ ├── index.ts - │ ├── json.ts # safeJsonParse - │ └── grouping.ts # groupMessages - └── README.md -``` - - - -### 1.2 Package Configuration - -**`packages/shared/package.json`**: - -```json -{ - "name": "@agentpress/shared", - "version": "1.0.0", - "private": true, - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - }, - "./types": { - "import": "./dist/types/index.mjs", - "require": "./dist/types/index.js", - "types": "./dist/types/index.d.ts" - }, - "./streaming": { - "import": "./dist/streaming/index.mjs", - "require": "./dist/streaming/index.js", - "types": "./dist/streaming/index.d.ts" - }, - "./tools": { - "import": "./dist/tools/index.mjs", - "require": "./dist/tools/index.js", - "types": "./dist/tools/index.d.ts" - }, - "./utils": { - "import": "./dist/utils/index.mjs", - "require": "./dist/utils/index.js", - "types": "./dist/utils/index.d.ts" - } - }, - "scripts": { - "build": "tsup src/index.ts --format cjs,esm --dts", - "dev": "tsup src/index.ts --format cjs,esm --dts --watch" - }, - "devDependencies": { - "tsup": "^8.0.0", - "typescript": "^5.0.0" - } -} -``` - ---- - -## Phase 2: Migrate Shared Code - -### 2.1 Types (`packages/shared/src/types/messages.ts`) - -Single source of truth for message types: - -```typescript -// Core message type matching backend schema -export interface UnifiedMessage { - message_id: string | null; - thread_id: string; - type: 'user' | 'assistant' | 'tool' | 'system' | 'status' | 'browser_state' | 'image_context' | 'llm_response_end' | 'llm_response_start'; - is_llm_message: boolean; - content: string; - metadata: string; - created_at: string; - updated_at: string; - agent_id?: string; - sequence?: number; - sandbox_id?: string; - agents?: { name: string }; -} - -export interface ParsedContent { - role?: 'user' | 'assistant' | 'tool' | 'system'; - content?: any; - tool_calls?: any[]; - tool_call_id?: string; - name?: string; - status_type?: string; - [key: string]: any; -} - -export interface ParsedMetadata { - stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; - thread_run_id?: string; - tool_calls?: Array<{ - tool_call_id: string; - function_name: string; - arguments: Record | string; - source: 'native' | 'xml'; - }>; - text_content?: string; - function_name?: string; - result?: { success: boolean; output: any; error?: string | null }; - return_format?: 'native' | 'xml'; - tool_call_id?: string; - assistant_message_id?: string; - [key: string]: any; -} -``` - - - -### 2.2 Streaming Utils (`packages/shared/src/streaming/utils.ts`) - -Move the entire `streaming-utils.ts` file (identical in both codebases): - -- `extractTextFromPartialJson` -- `extractTextFromStreamingAskComplete` -- `isAskOrCompleteTool` -- `getAskCompleteToolType` -- `extractTextFromArguments` -- `findAskOrCompleteTool` -- `extractStreamingAskCompleteContent` -- `shouldSkipStreamingRender` - -### 2.3 Tool Metadata (`packages/shared/src/tools/`) - -**`display-names.ts`** - Merge both TOOL_DISPLAY_NAMES maps: - -```typescript -export const TOOL_DISPLAY_NAMES: Map = new Map([ - // ... combined list -]); -``` - -**`icon-keys.ts`** - Platform-agnostic icon mapping (strings, not components): - -```typescript -export type ToolIconKey = - | 'globe' | 'file-edit' | 'file-search' | 'file-plus' - | 'file-text' | 'file-x' | 'terminal' | 'search' - | 'table' | 'code' | 'phone' | 'presentation' | 'wrench'; - -export function getToolIconKey(toolName: string): ToolIconKey { - switch (toolName?.toLowerCase()) { - case 'browser-navigate-to': - case 'web-search': - return 'globe'; - case 'create-file': - case 'edit-file': - return 'file-edit'; - // ... rest of mappings - default: - return 'wrench'; - } -} -``` - -**`formatter.ts`** - Tool name formatting: - -```typescript -export function getUserFriendlyToolName(toolName: string): string { ... } -export function formatMCPToolName(serverName: string, toolName: string): string { ... } -``` - - - -### 2.4 Utils (`packages/shared/src/utils/`) - -**`json.ts`**: - -```typescript -export function safeJsonParse( - jsonString: string | Record | undefined | null, - defaultValue: T -): T { ... } -``` - -**`grouping.ts`**: - -```typescript -export interface MessageGroup { - type: 'user' | 'assistant_group'; - messages: UnifiedMessage[]; - key: string; -} - -export function groupMessages(messages: UnifiedMessage[]): MessageGroup[] { ... } -``` - ---- - -## Phase 3: Update Consumers - -### 3.1 Frontend Updates - -**`frontend/package.json`** - Add workspace dependency: - -```json -{ - "dependencies": { - "@agentpress/shared": "workspace:*" - } -} -``` - -**Update imports** throughout frontend: - -```typescript -// Before -import { safeJsonParse, HIDE_STREAMING_XML_TAGS } from '@/components/thread/utils'; -import { extractTextFromPartialJson } from '@/hooks/messages/utils/streaming-utils'; - -// After -import { safeJsonParse } from '@agentpress/shared/utils'; -import { extractTextFromPartialJson } from '@agentpress/shared/streaming'; -import type { UnifiedMessage, ParsedMetadata } from '@agentpress/shared/types'; -``` - -**Keep platform-specific code**: - -- `getToolIcon` function (uses `lucide-react` components) -- `useSmoothText` hook (uses `requestAnimationFrame`) -- All React components - -### 3.2 Mobile Updates - -**`apps/mobile/package.json`** - Add workspace dependency: - -```json -{ - "dependencies": { - "@agentpress/shared": "workspace:*" - } -} -``` - -**Update imports** throughout mobile: - -```typescript -// Before -import { safeJsonParse } from '@/lib/utils/message-grouping'; -import { extractTextFromPartialJson } from '@/lib/utils/streaming-utils'; - -// After -import { safeJsonParse } from '@agentpress/shared/utils'; -import { extractTextFromPartialJson } from '@agentpress/shared/streaming'; -import type { UnifiedMessage, ParsedMetadata } from '@agentpress/shared/types'; -``` - -**Keep platform-specific code**: - -- `getToolIcon` function (uses `lucide-react-native` components) -- React Native components - ---- - -## Phase 4: Icon Mapping Strategy - -Since icons are platform-specific, use a mapping pattern:**Shared package** (`packages/shared/src/tools/icon-keys.ts`): - -```typescript -export const TOOL_ICON_KEYS = { - 'browser-navigate-to': 'globe', - 'web-search': 'globe', - 'create-file': 'file-edit', - // ... -} as const; - -export type ToolIconKey = typeof TOOL_ICON_KEYS[keyof typeof TOOL_ICON_KEYS]; -export function getToolIconKey(toolName: string): ToolIconKey; -``` - -**Frontend** (`frontend/src/components/thread/icon-resolver.ts`): - -```typescript -import { getToolIconKey, type ToolIconKey } from '@agentpress/shared/tools'; -import { Globe, FileEdit, Terminal, ... } from 'lucide-react'; - -const ICON_MAP: Record = { - 'globe': Globe, - 'file-edit': FileEdit, - 'terminal': Terminal, - // ... -}; - -export function getToolIcon(toolName: string): React.ElementType { - const key = getToolIconKey(toolName); - return ICON_MAP[key] ?? Wrench; -} -``` - -**Mobile** (`apps/mobile/lib/utils/icon-resolver.ts`): - -```typescript -import { getToolIconKey, type ToolIconKey } from '@agentpress/shared/tools'; -import { Globe, FileEdit, Terminal, ... } from 'lucide-react-native'; - -const ICON_MAP: Record = { - 'globe': Globe, - 'file-edit': FileEdit, - 'terminal': Terminal, - // ... -}; - -export function getToolIcon(toolName: string): LucideIcon { - const key = getToolIconKey(toolName); - return ICON_MAP[key] ?? Wrench; -} -``` - ---- - -## Phase 5: Workspace Configuration - -### 5.1 Root `package.json` - -```json -{ - "private": true, - "workspaces": [ - "frontend", - "apps/*", - "packages/*" - ] -} -``` - - - -### 5.2 TypeScript Configuration - -Each consumer needs to reference the shared package in their `tsconfig.json`:**Frontend** (`frontend/tsconfig.json`): - -```json -{ - "compilerOptions": { - "paths": { - "@agentpress/shared/*": ["../packages/shared/src/*"] - } - }, - "references": [ - { "path": "../packages/shared" } - ] -} -``` - ---- - -## Implementation Order - -1. **Week 1**: Create shared package structure with types and utils -2. **Week 2**: Migrate streaming-utils and tool metadata -3. **Week 3**: Update frontend to use shared package -4. **Week 4**: Update mobile to use shared package -5. **Week 5**: Delete duplicated files, cleanup - ---- - -## Files to Delete After Migration - -### Frontend - -- `frontend/src/hooks/messages/utils/streaming-utils.ts` (moved to shared) -- Parts of `frontend/src/components/thread/utils.ts` (keep icon component mapping) -- Parts of `frontend/src/components/thread/types.ts` (keep React-specific extensions) - -### Mobile - -- `apps/mobile/lib/utils/streaming-utils.ts` (moved to shared) -- `apps/mobile/lib/utils/message-grouping.ts` (moved to shared) -- Parts of `apps/mobile/lib/utils/tool-display.ts` (keep icon component mapping) -- Parts of `apps/mobile/api/types.ts` (keep API-specific extensions) - ---- - -## Benefits - -1. **Single source of truth** - Types and logic defined once -2. **Automatic sync** - Changes propagate to both platforms -3. **Reduced maintenance** - Fix bugs once, applied everywhere -4. **Better testing** - Test shared logic in isolation \ No newline at end of file diff --git a/apps/frontend/src/components/thread/content/ThreadContent.tsx b/apps/frontend/src/components/thread/content/ThreadContent.tsx index a3dfd29d0c..4dd844d426 100644 --- a/apps/frontend/src/components/thread/content/ThreadContent.tsx +++ b/apps/frontend/src/components/thread/content/ThreadContent.tsx @@ -27,6 +27,7 @@ import { extractTextFromStreamingAskComplete, } from "@/hooks/messages/utils"; import { AppIcon } from "../tool-views/shared/AppIcon"; +import { useSmoothText } from "@/hooks/messages/useSmoothText"; export function renderAttachments( attachments: string[], @@ -166,6 +167,19 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ threadId?: string; onPromptFill?: (message: string) => void; }) { + // Apply smooth typewriter effect to streaming text (120 chars/sec for snappy feel) + // Returns { text, isAnimating } - we continue rendering while animation is in progress + const { text: smoothStreamingText, isAnimating: isSmoothAnimating } = useSmoothText( + streamingTextContent || "", + 120, + true + ); + + // Debug logging for smooth text effect + if (streamingTextContent && isLastGroup) { + console.log('[SmoothText] Raw length:', streamingTextContent.length, '| Displayed:', smoothStreamingText.length, '| Animating:', isSmoothAnimating); + } + const toolResultsMap = useMemo(() => { const map = new Map(); group.messages.forEach((msg) => { @@ -242,20 +256,21 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ ]); const streamingContent = useMemo(() => { - if ( - !isLastGroup || - readOnly || - !streamingTextContent || - (streamHookStatus !== "streaming" && streamHookStatus !== "connecting") - ) { + // Continue rendering if: + // 1. Currently streaming, OR + // 2. Animation is still in progress (let it finish even after stream ends) + const isStreaming = streamHookStatus === "streaming" || streamHookStatus === "connecting"; + const shouldRender = isLastGroup && !readOnly && smoothStreamingText && (isStreaming || isSmoothAnimating); + + if (!shouldRender) { return null; } let detectedTag: string | null = null; let tagStartIndex = -1; - const askIndex = streamingTextContent.indexOf(""); + smoothStreamingText.indexOf(""); if (functionCallsIndex !== -1) { const functionCallsContent = - streamingTextContent.substring(functionCallsIndex); + smoothStreamingText.substring(functionCallsIndex); if ( functionCallsContent.includes(' @@ -346,7 +362,8 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ }, [ isLastGroup, readOnly, - streamingTextContent, + smoothStreamingText, + isSmoothAnimating, streamHookStatus, visibleMessages, handleToolClick, diff --git a/apps/frontend/src/components/thread/file-attachment/index.tsx b/apps/frontend/src/components/thread/file-attachment/index.tsx index eef0cc59e9..cf7488ec38 100644 --- a/apps/frontend/src/components/thread/file-attachment/index.tsx +++ b/apps/frontend/src/components/thread/file-attachment/index.tsx @@ -22,14 +22,15 @@ import { usePresentationViewerStore } from '@/stores/presentation-viewer-store'; import { IframePreview } from '../iframe-preview'; // Helper function to check if a filepath is a presentation attachment +// Matches paths like: presentations/name/slide_01.html, /workspace/presentations/name/slide_01.html, etc. function isPresentationAttachment(filepath: string): boolean { - const presentationPattern = /^presentations\/([^\/]+)\/(slide_\d+\.html|metadata\.json)$/i; + const presentationPattern = /presentations\/([^\/]+)\/slide_(\d+)\.html$/i; return presentationPattern.test(filepath); } // Helper function to extract presentation name from filepath function extractPresentationName(filepath: string): string | null { - const match = filepath.match(/^presentations\/([^\/]+)\//i); + const match = filepath.match(/presentations\/([^\/]+)\/slide_\d+\.html$/i); return match ? match[1] : null; } @@ -395,7 +396,7 @@ export function FileAttachmentGrid({ className="cursor-pointer p-1 rounded-full hover:bg-black/10 dark:hover:bg-white/10" title="Open in new tab" > - +
From 7110f41d41a6430aa155ff49c6015c6d6e149a2a Mon Sep 17 00:00:00 2001 From: dg996 Date: Sun, 4 Jan 2026 10:01:28 +0100 Subject: [PATCH 004/229] Update promo code: Change WELCOME2X to KORTIX2026 and badge label to Happy New Year Offer --- apps/frontend/src/hooks/utils/use-promo.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/hooks/utils/use-promo.ts b/apps/frontend/src/hooks/utils/use-promo.ts index 767501ea91..9be9ae038e 100644 --- a/apps/frontend/src/hooks/utils/use-promo.ts +++ b/apps/frontend/src/hooks/utils/use-promo.ts @@ -25,8 +25,8 @@ const getEndOfCurrentMonthUTC = (): number => { const PROMOS: PromoConfig[] = [ { id: 'welcome-bonus', - promoCode: 'WELCOME2X', - badgeLabel: 'Welcome Bonus', + promoCode: 'KORTIX2026', + badgeLabel: 'Happy New Year Offer', description: '2X Credits', // Active from now until end of current month startDate: Date.UTC(2025, 0, 1, 0, 0, 0), // Always active (start from beginning of 2025) From b5c2935498c835b427c9cd29d53cc405695d9b30 Mon Sep 17 00:00:00 2001 From: marko-kraemer Date: Sun, 4 Jan 2026 04:07:29 -0500 Subject: [PATCH 005/229] fix --- apps/frontend/package-lock.json | 23020 ---------------- apps/frontend/src/app/help/layout.tsx | 45 +- .../src/app/templates/[shareId]/page.tsx | 2 +- .../components/dashboard/examples/index.tsx | 2 +- .../components/help/help-layout-client.tsx | 40 + .../thread/content/PlaybackControls.tsx | 6 +- .../thread/content/ShowToolStream.tsx | 60 +- .../thread/tool-views/shared/LoadingState.tsx | 2 +- apps/frontend/src/components/thread/types.ts | 90 +- .../src/components/ui/date-range-picker.tsx | 4 +- .../ui/shadcn-io/code-block/index.tsx | 2 +- apps/frontend/src/hooks/messages/index.ts | 17 + .../src/hooks/messages/useAgentStream.ts | 4 +- .../src/hooks/messages/useSmoothAnimation.ts | 175 + .../src/hooks/messages/useSmoothText.ts | 110 +- .../hooks/messages/useSmoothToolArguments.ts | 240 + apps/frontend/src/hooks/streaming/types.ts | 0 .../hooks/streaming/use-stream-messages.ts | 44 +- .../src/hooks/streaming/use-stream-state.ts | 4 +- .../streaming/use-tool-call-accumulator.ts | 126 + apps/mobile/package-lock.json | 18478 ------------- backend/core/threads/init.py | 16 +- package.json | 6 + packages/shared/src/types/streaming.ts | 185 + pnpm-lock.yaml | 2735 +- 25 files changed, 2306 insertions(+), 43107 deletions(-) delete mode 100644 apps/frontend/package-lock.json create mode 100644 apps/frontend/src/components/help/help-layout-client.tsx create mode 100644 apps/frontend/src/hooks/messages/useSmoothAnimation.ts create mode 100644 apps/frontend/src/hooks/messages/useSmoothToolArguments.ts delete mode 100644 apps/frontend/src/hooks/streaming/types.ts create mode 100644 apps/frontend/src/hooks/streaming/use-tool-call-accumulator.ts delete mode 100644 apps/mobile/package-lock.json diff --git a/apps/frontend/package-lock.json b/apps/frontend/package-lock.json deleted file mode 100644 index dd96702345..0000000000 --- a/apps/frontend/package-lock.json +++ /dev/null @@ -1,23020 +0,0 @@ -{ - "name": "Kortix", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "Kortix", - "version": "0.1.0", - "dependencies": { - "@calcom/embed-react": "^1.5.2", - "@codemirror/view": "^6.38.1", - "@cyntler/react-doc-viewer": "^1.17.1", - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/sortable": "^10.0.0", - "@dnd-kit/utilities": "^3.2.2", - "@emoji-mart/data": "^1.2.1", - "@emoji-mart/react": "^1.1.1", - "@hookform/resolvers": "^5.2.1", - "@icons-pack/react-simple-icons": "^13.7.0", - "@liquidglass/react": "^0.1.3", - "@next/third-parties": "^15.3.1", - "@novu/nextjs": "^3.11.0", - "@novu/notification-center": "^2.0.0", - "@number-flow/react": "^0.5.7", - "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-alert-dialog": "^1.1.11", - "@radix-ui/react-avatar": "^1.1.10", - "@radix-ui/react-checkbox": "^1.1.5", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.16", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-icons": "^1.3.2", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-navigation-menu": "^1.2.5", - "@radix-ui/react-popover": "^1.1.7", - "@radix-ui/react-progress": "^1.1.7", - "@radix-ui/react-radio-group": "^1.3.3", - "@radix-ui/react-scroll-area": "^1.2.4", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-slider": "^1.3.2", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.8", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-tooltip": "^1.2.8", - "@radix-ui/react-use-controllable-state": "^1.2.2", - "@react-pdf/renderer": "^4.3.0", - "@shikijs/transformers": "^3.12.0", - "@silevis/reactgrid": "^4.1.17", - "@supabase/ssr": "latest", - "@supabase/supabase-js": "latest", - "@syncfusion/ej2-base": "^32.1.19", - "@syncfusion/ej2-buttons": "^32.1.19", - "@syncfusion/ej2-dropdowns": "^32.1.20", - "@syncfusion/ej2-grids": "^32.1.20", - "@syncfusion/ej2-inputs": "^32.1.20", - "@syncfusion/ej2-lists": "^32.1.19", - "@syncfusion/ej2-navigations": "^32.1.19", - "@syncfusion/ej2-popups": "^32.1.19", - "@syncfusion/ej2-react-spreadsheet": "^32.1.20", - "@syncfusion/ej2-splitbuttons": "^32.1.19", - "@tailwindcss/typography": "^0.5.16", - "@tanstack/react-query": "^5.75.2", - "@tanstack/react-query-devtools": "^5.75.2", - "@tanstack/react-table": "^8.21.3", - "@tiptap/extension-bubble-menu": "^3.13.0", - "@tiptap/extension-character-count": "^3.3.0", - "@tiptap/extension-code-block-lowlight": "^3.3.0", - "@tiptap/extension-collaboration": "^3.3.0", - "@tiptap/extension-color": "^3.3.0", - "@tiptap/extension-details": "^3.3.0", - "@tiptap/extension-dropcursor": "^3.3.0", - "@tiptap/extension-emoji": "^3.3.0", - "@tiptap/extension-font-family": "^3.3.0", - "@tiptap/extension-gapcursor": "^3.3.0", - "@tiptap/extension-highlight": "^3.3.0", - "@tiptap/extension-history": "^3.3.0", - "@tiptap/extension-horizontal-rule": "^3.3.0", - "@tiptap/extension-image": "^3.3.0", - "@tiptap/extension-link": "^3.3.0", - "@tiptap/extension-list": "^3.3.0", - "@tiptap/extension-mathematics": "^3.3.0", - "@tiptap/extension-mention": "^3.3.0", - "@tiptap/extension-placeholder": "^3.3.0", - "@tiptap/extension-subscript": "^3.3.0", - "@tiptap/extension-superscript": "^3.3.0", - "@tiptap/extension-table": "^3.3.0", - "@tiptap/extension-task-item": "^3.3.0", - "@tiptap/extension-task-list": "^3.3.0", - "@tiptap/extension-text-align": "^3.3.0", - "@tiptap/extension-text-style": "^3.13.0", - "@tiptap/extension-typography": "^3.3.0", - "@tiptap/extension-youtube": "^3.3.0", - "@tiptap/pm": "^3.3.0", - "@tiptap/react": "^3.3.0", - "@tiptap/starter-kit": "^3.3.0", - "@tiptap/suggestion": "^3.13.0", - "@types/jszip": "^3.4.0", - "@types/papaparse": "^5.3.15", - "@uiw/codemirror-extensions-langs": "^4.23.10", - "@uiw/codemirror-theme-vscode": "^4.23.10", - "@uiw/codemirror-theme-xcode": "^4.23.10", - "@uiw/react-codemirror": "^4.23.10", - "@usebasejump/shared": "^0.0.3", - "@vercel/analytics": "^1.5.0", - "@vercel/edge-config": "^1.4.0", - "@vercel/speed-insights": "^1.2.0", - "@xterm/addon-fit": "^0.10.0", - "@xterm/addon-web-links": "^0.11.0", - "@xterm/xterm": "^5.5.0", - "autoprefixer": "10.4.17", - "canvas": "^3.1.0", - "canvas-confetti": "^1.9.4", - "chart.js": "^4.5.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "cobe": "^0.6.3", - "color": "^5.0.0", - "color-bits": "^1.1.0", - "colorthief": "^2.6.0", - "comment-json": "^4.2.5", - "date-fns": "^3.6.0", - "diff": "^7.0.0", - "extract-colors": "^4.2.0", - "file-saver": "^2.0.5", - "flags": "^4.0.2", - "framer-motion": "^12.6.5", - "geist": "^1.2.1", - "gsap": "^3.13.0", - "hjson": "^3.2.2", - "html2pdf.js": "^0.10.3", - "install": "^0.13.0", - "jju": "^1.4.0", - "json5": "^2.2.3", - "jsonrepair": "^3.12.0", - "jszip": "^3.10.1", - "katex": "^0.16.22", - "konva": "^9.3.16", - "libphonenumber-js": "^1.12.10", - "liquid-glass-react": "^1.1.1", - "lodash": "^4.17.21", - "lottie-react": "^2.4.1", - "lowlight": "^3.3.0", - "lucide-react": "^0.479.0", - "marked": "^15.0.7", - "mermaid": "^11.12.0", - "next": "^15.3.8", - "next-intl": "^4.5.3", - "next-themes": "^0.4.6", - "npm": "^11.5.2", - "papaparse": "^5.5.2", - "pdfjs-dist": "4.8.69", - "playwright": "^1.57.0", - "postcss": "8.4.33", - "posthog-js": "^1.258.6", - "posthog-node": "^5.6.0", - "radix-ui": "^1.4.3", - "react": "^18", - "react-color-palette": "^7.3.1", - "react-colorful": "^5.6.1", - "react-day-picker": "^8.10.1", - "react-diff-viewer-continued": "^3.4.0", - "react-dom": "^18", - "react-hook-form": "^7.62.0", - "react-icons": "^5.5.0", - "react-is": "^19.2.3", - "react-konva": "^19.2.1", - "react-markdown": "^10.1.0", - "react-papaparse": "^4.4.0", - "react-pdf": "^9.2.1", - "react-phone-number-input": "^3.4.12", - "react-resizable-panels": "^3.0.6", - "read-excel-file": "^6.0.1", - "recharts": "^3.2.1", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "remark-gfm": "^4.0.1", - "server-only": "^0.0.1", - "sonner": "^2.0.3", - "streamdown": "^1.6.10", - "tailwind-merge": "^3.0.2", - "tailwind-scrollbar": "^4.0.2", - "tailwind-scrollbar-hide": "^2.0.0", - "tailwindcss": "^4", - "tailwindcss-animate": "^1.0.7", - "turndown": "^7.2.1", - "turndown-plugin-gfm": "^1.0.2", - "typescript": "^5", - "vaul": "^1.1.2", - "xlsx": "^0.18.5", - "y-indexeddb": "^9.0.12", - "yjs": "^13.6.27", - "zod": "^3.25.76", - "zustand": "^5.0.3" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4.1.4", - "@types/canvas-confetti": "^1.9.0", - "@types/color": "^4.2.0", - "@types/colorthief": "^2.6.0", - "@types/diff": "^7.0.2", - "@types/jju": "^1.4.5", - "@types/lodash": "^4.17.20", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/turndown": "^5.0.5", - "encoding": "^0.1.13", - "eslint": "^9", - "eslint-config-next": "15.2.2", - "prettier": "^3.5.3", - "shiki": "^3.12.0", - "tailwindcss": "^4", - "tw-animate-css": "^1.2.4", - "typescript": "^5" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "license": "MIT" - }, - "node_modules/@calcom/embed-core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@calcom/embed-core/-/embed-core-1.5.3.tgz", - "integrity": "sha512-GeId9gaByJ5EWiPmuvelZOvFWPOTWkcWZr5vGTCbIUTX125oE5yn0n8lDF1MJk5Xj1WO+/dk9jKIE08Ad9ytiQ==", - "license": "SEE LICENSE IN LICENSE" - }, - "node_modules/@calcom/embed-react": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@calcom/embed-react/-/embed-react-1.5.3.tgz", - "integrity": "sha512-JCgge04pc8fhdvUmPNVLhW8/lCWK+AAziKecKWWPfv1nn2s+qKP2BwsEAnxhxK9yPOBgE1EIEgmYkrrNB1iajA==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@calcom/embed-core": "1.5.3", - "@calcom/embed-snippet": "1.3.3" - }, - "peerDependencies": { - "react": "^18.2.0 || ^19.0.0", - "react-dom": "^18.2.0 || ^19.0.0" - } - }, - "node_modules/@calcom/embed-snippet": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@calcom/embed-snippet/-/embed-snippet-1.3.3.tgz", - "integrity": "sha512-pqqKaeLB8R6BvyegcpI9gAyY6Xyx1bKYfWvIGOvIbTpguWyM1BBBVcT9DCeGe8Zw7Ujp5K56ci7isRUrT2Uadg==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@calcom/embed-core": "1.5.3" - } - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "license": "Apache-2.0" - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", - "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.0.tgz", - "integrity": "sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-angular": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@codemirror/lang-angular/-/lang-angular-0.1.4.tgz", - "integrity": "sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-javascript": "^6.1.2", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.3" - } - }, - "node_modules/@codemirror/lang-cpp": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz", - "integrity": "sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/cpp": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-css": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", - "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/css": "^1.1.7" - } - }, - "node_modules/@codemirror/lang-go": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-go/-/lang-go-6.0.1.tgz", - "integrity": "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/go": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/css": "^1.1.0", - "@lezer/html": "^1.3.12" - } - }, - "node_modules/@codemirror/lang-java": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz", - "integrity": "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/java": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-javascript": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", - "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/javascript": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-jinja": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-jinja/-/lang-jinja-6.0.0.tgz", - "integrity": "sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.4.0" - } - }, - "node_modules/@codemirror/lang-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", - "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/json": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-less": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-less/-/lang-less-6.0.2.tgz", - "integrity": "sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-css": "^6.2.0", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-liquid": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.0.tgz", - "integrity": "sha512-fY1YsUExcieXRTsCiwX/bQ9+PbCTA/Fumv7C7mTUZHoFkibfESnaXwpr2aKH6zZVwysEunsHHkaIpM/pl3xETQ==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.1" - } - }, - "node_modules/@codemirror/lang-markdown": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", - "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.7.1", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.3.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.2.1", - "@lezer/markdown": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-php": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.2.tgz", - "integrity": "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/php": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-python": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz", - "integrity": "sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.3.2", - "@codemirror/language": "^6.8.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.1", - "@lezer/python": "^1.1.4" - } - }, - "node_modules/@codemirror/lang-rust": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz", - "integrity": "sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/rust": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-sass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz", - "integrity": "sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-css": "^6.2.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/sass": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-sql": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz", - "integrity": "sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-vue": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz", - "integrity": "sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-javascript": "^6.1.2", - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.1" - } - }, - "node_modules/@codemirror/lang-wast": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz", - "integrity": "sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-xml": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", - "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-yaml": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz", - "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.0.0", - "@lezer/yaml": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.3.tgz", - "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/language-data": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.5.2.tgz", - "integrity": "sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg==", - "license": "MIT", - "dependencies": { - "@codemirror/lang-angular": "^0.1.0", - "@codemirror/lang-cpp": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-go": "^6.0.0", - "@codemirror/lang-html": "^6.0.0", - "@codemirror/lang-java": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/lang-jinja": "^6.0.0", - "@codemirror/lang-json": "^6.0.0", - "@codemirror/lang-less": "^6.0.0", - "@codemirror/lang-liquid": "^6.0.0", - "@codemirror/lang-markdown": "^6.0.0", - "@codemirror/lang-php": "^6.0.0", - "@codemirror/lang-python": "^6.0.0", - "@codemirror/lang-rust": "^6.0.0", - "@codemirror/lang-sass": "^6.0.0", - "@codemirror/lang-sql": "^6.0.0", - "@codemirror/lang-vue": "^0.1.1", - "@codemirror/lang-wast": "^6.0.0", - "@codemirror/lang-xml": "^6.0.0", - "@codemirror/lang-yaml": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/legacy-modes": "^6.4.0" - } - }, - "node_modules/@codemirror/legacy-modes": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.2.tgz", - "integrity": "sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.2.tgz", - "integrity": "sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", - "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", - "license": "MIT", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/theme-one-dark": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", - "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.38.8", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.8.tgz", - "integrity": "sha512-XcE9fcnkHCbWkjeKyi0lllwXmBLtyYb5dt89dJyx23I9+LSh5vZDIuk7OLG4VM1lgrXZQcY6cxyZyk5WVPRv/A==", - "license": "MIT", - "dependencies": { - "@codemirror/state": "^6.5.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@corvu/utils": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@corvu/utils/-/utils-0.4.2.tgz", - "integrity": "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.6.11" - }, - "peerDependencies": { - "solid-js": "^1.8" - } - }, - "node_modules/@cyntler/react-doc-viewer": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@cyntler/react-doc-viewer/-/react-doc-viewer-1.17.1.tgz", - "integrity": "sha512-KaH2iuwBP0PiLKu+tiTfq46AadiCdaUQALExAomxkR9TpNaDipTs0HDTneW/oDrnX5bJkb1FhshL/gro8+Q2kg==", - "license": "Apache License 2.0", - "dependencies": { - "@types/mustache": "^4.2.5", - "@types/papaparse": "^5.3.14", - "ajv": "^7.2.4", - "core-js": "^3.37.1", - "mustache": "^4.2.0", - "papaparse": "^5.4.1", - "react-pdf": "^9.0.0", - "styled-components": "^6.1.11" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "license": "MIT", - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", - "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@edge-runtime/cookies": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@edge-runtime/cookies/-/cookies-5.0.2.tgz", - "integrity": "sha512-Sd8LcWpZk/SWEeKGE8LT6gMm5MGfX/wm+GPnh1eBEtCpya3vYqn37wYknwAHw92ONoyyREl1hJwxV/Qx2DWNOg==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/@emnapi/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", - "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emoji-mart/data": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", - "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==", - "license": "MIT" - }, - "node_modules/@emoji-mart/react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/react/-/react-1.1.1.tgz", - "integrity": "sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==", - "license": "MIT", - "peerDependencies": { - "emoji-mart": "^5.2", - "react": "^16.8 || ^17 || ^18" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@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.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "license": "MIT", - "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" - } - }, - "node_modules/@emotion/css": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz", - "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==", - "license": "MIT", - "dependencies": { - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", - "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", - "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@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", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.14.1", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", - "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", - "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^1.3.0", - "aria-hidden": "^1.1.3", - "tabbable": "^6.0.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", - "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", - "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", - "license": "MIT", - "dependencies": { - "@formatjs/fast-memoize": "2.2.7", - "@formatjs/intl-localematcher": "0.6.2", - "decimal.js": "^10.4.3", - "tslib": "^2.8.0" - } - }, - "node_modules/@formatjs/ecma402-abstract/node_modules/@formatjs/intl-localematcher": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", - "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", - "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", - "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "2.3.6", - "@formatjs/icu-skeleton-parser": "1.8.16", - "tslib": "^2.8.0" - } - }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", - "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", - "license": "MIT", - "dependencies": { - "@formatjs/ecma402-abstract": "2.3.6", - "tslib": "^2.8.0" - } - }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", - "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", - "license": "MIT", - "dependencies": { - "tslib": "2" - } - }, - "node_modules/@hookform/resolvers": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", - "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, - "node_modules/@icons-pack/react-simple-icons": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/@icons-pack/react-simple-icons/-/react-simple-icons-13.8.0.tgz", - "integrity": "sha512-iZrhL1fSklfCCVn68IYHaAoKfcby3RakUTn2tRPyHBkhr2tkYqeQbjJWf+NizIYBzKBn2IarDJXmTdXd6CuEfw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.13 || ^17 || ^18 || ^19" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@internationalized/date": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz", - "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@internationalized/number": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", - "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kobalte/core": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/@kobalte/core/-/core-0.13.11.tgz", - "integrity": "sha512-hK7TYpdib/XDb/r/4XDBFaO9O+3ZHz4ZWryV4/3BfES+tSQVgg2IJupDnztKXB0BqbSRy/aWlHKw1SPtNPYCFQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.5.1", - "@internationalized/date": "^3.4.0", - "@internationalized/number": "^3.2.1", - "@kobalte/utils": "^0.9.1", - "@solid-primitives/props": "^3.1.8", - "@solid-primitives/resize-observer": "^2.0.26", - "solid-presence": "^0.1.8", - "solid-prevent-scroll": "^0.1.4" - }, - "peerDependencies": { - "solid-js": "^1.8.15" - } - }, - "node_modules/@kobalte/utils": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@kobalte/utils/-/utils-0.9.1.tgz", - "integrity": "sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==", - "license": "MIT", - "dependencies": { - "@solid-primitives/event-listener": "^2.2.14", - "@solid-primitives/keyed": "^1.2.0", - "@solid-primitives/map": "^0.4.7", - "@solid-primitives/media": "^2.2.4", - "@solid-primitives/props": "^3.1.8", - "@solid-primitives/refs": "^1.0.5", - "@solid-primitives/utils": "^6.2.1" - }, - "peerDependencies": { - "solid-js": "^1.8.8" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "node_modules/@lezer/common": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.4.0.tgz", - "integrity": "sha512-DVeMRoGrgn/k45oQNu189BoW4SZwgZFzJ1+1TV5j2NJ/KFC83oa/enRqZSGshyeMk5cPWMhsKs9nx+8o0unwGg==", - "license": "MIT" - }, - "node_modules/@lezer/cpp": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.3.tgz", - "integrity": "sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/css": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", - "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/go": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@lezer/go/-/go-1.0.1.tgz", - "integrity": "sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/highlight": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", - "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.3.0" - } - }, - "node_modules/@lezer/html": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.12.tgz", - "integrity": "sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/java": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@lezer/java/-/java-1.1.3.tgz", - "integrity": "sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/javascript": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", - "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.1.3", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.4.tgz", - "integrity": "sha512-LHL17Mq0OcFXm1pGQssuGTQFPPdxARjKM8f7GA5+sGtHi0K3R84YaSbmche0+RKWHnCsx9asEe5OWOI4FHfe4A==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/markdown": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.1.tgz", - "integrity": "sha512-72ah+Sml7lD8Wn7lnz9vwYmZBo9aQT+I2gjK/0epI+gjdwUbWw3MJ/ZBGEqG1UfrIauRqH37/c5mVHXeCTGXtA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@lezer/php": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.5.tgz", - "integrity": "sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.1.0" - } - }, - "node_modules/@lezer/python": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", - "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/rust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lezer/rust/-/rust-1.0.2.tgz", - "integrity": "sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/sass": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lezer/sass/-/sass-1.1.0.tgz", - "integrity": "sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/xml": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", - "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/yaml": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz", - "integrity": "sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.4.0" - } - }, - "node_modules/@liquidglass/react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@liquidglass/react/-/react-0.1.3.tgz", - "integrity": "sha512-tO90pmHmDTQqe+lYacjYaTfH0xnvuA+Bj1h5wq1y1GlDVFvXY3cT6sGLA6lJHYpUReC38FhmV0dyRdwrxx6TWg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@lokesh.dhakar/quantize": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lokesh.dhakar/quantize/-/quantize-1.4.0.tgz", - "integrity": "sha512-+//cqVWKis//t0YH62EDtwaFSPG/CDtYNg4CZmzNmG2d5W17Iu3fuDAdpQXCDHUDrrU9q0veze4A7tPZXlR/mg==", - "license": "MIT" - }, - "node_modules/@mantine/core": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-5.10.5.tgz", - "integrity": "sha512-F4tqHSEVM9D6/iSqHfPda+Xl5XgSEPHAAkT01Zwzj4Jnbd10qGrlqr/SFUop2CIcuKYnmra9XltUahUPXBC2BQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.19.1", - "@mantine/styles": "5.10.5", - "@mantine/utils": "5.10.5", - "@radix-ui/react-scroll-area": "1.0.2", - "react-textarea-autosize": "8.3.4" - }, - "peerDependencies": { - "@mantine/hooks": "5.10.5", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/number": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", - "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-direction": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", - "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", - "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-scroll-area": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.2.tgz", - "integrity": "sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.0", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-direction": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.1", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-slot": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", - "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/core/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@mantine/hooks": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-5.10.5.tgz", - "integrity": "sha512-hFQp71QZDfivPzfIUOQZfMKLiOL/Cn2EnzacRlbUr55myteTfzYN8YMt+nzniE/6c4IRopFHEAdbKEtfyQc6kg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@mantine/styles": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-5.10.5.tgz", - "integrity": "sha512-0NXk8c/XGzuTUkZc6KceF2NaTCMEu5mHR4ru0x+ttb9DGnLpHuGWduTHjSfr4hl6eAJgedD0zauO+VAhDzO9zA==", - "license": "MIT", - "dependencies": { - "clsx": "1.1.1", - "csstype": "3.0.9" - }, - "peerDependencies": { - "@emotion/react": ">=11.9.0", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@mantine/styles/node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@mantine/styles/node_modules/csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", - "license": "MIT" - }, - "node_modules/@mantine/utils": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-5.10.5.tgz", - "integrity": "sha512-FGMq4dGs5HhDAtI0z46uzxzKKPmZ3h5uKUyKg1ZHoFR1mBtcUMbB6FylFmHqKFRWlJ5IXqX9dwmiVrLYUOfTmA==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" - }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", - "license": "MIT", - "dependencies": { - "langium": "3.3.1" - } - }, - "node_modules/@mixmark-io/domino": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", - "license": "BSD-2-Clause" - }, - "node_modules/@motionone/animation": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", - "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", - "license": "MIT", - "dependencies": { - "@motionone/easing": "^10.18.0", - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/dom": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", - "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", - "license": "MIT", - "dependencies": { - "@motionone/animation": "^10.18.0", - "@motionone/generators": "^10.18.0", - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "hey-listen": "^1.0.8", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/easing": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", - "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", - "license": "MIT", - "dependencies": { - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/generators": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", - "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", - "license": "MIT", - "dependencies": { - "@motionone/types": "^10.17.1", - "@motionone/utils": "^10.18.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@motionone/types": { - "version": "10.17.1", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", - "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==", - "license": "MIT" - }, - "node_modules/@motionone/utils": { - "version": "10.18.0", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", - "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", - "license": "MIT", - "dependencies": { - "@motionone/types": "^10.17.1", - "hey-listen": "^1.0.8", - "tslib": "^2.3.1" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@next/env": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", - "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.2.2.tgz", - "integrity": "sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", - "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", - "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", - "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", - "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", - "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", - "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", - "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", - "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/third-parties": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-15.5.7.tgz", - "integrity": "sha512-xIahs2sBMwYBtI0CLSUCMtKXen6T8G23Cq1WogA8BMRSIDqkhHutHpu+nrdzSNVg4yA59B8oU8DFdcGz4WHWtw==", - "license": "MIT", - "dependencies": { - "third-party-capital": "1.0.20" - }, - "peerDependencies": { - "next": "^13.0.0 || ^14.0.0 || ^15.0.0", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@novu/client": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@novu/client/-/client-2.6.6.tgz", - "integrity": "sha512-XQSZVJaNMxCmrB9UkIC/06bQPdDwYiYEkJOjrgXFLU5N2WVnB75A25jptZuHzR2fLIsE+b1Vw1y2G2+OkzqFyw==", - "deprecated": "April 3, 2025 marks the end of support for @novu/client. Users can migrate to the new @novu/js package. For more information, visit https://docs.novu.co/platform/sdks/javascript", - "license": "MIT", - "dependencies": { - "@novu/shared": "2.6.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@novu/js": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@novu/js/-/js-3.11.0.tgz", - "integrity": "sha512-9GV0lb5n3Cf9vTfKgm/UzBnCm/+fcpFiqnSyuDd4lbI7BpdDbcDx5vz+XhvFhnJwtw+d1c9wTKTu5Q8xsplG7Q==", - "license": "ISC", - "dependencies": { - "@floating-ui/dom": "^1.6.13", - "@kobalte/core": "^0.13.10", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "event-target-polyfill": "^0.0.4", - "mitt": "^3.0.1", - "partysocket": "^1.1.4", - "socket.io-client": "4.7.2", - "solid-floating-ui": "^0.3.1", - "solid-js": "^1.9.4", - "solid-motionone": "^1.0.3", - "tailwind-merge": "^2.4.0" - } - }, - "node_modules/@novu/js/node_modules/tailwind-merge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", - "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/@novu/nextjs": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@novu/nextjs/-/nextjs-3.11.0.tgz", - "integrity": "sha512-1zjWcQdSXWWGKmA8prnCr8htReSgdI8flfsSStCaaH6tHVO69HSvvLwl+msM2NZeyUELntdqPguIPsAkZR8jqg==", - "license": "ISC", - "dependencies": { - "@novu/react": "3.11.0" - }, - "peerDependencies": { - "next": ">=13.5.2 || ^14.0.0 || ^15.0.0", - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-0", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@novu/notification-center": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@novu/notification-center/-/notification-center-2.0.0.tgz", - "integrity": "sha512-jzhk+KebehYkc2XSUMnkp+Zd18lfPLCSMBwnsYy5V+yE2QIRM1Lb73LQyNhRw71LfriSFFfAown7xlD1+L4/Vw==", - "deprecated": "April 3, 2025 marks the end of support for @novu/notification-center. Users can migrate to the new @novu/react or @novu/js package. For more information, visit https://docs.novu.co/platform/inbox/overview. To migrate to the new Novu refer to https://docs.novu.co/platform/inbox/react/migration-guide", - "license": "ISC", - "dependencies": { - "@emotion/css": "^11.10.5", - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.6.0", - "@mantine/core": "^5.7.1", - "@mantine/hooks": "^5.7.1", - "@novu/client": "^2.0.0", - "@novu/shared": "^2.0.0", - "@tanstack/react-query": "^4.20.4", - "acorn-jsx": "^5.3.2", - "axios": "^1.6.2", - "lodash.clonedeep": "^4.5.0", - "lodash.debounce": "^4.0.8", - "lodash.merge": "^4.6.2", - "react-infinite-scroll-component": "^6.0.0", - "socket.io-client": "4.7.2", - "tslib": "^2.3.1", - "webfontloader": "^1.6.28" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@novu/notification-center/node_modules/@tanstack/query-core": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.41.0.tgz", - "integrity": "sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@novu/notification-center/node_modules/@tanstack/react-query": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.42.0.tgz", - "integrity": "sha512-j0tiofkzE3CSrYKmVRaKuwGgvCE+P2OOEDlhmfjeZf5ufcuFHwYwwgw3j08n4WYPVZ+OpsHblcFYezhKA3jDwg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "4.41.0", - "use-sync-external-store": "^1.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "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", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@novu/react": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@novu/react/-/react-3.11.0.tgz", - "integrity": "sha512-VoDh2DNjyP8JuzsLUXc5md9UEWF1MTQamMWjYeEv8WxUtDuYBkYGYjs7x/80kZXZ0wBJDuPsstypYUzjhsOwnw==", - "license": "ISC", - "dependencies": { - "@novu/js": "3.11.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-0", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@novu/shared": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@novu/shared/-/shared-2.6.6.tgz", - "integrity": "sha512-Y4YrvvJHX8yopkkvb4MnS+u59JBjUsrJBYqcn/STKkbbdzmSPccVwA0GUTiCZivUKSBtrTvllIHtP7Bi5ATQ4A==", - "license": "ISC" - }, - "node_modules/@number-flow/react": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@number-flow/react/-/react-0.5.10.tgz", - "integrity": "sha512-a8Wh5eNITn7Km4xbddAH7QH8eNmnduR6k34ER1hkHSGO4H2yU1DDnuAWLQM99vciGInFODemSc0tdxrXkJEpbA==", - "license": "MIT", - "dependencies": { - "esm-env": "^1.1.4", - "number-flow": "0.5.8" - }, - "peerDependencies": { - "react": "^18 || ^19", - "react-dom": "^18 || ^19" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@posthog/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", - "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", - "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", - "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-form": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", - "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-form/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", - "license": "MIT", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", - "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", - "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.7.4" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", - "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", - "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-toggle-group": "1.1.11" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-toolbar/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@react-pdf/fns": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-pdf/fns/-/fns-3.1.2.tgz", - "integrity": "sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==", - "license": "MIT" - }, - "node_modules/@react-pdf/font": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@react-pdf/font/-/font-4.0.3.tgz", - "integrity": "sha512-N1qQDZr6phXYQOp033Hvm2nkUkx2LkszjGPbmRavs9VOYzi4sp31MaccMKptL24ii6UhBh/z9yPUhnuNe/qHwA==", - "license": "MIT", - "dependencies": { - "@react-pdf/pdfkit": "^4.0.4", - "@react-pdf/types": "^2.9.1", - "fontkit": "^2.0.2", - "is-url": "^1.2.4" - } - }, - "node_modules/@react-pdf/image": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@react-pdf/image/-/image-3.0.3.tgz", - "integrity": "sha512-lvP5ryzYM3wpbO9bvqLZYwEr5XBDX9jcaRICvtnoRqdJOo7PRrMnmB4MMScyb+Xw10mGeIubZAAomNAG5ONQZQ==", - "license": "MIT", - "dependencies": { - "@react-pdf/png-js": "^3.0.0", - "jay-peg": "^1.1.1" - } - }, - "node_modules/@react-pdf/layout": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@react-pdf/layout/-/layout-4.4.1.tgz", - "integrity": "sha512-GVzdlWoZWldRDzlWj3SttRXmVDxg7YfraAohwy+o9gb9hrbDJaaAV6jV3pc630Evd3K46OAzk8EFu8EgPDuVuA==", - "license": "MIT", - "dependencies": { - "@react-pdf/fns": "3.1.2", - "@react-pdf/image": "^3.0.3", - "@react-pdf/primitives": "^4.1.1", - "@react-pdf/stylesheet": "^6.1.1", - "@react-pdf/textkit": "^6.0.0", - "@react-pdf/types": "^2.9.1", - "emoji-regex-xs": "^1.0.0", - "queue": "^6.0.1", - "yoga-layout": "^3.2.1" - } - }, - "node_modules/@react-pdf/pdfkit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-4.0.4.tgz", - "integrity": "sha512-/nITLggsPlB66bVLnm0X7MNdKQxXelLGZG6zB5acF5cCgkFwmXHnLNyxYOUD4GMOMg1HOPShXDKWrwk2ZeHsvw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@react-pdf/png-js": "^3.0.0", - "browserify-zlib": "^0.2.0", - "crypto-js": "^4.2.0", - "fontkit": "^2.0.2", - "jay-peg": "^1.1.1", - "linebreak": "^1.1.0", - "vite-compatible-readable-stream": "^3.6.1" - } - }, - "node_modules/@react-pdf/png-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-pdf/png-js/-/png-js-3.0.0.tgz", - "integrity": "sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==", - "license": "MIT", - "dependencies": { - "browserify-zlib": "^0.2.0" - } - }, - "node_modules/@react-pdf/primitives": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@react-pdf/primitives/-/primitives-4.1.1.tgz", - "integrity": "sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==", - "license": "MIT" - }, - "node_modules/@react-pdf/reconciler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@react-pdf/reconciler/-/reconciler-1.1.4.tgz", - "integrity": "sha512-oTQDiR/t4Z/Guxac88IavpU2UgN7eR0RMI9DRKvKnvPz2DUasGjXfChAdMqDNmJJxxV26mMy9xQOUV2UU5/okg==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "scheduler": "0.25.0-rc-603e6108-20241029" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-pdf/render": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@react-pdf/render/-/render-4.3.1.tgz", - "integrity": "sha512-v1WAaAhQShQZGcBxfjkEThGCHVH9CSuitrZ1bIOLvB5iBKM14abYK5D6djKhWCwF6FTzYeT2WRjRMVgze/ND2A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@react-pdf/fns": "3.1.2", - "@react-pdf/primitives": "^4.1.1", - "@react-pdf/textkit": "^6.0.0", - "@react-pdf/types": "^2.9.1", - "abs-svg-path": "^0.1.1", - "color-string": "^1.9.1", - "normalize-svg-path": "^1.1.0", - "parse-svg-path": "^0.1.2", - "svg-arc-to-cubic-bezier": "^3.2.0" - } - }, - "node_modules/@react-pdf/renderer": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@react-pdf/renderer/-/renderer-4.3.1.tgz", - "integrity": "sha512-dPKHiwGTaOsKqNWCHPYYrx8CDfAGsUnV4tvRsEu0VPGxuot1AOq/M+YgfN/Pb+MeXCTe2/lv6NvA8haUtj3tsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@react-pdf/fns": "3.1.2", - "@react-pdf/font": "^4.0.3", - "@react-pdf/layout": "^4.4.1", - "@react-pdf/pdfkit": "^4.0.4", - "@react-pdf/primitives": "^4.1.1", - "@react-pdf/reconciler": "^1.1.4", - "@react-pdf/render": "^4.3.1", - "@react-pdf/types": "^2.9.1", - "events": "^3.3.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "queue": "^6.0.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-pdf/stylesheet": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-6.1.1.tgz", - "integrity": "sha512-Iyw0A3wRIeQLN4EkaKf8yF9MvdMxiZ8JjoyzLzDHSxnKYoOA4UGu84veCb8dT9N8MxY5x7a0BUv/avTe586Plg==", - "license": "MIT", - "dependencies": { - "@react-pdf/fns": "3.1.2", - "@react-pdf/types": "^2.9.1", - "color-string": "^1.9.1", - "hsl-to-hex": "^1.0.0", - "media-engine": "^1.0.3", - "postcss-value-parser": "^4.1.0" - } - }, - "node_modules/@react-pdf/textkit": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@react-pdf/textkit/-/textkit-6.0.0.tgz", - "integrity": "sha512-fDt19KWaJRK/n2AaFoVm31hgGmpygmTV7LsHGJNGZkgzXcFyLsx+XUl63DTDPH3iqxj3xUX128t104GtOz8tTw==", - "license": "MIT", - "dependencies": { - "@react-pdf/fns": "3.1.2", - "bidi-js": "^1.0.2", - "hyphen": "^1.6.4", - "unicode-properties": "^1.4.1" - } - }, - "node_modules/@react-pdf/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@react-pdf/types/-/types-2.9.1.tgz", - "integrity": "sha512-5GoCgG0G5NMgpPuHbKG2xcVRQt7+E5pg3IyzVIIozKG3nLcnsXW4zy25vG1ZBQA0jmo39q34au/sOnL/0d1A4w==", - "license": "MIT", - "dependencies": { - "@react-pdf/font": "^4.0.3", - "@react-pdf/primitives": "^4.1.1", - "@react-pdf/stylesheet": "^6.1.1" - } - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.1.tgz", - "integrity": "sha512-HjhlEREguAyBTGNzRlGNiDHGQ2EjLSPWwdhhpoEqHYy8hWak3Dp6/fU72OfqVsiMb8S6rbfPsWUF24fxpilrVA==", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^11.0.0", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.0.1.tgz", - "integrity": "sha512-naDCyggtcBWANtIrjQEajhhBEuL9b0Zg4zmlWK2CzS6xCWSE39/vvf4LqnMjUAWHBhot4m9MHCM/Z+mfWhUkiA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/@remirror/core-constants": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", - "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", - "license": "MIT" - }, - "node_modules/@replit/codemirror-lang-nix": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@replit/codemirror-lang-nix/-/codemirror-lang-nix-6.0.1.tgz", - "integrity": "sha512-lvzjoYn9nfJzBD5qdm3Ut6G3+Or2wEacYIDJ49h9+19WSChVnxv4ojf+rNmQ78ncuxIt/bfbMvDLMeMP0xze6g==", - "license": "MIT", - "peerDependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@replit/codemirror-lang-solidity": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@replit/codemirror-lang-solidity/-/codemirror-lang-solidity-6.0.2.tgz", - "integrity": "sha512-/dpTVH338KFV6SaDYYSadkB4bI/0B0QRF/bkt1XS3t3QtyR49mn6+2k0OUQhvt2ZSO7kt10J+OPilRAtgbmX0w==", - "license": "MIT", - "dependencies": { - "@lezer/highlight": "^1.2.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0" - } - }, - "node_modules/@replit/codemirror-lang-svelte": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@replit/codemirror-lang-svelte/-/codemirror-lang-svelte-6.0.0.tgz", - "integrity": "sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==", - "license": "MIT", - "peerDependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-css": "^6.0.1", - "@codemirror/lang-html": "^6.2.0", - "@codemirror/lang-javascript": "^6.1.1", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/javascript": "^1.2.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.15.0.tgz", - "integrity": "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@schummar/icu-type-parser": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/@schummar/icu-type-parser/-/icu-type-parser-1.21.5.tgz", - "integrity": "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==", - "license": "MIT" - }, - "node_modules/@shikijs/core": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.19.0.tgz", - "integrity": "sha512-L7SrRibU7ZoYi1/TrZsJOFAnnHyLTE1SwHG1yNWjZIVCqjOEmCSuK2ZO9thnRbJG6TOkPp+Z963JmpCNw5nzvA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.19.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.19.0.tgz", - "integrity": "sha512-ZfWJNm2VMhKkQIKT9qXbs76RRcT0SF/CAvEz0+RkpUDAoDaCx0uFdCGzSRiD9gSlhm6AHkjdieOBJMaO2eC1rQ==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.19.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.19.0.tgz", - "integrity": "sha512-1hRxtYIJfJSZeM5ivbUXv9hcJP3PWRo5prG/V2sWwiubUKTa+7P62d2qxCW8jiVFX4pgRHhnHNp+qeR7Xl+6kg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.19.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.19.0.tgz", - "integrity": "sha512-dBMFzzg1QiXqCVQ5ONc0z2ebyoi5BKz+MtfByLm0o5/nbUu3Iz8uaTCa5uzGiscQKm7lVShfZHU1+OG3t5hgwg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.19.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.19.0.tgz", - "integrity": "sha512-H36qw+oh91Y0s6OlFfdSuQ0Ld+5CgB/VE6gNPK+Hk4VRbVG/XQgkjnt4KzfnnoO6tZPtKJKHPjwebOCfjd6F8A==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.19.0" - } - }, - "node_modules/@shikijs/transformers": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.19.0.tgz", - "integrity": "sha512-e6vwrsyw+wx4OkcrDbL+FVCxwx8jgKiCoXzakVur++mIWVcgpzIi8vxf4/b4dVTYrV/nUx5RjinMf4tq8YV8Fw==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.19.0", - "@shikijs/types": "3.19.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.19.0.tgz", - "integrity": "sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@silevis/reactgrid": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@silevis/reactgrid/-/reactgrid-4.1.17.tgz", - "integrity": "sha512-ZsERvyRSR3j55xvHicSRLuca8NH5yakZklbpWj1AQ6mA2ht7YlQjVMQ94q7ZL7UcPSdgavxBIU4vtDrlYvaXeA==", - "license": "MIT", - "dependencies": { - "sass": "^1.62.1", - "tslib": "^2.5.2" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.2.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.2.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" - }, - "node_modules/@solid-primitives/event-listener": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/event-listener/-/event-listener-2.4.3.tgz", - "integrity": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/keyed": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/keyed/-/keyed-1.5.2.tgz", - "integrity": "sha512-BgoEdqPw48URnI+L5sZIHdF4ua4Las1eWEBBPaoSFs42kkhnHue+rwCBPL2Z9ebOyQ75sUhUfOETdJfmv0D6Kg==", - "license": "MIT", - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/map": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/@solid-primitives/map/-/map-0.4.13.tgz", - "integrity": "sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==", - "license": "MIT", - "dependencies": { - "@solid-primitives/trigger": "^1.1.0" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/media": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/media/-/media-2.3.3.tgz", - "integrity": "sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==", - "license": "MIT", - "dependencies": { - "@solid-primitives/event-listener": "^2.4.3", - "@solid-primitives/rootless": "^1.5.2", - "@solid-primitives/static-store": "^0.1.2", - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/props": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/props/-/props-3.2.2.tgz", - "integrity": "sha512-lZOTwFJajBrshSyg14nBMEP0h8MXzPowGO0s3OeiR3z6nXHTfj0FhzDtJMv+VYoRJKQHG2QRnJTgCzK6erARAw==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.1.2.tgz", - "integrity": "sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/resize-observer": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@solid-primitives/resize-observer/-/resize-observer-2.1.3.tgz", - "integrity": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==", - "license": "MIT", - "dependencies": { - "@solid-primitives/event-listener": "^2.4.3", - "@solid-primitives/rootless": "^1.5.2", - "@solid-primitives/static-store": "^0.1.2", - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/rootless": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/rootless/-/rootless-1.5.2.tgz", - "integrity": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/static-store": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.1.2.tgz", - "integrity": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/transition-group": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/transition-group/-/transition-group-1.1.2.tgz", - "integrity": "sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==", - "license": "MIT", - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/trigger": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/trigger/-/trigger-1.2.2.tgz", - "integrity": "sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==", - "license": "MIT", - "dependencies": { - "@solid-primitives/utils": "^6.3.2" - }, - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@solid-primitives/utils": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.3.2.tgz", - "integrity": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==", - "license": "MIT", - "peerDependencies": { - "solid-js": "^1.6.12" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@supabase/auth-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.87.0.tgz", - "integrity": "sha512-Otv/fjkyev9cH55VoZHwbzDd5N8y1SNREqDpzE8cqI2KnlHAkr0g6ZWv7d8elVKhS3le09xvAeRaoONGaRc8sA==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/functions-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.87.0.tgz", - "integrity": "sha512-L4Y6PD8gyeWMZeHXiwywICIJvEWnnwn8E3Z7V3Wn60/N+jDKMaRJlaCncPf8rhHzFuJlabqRiVEy5nCKjmAnXA==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/postgrest-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.87.0.tgz", - "integrity": "sha512-2+86Iyq9INVQE++L/kCWSoWApeoU4CVO6VKJrzaxGQGESylTVam5mqVqC0LQnjZ39kIKQgYmZ3yylXMmPNFHJQ==", - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.87.0.tgz", - "integrity": "sha512-38l2jg9yb9cMos3cVWuX9X+nMFZFzW8sD/MJiVvbpRes9gPZ210AMGExYU8/kix5uq/ymSoSsKLnV8DhXYWqOg==", - "license": "MIT", - "dependencies": { - "@types/phoenix": "^1.6.6", - "@types/ws": "^8.18.1", - "tslib": "2.8.1", - "ws": "^8.18.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/ssr": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@supabase/ssr/-/ssr-0.8.0.tgz", - "integrity": "sha512-/PKk8kNFSs8QvvJ2vOww1mF5/c5W8y42duYtXvkOSe+yZKRgTTZywYG2l41pjhNomqESZCpZtXuWmYjFRMV+dw==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.2" - }, - "peerDependencies": { - "@supabase/supabase-js": "^2.76.1" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.87.0.tgz", - "integrity": "sha512-luTghajY3IrrKglP5bjf2/51ASg5xaZUALsZuzR23RmuMg4lc4pzq4TxEgnkLoUGDT7Ppr9+uSgvIhf1snXbAw==", - "license": "MIT", - "dependencies": { - "iceberg-js": "^0.8.1", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.87.0.tgz", - "integrity": "sha512-4u8JtF8qPW1V1FEcfqeRFU/9LK6CNjuLpDcJOjL1npobMPFCQhCQsWCYBnRlyf3QN7o7LG5zSKFRsmk8wJK/+Q==", - "license": "MIT", - "dependencies": { - "@supabase/auth-js": "2.87.0", - "@supabase/functions-js": "2.87.0", - "@supabase/postgrest-js": "2.87.0", - "@supabase/realtime-js": "2.87.0", - "@supabase/storage-js": "2.87.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@swc/core": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.3.tgz", - "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.25" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.3", - "@swc/core-darwin-x64": "1.15.3", - "@swc/core-linux-arm-gnueabihf": "1.15.3", - "@swc/core-linux-arm64-gnu": "1.15.3", - "@swc/core-linux-arm64-musl": "1.15.3", - "@swc/core-linux-x64-gnu": "1.15.3", - "@swc/core-linux-x64-musl": "1.15.3", - "@swc/core-win32-arm64-msvc": "1.15.3", - "@swc/core-win32-ia32-msvc": "1.15.3", - "@swc/core-win32-x64-msvc": "1.15.3" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz", - "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz", - "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz", - "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz", - "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz", - "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz", - "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz", - "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz", - "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz", - "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz", - "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@swc/types": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", - "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@syncfusion/ej2-base": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-32.1.19.tgz", - "integrity": "sha512-kWxMNM/cZh6yHQlPM5Mrquqdf9SedNN1WBhscxFtlVsIdqqaZq8FNc2ofuMXFeohti/KaWct5jtzwKo+VFRrkw==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-icons": "~32.1.19" - }, - "bin": { - "syncfusion-license": "bin/syncfusion-license.js" - } - }, - "node_modules/@syncfusion/ej2-buttons": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-32.1.19.tgz", - "integrity": "sha512-Htq3nT/+UmodSeVHnySFc2OfLxUEv0fOkRuouLRFr3E/4nj7RdVoZDSjCI9IEHac9kBPC6Bs6Z4f7VdFjkT6OQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-calendars": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-32.1.20.tgz", - "integrity": "sha512-RqfwqEQ4xjnZv+lG9FEN2o+2y66W2MFuUKbAp3hPi6FY7oF5srXk054dRWKU5gOiIQPoq9tdTDCTqE42288hAQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-inputs": "~32.1.20", - "@syncfusion/ej2-lists": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-charts": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-charts/-/ej2-charts-32.1.19.tgz", - "integrity": "sha512-q9YkMTw4AEh8XcCo0HBFHEDGCV+McWq2gf8cPxKHCexcLF1iooRtG6CLSCmMb5Op0Fg4wIeIEEKcGYhf8iwoow==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-calendars": "~32.1.19", - "@syncfusion/ej2-data": "~32.1.19", - "@syncfusion/ej2-excel-export": "~32.1.19", - "@syncfusion/ej2-navigations": "~32.1.19", - "@syncfusion/ej2-pdf-export": "~32.1.19", - "@syncfusion/ej2-svg-base": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-compression": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-compression/-/ej2-compression-32.1.19.tgz", - "integrity": "sha512-EzCpNNRI/F2KQkD6mhrMcDiQ7pbY5GZik80EQctFXyF87Ov5nn9+8qfMr42gM5tTwKLBtCgFXpj4sIlkwY2gGA==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-file-utils": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-data": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-32.1.19.tgz", - "integrity": "sha512-/MeGbdM3TxesOS0zj8xUQ6dscD7KHU81yS7d5cT2h4L9H0DgmOMpvVBH3PP0cbDGjikch0nI36ghqyc2zNxUVg==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-dropdowns": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-32.1.20.tgz", - "integrity": "sha512-Q+f6kHOPlVMtkBdZYetduymjWGMjWyqemCra2oRmW+Tjob0g+IhMN4rC2sgnQG3ttNDBhg9rrl1LuiSHOp5RiQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-data": "~32.1.19", - "@syncfusion/ej2-inputs": "~32.1.20", - "@syncfusion/ej2-lists": "~32.1.19", - "@syncfusion/ej2-navigations": "~32.1.19", - "@syncfusion/ej2-notifications": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-excel-export": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-excel-export/-/ej2-excel-export-32.1.19.tgz", - "integrity": "sha512-BF05J1CJQTSFKe3u+bKM99t81N5Tbhe9y3B1LCKWKT7T6HOV5hPqQKxENeJpOiSttwimS89VCqsjmgK3XNGrPw==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-compression": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-file-utils": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-file-utils/-/ej2-file-utils-32.1.19.tgz", - "integrity": "sha512-B33eTLbuxU6fOAe7KjxdBvfonm835oXNWee140o3IEMHTk1BGj1xL5bKRS8uqmVkrmuH0JacHzBkVM2P4yYSvQ==", - "license": "SEE LICENSE IN license" - }, - "node_modules/@syncfusion/ej2-grids": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-32.1.20.tgz", - "integrity": "sha512-f0Ixqenb1E3e2TCCg+CmlrSw/HkjHEzsbSCatChw1303nmZ2fFSoosregdR/NupYzxfRAIHIIm3YMfDhhkMOIQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-calendars": "~32.1.20", - "@syncfusion/ej2-compression": "~32.1.19", - "@syncfusion/ej2-data": "~32.1.19", - "@syncfusion/ej2-dropdowns": "~32.1.20", - "@syncfusion/ej2-excel-export": "~32.1.19", - "@syncfusion/ej2-file-utils": "~32.1.19", - "@syncfusion/ej2-inputs": "~32.1.20", - "@syncfusion/ej2-lists": "~32.1.19", - "@syncfusion/ej2-navigations": "~32.1.19", - "@syncfusion/ej2-notifications": "~32.1.19", - "@syncfusion/ej2-pdf-export": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19", - "@syncfusion/ej2-splitbuttons": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-icons": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-32.1.19.tgz", - "integrity": "sha512-qZ0NNP0qWQ9EwkakpCwu27ECGEM5Db9dBscBvpZ2rmq1rDDi9d/8VEu6+EmFED5R6Sh3cGVJpI1izw9fsfsKmg==", - "license": "SEE LICENSE IN license" - }, - "node_modules/@syncfusion/ej2-inputs": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-32.1.20.tgz", - "integrity": "sha512-Q/i5ZLV2+OARcMcHHudHGvSFqG2wlMu6UA5hZAjoEqH/hPWdgnJiE0AZ92C6Ee1awHDlNAESW+VO3TlFRGTxKw==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19", - "@syncfusion/ej2-splitbuttons": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-lists": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-32.1.19.tgz", - "integrity": "sha512-uUwmASVpS3H52aXDNcyfJUljTcG1p1O90Bh6XPbKlXXJ38Np/y8b6kzwgTZgjSzk5OK+hhT6Cgz0QFGgskSeng==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-data": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-navigations": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-32.1.19.tgz", - "integrity": "sha512-eBPHbkQV0bAwiUJ4qvhh/6co6ElSu5oOaV/T0YlyphnedFU49vFb2CS34YhV5fuEXgq1yViIzbk1xsZTl1VHjg==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-data": "~32.1.19", - "@syncfusion/ej2-inputs": "~32.1.19", - "@syncfusion/ej2-lists": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-notifications": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-notifications/-/ej2-notifications-32.1.19.tgz", - "integrity": "sha512-fKuBAzHUk7HJV7x6QnA0820vIi9t1EcGfL9CxjTxpKMVhlxIXAo6SFWXGPE4cCbHd8VKnm0VTmezdSZIg95GPw==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-pdf-export": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-32.1.19.tgz", - "integrity": "sha512-uBaydsgjN1TcLIOBJw3SFXucfqxbP9+G6oZybkP96EyZIOKms7H2WkkB+zROgmsR2krGuRyDuJfhW8+tuL6zjA==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-compression": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-popups": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-32.1.19.tgz", - "integrity": "sha512-tLvUwroBP8nlnpX/TmBh9VgDckqnYAgv6weAqVYoS7KC7Osfm+FdB09I82d/448luzD9Vt5Cm51dumLLGjZ6sQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-buttons": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-react-base": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-base/-/ej2-react-base-32.1.20.tgz", - "integrity": "sha512-GQ9C/qdAmBdwEJr4Fg3332V/0HCVJ/7SrZEEHIkNi04lN33KJu6yyQ2plqVL0PyFcdjtd3v8oKNDnlhm21roTA==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-react-spreadsheet": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-spreadsheet/-/ej2-react-spreadsheet-32.1.20.tgz", - "integrity": "sha512-uuu1M+6LC5l6LdA+cpmFV2aOAc69N1rg5QVVogY991/PIIEba9CKK4OaNH77TkeUCrS5KkKtc/6vqBHinBveWA==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-react-base": "~32.1.20", - "@syncfusion/ej2-spreadsheet": "32.1.20" - } - }, - "node_modules/@syncfusion/ej2-splitbuttons": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-32.1.19.tgz", - "integrity": "sha512-KHG4DDBx+uK/eBIRLM+Saa17ScUK+gMj3h0+XQFeDrSynZhwOH9lxdCVUkjpW8lCjEdfKYy7xpe8fV5egNI/cA==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-popups": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-spreadsheet": { - "version": "32.1.20", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-spreadsheet/-/ej2-spreadsheet-32.1.20.tgz", - "integrity": "sha512-8wiBfMiOJOE4RHjbYjjZdepjDQs+wArCE7AgIhGO3tLQUGqPkzJNkkmKOsQ+4dyKWews9yr7QkBpIeyzX54dUQ==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19", - "@syncfusion/ej2-charts": "~32.1.19", - "@syncfusion/ej2-dropdowns": "~32.1.20", - "@syncfusion/ej2-grids": "~32.1.20", - "@syncfusion/ej2-navigations": "~32.1.19" - } - }, - "node_modules/@syncfusion/ej2-svg-base": { - "version": "32.1.19", - "resolved": "https://registry.npmjs.org/@syncfusion/ej2-svg-base/-/ej2-svg-base-32.1.19.tgz", - "integrity": "sha512-pXjstNDrGrte/rv17711N0IgYCy7gF9pKqEW/hVB8kQqazYLWRvt0Ni2qlFwVua0RQxHd7xmGRxVbS3OrS3r5w==", - "license": "SEE LICENSE IN license", - "dependencies": { - "@syncfusion/ej2-base": "~32.1.19" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", - "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.17" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", - "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-x64": "4.1.17", - "@tailwindcss/oxide-freebsd-x64": "4.1.17", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-x64-musl": "4.1.17", - "@tailwindcss/oxide-wasm32-wasi": "4.1.17", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", - "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", - "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", - "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", - "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", - "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", - "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", - "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", - "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", - "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", - "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.6.0", - "@emnapi/runtime": "^1.6.0", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.0.7", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", - "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", - "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", - "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.17", - "@tailwindcss/oxide": "4.1.17", - "postcss": "^8.4.41", - "tailwindcss": "4.1.17" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", - "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.90.12", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.12.tgz", - "integrity": "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/query-devtools": { - "version": "5.91.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.91.1.tgz", - "integrity": "sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.90.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.12.tgz", - "integrity": "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-query-devtools": { - "version": "5.91.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.1.tgz", - "integrity": "sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ==", - "license": "MIT", - "dependencies": { - "@tanstack/query-devtools": "5.91.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-query": "^5.90.10", - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-table": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", - "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", - "license": "MIT", - "dependencies": { - "@tanstack/table-core": "8.21.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@tanstack/table-core": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", - "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tiptap/core": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.13.0.tgz", - "integrity": "sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.13.0.tgz", - "integrity": "sha512-K1z/PAIIwEmiWbzrP//4cC7iG1TZknDlF1yb42G7qkx2S2X4P0NiqX7sKOej3yqrPjKjGwPujLMSuDnCF87QkQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.13.0.tgz", - "integrity": "sha512-VYiDN9EEwR6ShaDLclG8mphkb/wlIzqfk7hxaKboq1G+NSDj8PcaSI9hldKKtTCLeaSNu6UR5nkdu/YHdzYWTw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.13.0.tgz", - "integrity": "sha512-qZ3j2DBsqP9DjG2UlExQ+tHMRhAnWlCKNreKddKocb/nAFrPdBCtvkqIEu+68zPlbLD4ukpoyjUklRJg+NipFg==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.13.0.tgz", - "integrity": "sha512-fFQmmEUoPzRGiQJ/KKutG35ZX21GE+1UCDo8Q6PoWH7Al9lex47nvyeU1BiDYOhcTKgIaJRtEH5lInsOsRJcSA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-character-count": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-3.13.0.tgz", - "integrity": "sha512-gTj4NaCkEzt32JouvcfTOq3blldE+Qap4k5BPLhzRn+A/7NAiUQN5zwmoMv2strMpAwP0gyGnS46hJQ1e56yHw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.13.0.tgz", - "integrity": "sha512-sF5raBni6iSVpXWvwJCAcOXw5/kZ+djDHx1YSGWhopm4+fsj0xW7GvVO+VTwiFjZGKSw+K5NeAxzcQTJZd3Vhw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.13.0.tgz", - "integrity": "sha512-kIwfQ4iqootsWg9e74iYJK54/YMIj6ahUxEltjZRML5z/h4gTDcQt2eTpnEC8yjDjHeUVOR94zH9auCySyk9CQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-code-block-lowlight": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-3.13.0.tgz", - "integrity": "sha512-CesjEVUkDelSfRxauTkcrrVzzQAxEp5HYuGIXZtoFDmt2F2lYimlgJyvSxIbRqEw8sFQxvTEKlBg0EtF/BvCJg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/extension-code-block": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "highlight.js": "^11", - "lowlight": "^2 || ^3" - } - }, - "node_modules/@tiptap/extension-collaboration": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-3.13.0.tgz", - "integrity": "sha512-Ovi1z2gLMF5XO7uiD/bRxa6tX5dgFJ2aYF5vbfLci+4UeKWIFjn9tg0H5PU2A2c+BIOzlhLWA2YpPb2ucK7sSg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "@tiptap/y-tiptap": "^3.0.0", - "yjs": "^13" - } - }, - "node_modules/@tiptap/extension-color": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-3.13.0.tgz", - "integrity": "sha512-I+PTZ31p6GhCjUVpCh1qertTK6T07MVGuLm/LP+c14ByMoZ0L0nVgw0YbWhDqLYWbkI9davv0fuI3dQ0gKSPlA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-text-style": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-details": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-details/-/extension-details-3.13.0.tgz", - "integrity": "sha512-9uVaJ6EOzQLfQLFbAmgQ0XvgggUTFCyo0NorseNBvpHKD/XyJ+vZPd6qVRQ7bRxwNK2FTDluIHd8NqMPIbf3Nw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/extension-text-style": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.13.0.tgz", - "integrity": "sha512-RjU7hTJwjKXIdY57o/Pc+Yr8swLkrwT7PBQ/m+LCX5oO/V2wYoWCjoBYnK5KSHrWlNy/aLzC33BvLeqZZ9nzlQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.13.0.tgz", - "integrity": "sha512-m7GPT3c/83ni+bbU8c+3dpNa8ug+aQ4phNB1Q52VQG3oTonDJnZS7WCtn3lB/Hi1LqoqMtEHwhepU2eD+JeXqQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-emoji": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-emoji/-/extension-emoji-3.13.0.tgz", - "integrity": "sha512-MY+6ZPmDjqTzaP8XJVPQVKyiVuGIrZfnvmF3yIKA+h+dxBoNkfsbaoVKYGYrs/K93YLnxlzhxBLei8Phb3zZfQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.4.0", - "emojibase-data": "^15", - "is-emoji-supported": "^0.0.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "@tiptap/suggestion": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.13.0.tgz", - "integrity": "sha512-OsezV2cMofZM4c13gvgi93IEYBUzZgnu8BXTYZQiQYekz4bX4uulBmLa1KOA9EN71FzS+SoLkXHU0YzlbLjlxA==", - "license": "MIT", - "optional": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@floating-ui/dom": "^1.0.0", - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-font-family": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-3.13.0.tgz", - "integrity": "sha512-ZJ+P7qYK4dIRjncRibeYT1HI2P/blUe8/CWcmKJmp1e1DE9m6Q+jdllehNCr7a30yZzFxn9yJPJPDmHi5D3c0w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-text-style": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.13.0.tgz", - "integrity": "sha512-KVxjQKkd964nin+1IdM2Dvej/Jy4JTMcMgq5seusUhJ9T9P8F9s2D5Iefwgkps3OCzub/aF+eAsZe+1P5KSIgA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.13.0.tgz", - "integrity": "sha512-nH1OBaO+/pakhu+P1jF208mPgB70IKlrR/9d46RMYoYbqJTNf4KVLx5lHAOHytIhjcNg+MjyTfJWfkK+dyCCyg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.13.0.tgz", - "integrity": "sha512-8VKWX8waYPtUWN97J89em9fOtxNteh6pvUEd0htcOAtoxjt2uZjbW5N4lKyWhNKifZBrVhH2Cc2NUPuftCVgxw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-highlight": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-3.13.0.tgz", - "integrity": "sha512-VlXyO8gWhWd0W5ln4Qyr/P1RoAVZkk9ge0jjNsb1bOc078wuvufQ9f6DquMxx0WpcaCXy+DBQLE0GUUqoLvjsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-3.13.0.tgz", - "integrity": "sha512-uLQahZh5uPv0jlmVho3xPeleaRs7WaZ9lBl03I/cI9EMho9BmF38pXYghjSXUmcsUwsGy0dZbfmE3Skn8iUwxA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.13.0.tgz", - "integrity": "sha512-ZUFyORtjj22ib8ykbxRhWFQOTZjNKqOsMQjaAGof30cuD2DN5J5pMz7Haj2fFRtLpugWYH+f0Mi+WumQXC3hCw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-image": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.13.0.tgz", - "integrity": "sha512-223uzLUkIa1rkK7aQK3AcIXe6LbCtmnpVb7sY5OEp+LpSaSPyXwyrZ4A0EO1o98qXG68/0B2OqMntFtA9c5Fbw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.13.0.tgz", - "integrity": "sha512-XbVTgmzk1kgUMTirA6AGdLTcKHUvEJoh3R4qMdPtwwygEOe7sBuvKuLtF6AwUtpnOM+Y3tfWUTNEDWv9AcEdww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-link": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.13.0.tgz", - "integrity": "sha512-LuFPJ5GoL12GHW4A+USsj60O90pLcwUPdvEUSWewl9USyG6gnLnY/j5ZOXPYH7LiwYW8+lhq7ABwrDF2PKyBbA==", - "license": "MIT", - "dependencies": { - "linkifyjs": "^4.3.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-list": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.13.0.tgz", - "integrity": "sha512-MMFH0jQ4LeCPkJJFyZ77kt6eM/vcKujvTbMzW1xSHCIEA6s4lEcx9QdZMPpfmnOvTzeoVKR4nsu2t2qT9ZXzAw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.13.0.tgz", - "integrity": "sha512-63NbcS/XeQP2jcdDEnEAE3rjJICDj8y1SN1h/MsJmSt1LusnEo8WQ2ub86QELO6XnD3M04V03cY6Knf6I5mTkw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-list-keymap": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.13.0.tgz", - "integrity": "sha512-P+HtIa1iwosb1feFc8B/9MN5EAwzS+/dZ0UH0CTF2E4wnp5Z9OMxKl1IYjfiCwHzZrU5Let+S/maOvJR/EmV0g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-mathematics": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-mathematics/-/extension-mathematics-3.13.0.tgz", - "integrity": "sha512-26tJc+L0pkQhKcMZKlpUtDx/B8LSM5YitaxYbtsxN/fTLzznq+NkwK6VgxlNyseHEcpTxDzOw4jTkV0CDWo4mQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "katex": "^0.16.4" - } - }, - "node_modules/@tiptap/extension-mention": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-3.13.0.tgz", - "integrity": "sha512-JcZ9ItaaifurERewyydfj/s52MGcWsCxk5hYdkSohzwa8Ohw4yyghHWCuEl/kvLK+9KhjIDDr1jvAmfZ89I7Fg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "@tiptap/suggestion": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.13.0.tgz", - "integrity": "sha512-QuDyLzuK/3vCvx9GeKhgvHWrGECBzmJyAx6gli2HY+Iil7XicbfltV4nvhIxgxzpx3LDHLKzJN9pBi+2MzX60g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.13.0.tgz", - "integrity": "sha512-9csQde1i0yeZI5oQQ9e1GYNtGL2JcC2d8Fwtw9FsGC8yz2W0h+Fmk+3bc2kobbtO5LGqupSc1fKM8fAg5rSRDg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-placeholder": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.13.0.tgz", - "integrity": "sha512-Au4ktRBraQktX9gjSzGWyJV6kPof7+kOhzE8ej+rOMjIrHbx3DCHy1CJWftSO9BbqIyonjsFmm4nE+vjzZ3Z5Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.13.0.tgz", - "integrity": "sha512-VHhWNqTAMOfrC48m2FcPIZB0nhl6XHQviAV16SBc+EFznKNv9tQUsqQrnuQ2y6ZVfqq5UxvZ3hKF/JlN/Ff7xw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-subscript": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-3.13.0.tgz", - "integrity": "sha512-8Lq1ATTDUyolue42UbWXAotHPY4Y0r6pMTJyZ9Dqxbv5VrlBk6XeApkGwq6etBXMUsENJycLHlBk3PVqhzGrfw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-superscript": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-3.13.0.tgz", - "integrity": "sha512-ljeaxgPy85IyRCYItKtd23fKmKlHbABq/sP4QGZ5D0PRYX5jF1dt8SEVVkDaoUu7YATRVa7MKl/NzKmTuVStjQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-table": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.13.0.tgz", - "integrity": "sha512-LcH9KE4QBUJ6IPwt1Uo5iU7zatFjUUvXbctIu2fKQ9nqJ7nNSFxRhkNyporVFkTWYH7/rb0qMoF1VxSUGefG5w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-task-item": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.13.0.tgz", - "integrity": "sha512-4+IkwoKchHQSxzEtVgpjSTJ/ey++Vf9WFiaY0o1ijmvQ7XvvXv4ZvO7uJrawShCIf0tmA56fjuMcZc5qJITQKQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-task-list": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.13.0.tgz", - "integrity": "sha512-oqJrLR3yKlSwDDr6CCF27g2bDybFcvkTyn/HReFpteziGeQs2DWJ5sY+tSWX1eKhnTnZbEjG5G/oie/vJqIIow==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.13.0.tgz", - "integrity": "sha512-VcZIna93rixw7hRkHGCxDbL3kvJWi80vIT25a2pXg0WP1e7Pi3nBYvZIL4SQtkbBCji9EHrbZx3p8nNPzfazYw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-text-align": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.13.0.tgz", - "integrity": "sha512-hebIus9tdXWb+AmhO+LTeUxZLdb0tqwdeaL/0wYxJQR5DeCTlJe6huXacMD/BkmnlEpRhxzQH0FrmXAd0d4Wgg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-text-style": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.13.0.tgz", - "integrity": "sha512-M7ob3pfYNYgFPihncEp33r9477hXQgC8j3iU8BsewvPlSx2bMSy5jp2XHDXyEX8dV6flr7acH4GkXXw+DHpaPA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-typography": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.13.0.tgz", - "integrity": "sha512-Pvxc0Mu3fIgcqOVpU5DqK55F+/ShvX020HmbsPY+Z7SED9fkan5QVn3n2nm13A2TQ+RWDlPAnHe7Gh0d/KsL5Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-underline": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.13.0.tgz", - "integrity": "sha512-VDQi+UYw0tFnfghpthJTFmtJ3yx90kXeDwFvhmT8G+O+si5VmP05xYDBYBmYCix5jqKigJxEASiBL0gYOgMDEg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extension-youtube": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-youtube/-/extension-youtube-3.13.0.tgz", - "integrity": "sha512-KG6NtdpK9VheacN4imjhDJ8G1V2tJZd/LRr+QID8dYEMQe9vKbqIXgA0kO91t+f+iH8NwgNPmi3a/BQogvoqJg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0" - } - }, - "node_modules/@tiptap/extensions": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.13.0.tgz", - "integrity": "sha512-i7O0ptSibEtTy+2PIPsNKEvhTvMaFJg1W4Oxfnbuxvaigs7cJV9Q0lwDUcc7CPsNw2T1+44wcxg431CzTvdYoA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.13.0.tgz", - "integrity": "sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==", - "license": "MIT", - "dependencies": { - "prosemirror-changeset": "^2.3.0", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.1", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.24.1", - "prosemirror-schema-basic": "^1.2.3", - "prosemirror-schema-list": "^1.5.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.38.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/react": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.13.0.tgz", - "integrity": "sha512-VqpqNZ9qtPr3pWK4NsZYxXgLSEiAnzl6oS7tEGmkkvJbcGSC+F7R13Xc9twv/zT5QCLxaHdEbmxHbuAIkrMgJQ==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "fast-equals": "^5.3.3", - "use-sync-external-store": "^1.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "optionalDependencies": { - "@tiptap/extension-bubble-menu": "^3.13.0", - "@tiptap/extension-floating-menu": "^3.13.0" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "@types/react-dom": "^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" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.13.0.tgz", - "integrity": "sha512-Ojn6sRub04CRuyQ+9wqN62JUOMv+rG1vXhc2s6DCBCpu28lkCMMW+vTe7kXJcEdbot82+5swPbERw9vohswFzg==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/extension-blockquote": "^3.13.0", - "@tiptap/extension-bold": "^3.13.0", - "@tiptap/extension-bullet-list": "^3.13.0", - "@tiptap/extension-code": "^3.13.0", - "@tiptap/extension-code-block": "^3.13.0", - "@tiptap/extension-document": "^3.13.0", - "@tiptap/extension-dropcursor": "^3.13.0", - "@tiptap/extension-gapcursor": "^3.13.0", - "@tiptap/extension-hard-break": "^3.13.0", - "@tiptap/extension-heading": "^3.13.0", - "@tiptap/extension-horizontal-rule": "^3.13.0", - "@tiptap/extension-italic": "^3.13.0", - "@tiptap/extension-link": "^3.13.0", - "@tiptap/extension-list": "^3.13.0", - "@tiptap/extension-list-item": "^3.13.0", - "@tiptap/extension-list-keymap": "^3.13.0", - "@tiptap/extension-ordered-list": "^3.13.0", - "@tiptap/extension-paragraph": "^3.13.0", - "@tiptap/extension-strike": "^3.13.0", - "@tiptap/extension-text": "^3.13.0", - "@tiptap/extension-underline": "^3.13.0", - "@tiptap/extensions": "^3.13.0", - "@tiptap/pm": "^3.13.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/suggestion": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.13.0.tgz", - "integrity": "sha512-IXNvyLITpPiuXHn/q1ntztPYJZMFjPAokKj+OQz3MFNYlzAX3I409KD/EwwCubisRIAFiNX0ZjIIXxxZ3AhFTw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/canvas-confetti": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.9.0.tgz", - "integrity": "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/color/-/color-4.2.0.tgz", - "integrity": "sha512-6+xrIRImMtGAL2X3qYkd02Mgs+gFGs+WsK0b7VVMaO4mYRISwyTjcqNrO0mNSmYEoq++rSLDB2F5HDNmqfOe+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/color-convert": "*" - } - }, - "node_modules/@types/color-convert": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.4.tgz", - "integrity": "sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/color-name": "^1.1.0" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.5.tgz", - "integrity": "sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/colorthief": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/colorthief/-/colorthief-2.6.0.tgz", - "integrity": "sha512-GZBHPzkgEsyZqO7a9rhqkcW2BJZW+UpRlIUorY8vfOk7BVFVZMuDvZRPyaExv7ML0DaeB/t78PUOTkGo/THDpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/diff": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.2.tgz", - "integrity": "sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/jju": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@types/jju/-/jju-1.4.5.tgz", - "integrity": "sha512-5Yx4wOq3X+xArOlyZcuAK1Pli4vW0E6nQ6UC8jWdbcY5OlBsoElFTOf4kggYKls/NCHdShAK6UR8NRSQARUNfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jszip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz", - "integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==", - "license": "MIT", - "dependencies": { - "jszip": "*" - } - }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/mustache": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.6.tgz", - "integrity": "sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==", - "license": "MIT" - }, - "node_modules/@types/ndarray": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/ndarray/-/ndarray-1.0.14.tgz", - "integrity": "sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/pako": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", - "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", - "license": "MIT" - }, - "node_modules/@types/papaparse": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.1.tgz", - "integrity": "sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/phoenix": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", - "license": "MIT" - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/raf": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", - "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.32.3.tgz", - "integrity": "sha512-cMi5ZrLG7UtbL7LTK6hq9w/EZIRk4Mf1Z5qHoI+qBh7/WkYkFXQ7gOto2yfUvPzF5ERMAhaXS5eTQ2SAnHjLzA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/turndown": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz", - "integrity": "sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", - "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/type-utils": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.48.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", - "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", - "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.1", - "@typescript-eslint/types": "^8.48.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", - "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", - "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", - "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", - "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", - "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.48.1", - "@typescript-eslint/tsconfig-utils": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", - "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", - "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.3.tgz", - "integrity": "sha512-F1doRyD50CWScwGHG2bBUtUpwnOv/zqSnzkZqJcX5YAHQx6Z1CuX8jdnFMH6qktRrPU1tfpNYftTWu3QIoHiMA==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/autocomplete": ">=6.0.0", - "@codemirror/commands": ">=6.0.0", - "@codemirror/language": ">=6.0.0", - "@codemirror/lint": ">=6.0.0", - "@codemirror/search": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-extensions-langs": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-langs/-/codemirror-extensions-langs-4.25.3.tgz", - "integrity": "sha512-+7wuRZ9ZHXVlgaIuuSOSqLmEykeLQvg8EXfDAzM+HBQY7A/dLPKiZhUH5MbnpJk/CxfkS6wk3SumkV5JBnxbpw==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/language-data": "^6.5.1", - "@replit/codemirror-lang-nix": "^6.0.1", - "@replit/codemirror-lang-solidity": "^6.0.1", - "@replit/codemirror-lang-svelte": "^6.0.0", - "codemirror-lang-mermaid": "^0.5.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/language-data": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-theme-vscode": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.25.3.tgz", - "integrity": "sha512-4bKsR1P3Lit/ycJKIOeK1/w28Y8oxhGekLxQw93/2CYXH/B/MyUs1y1vmGCCL5Cq1qIZ+w2nFvXbZYELKFiwXw==", - "license": "MIT", - "dependencies": { - "@uiw/codemirror-themes": "4.25.3" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-theme-xcode": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-xcode/-/codemirror-theme-xcode-4.25.3.tgz", - "integrity": "sha512-nv3XWEpszoJ3XkgMTkDTgVzNbTQ7HPoG6Lx0Rsu1otvvWVYxq34wygdBm2pLd2ZxCzCbNM7KsQS5BGD0ZwiJvA==", - "license": "MIT", - "dependencies": { - "@uiw/codemirror-themes": "4.25.3" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-themes": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.3.tgz", - "integrity": "sha512-k7/B7Vf4jU/WcdewgJWP9tMFxbjB6UpUymZ3fx/TsbGwt2JXAouw0uyqCn1RlYBfr7YQnvEs3Ju9ECkd2sKzdg==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/react-codemirror": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.3.tgz", - "integrity": "sha512-1wtBZTXPIp8u6F/xjHvsUAYlEeF5Dic4xZBnqJyLzv7o7GjGYEUfSz9Z7bo9aK9GAx2uojG/AuBMfhA4uhvIVQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@codemirror/commands": "^6.1.0", - "@codemirror/state": "^6.1.1", - "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.25.3", - "codemirror": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@babel/runtime": ">=7.11.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/theme-one-dark": ">=6.0.0", - "@codemirror/view": ">=6.0.0", - "codemirror": ">=6.0.0", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@usebasejump/shared": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@usebasejump/shared/-/shared-0.0.3.tgz", - "integrity": "sha512-qO9AnKnt5ALvMylnnlTuePrNM+cVs5aCbylzFfMN8ZgCOARWuir5PzZxB3CAVdtDzJpSYioLghYF0kaX1ryAZQ==", - "license": "MIT" - }, - "node_modules/@vercel/analytics": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz", - "integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==", - "license": "MPL-2.0", - "peerDependencies": { - "@remix-run/react": "^2", - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@remix-run/react": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-router": { - "optional": true - } - } - }, - "node_modules/@vercel/edge-config": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@vercel/edge-config/-/edge-config-1.4.3.tgz", - "integrity": "sha512-8vTDATodRrH49wMzKEjZ8/5H2qs1aPkD0uRK585f/Fx4YN2wfHfY/3td9OFrh+gdnCq07z8A5f0hoY6xhBcPkg==", - "license": "Apache-2.0", - "dependencies": { - "@vercel/edge-config-fs": "0.1.0" - }, - "engines": { - "node": ">=14.6" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0", - "next": ">=1" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "next": { - "optional": true - } - } - }, - "node_modules/@vercel/edge-config-fs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@vercel/edge-config-fs/-/edge-config-fs-0.1.0.tgz", - "integrity": "sha512-NRIBwfcS0bUoUbRWlNGetqjvLSwgYH/BqKqDN7vK1g32p7dN96k0712COgaz6VFizAm9b0g6IG6hR6+hc0KCPg==", - "license": "Apache-2.0" - }, - "node_modules/@vercel/speed-insights": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.3.1.tgz", - "integrity": "sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==", - "license": "Apache-2.0", - "peerDependencies": { - "@sveltejs/kit": "^1 || ^2", - "next": ">= 13", - "react": "^18 || ^19 || ^19.0.0-rc", - "svelte": ">= 4", - "vue": "^3", - "vue-router": "^4" - }, - "peerDependenciesMeta": { - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "svelte": { - "optional": true - }, - "vue": { - "optional": true - }, - "vue-router": { - "optional": true - } - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xterm/addon-fit": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", - "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", - "license": "MIT", - "peerDependencies": { - "@xterm/xterm": "^5.0.0" - } - }, - "node_modules/@xterm/addon-web-links": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.11.0.tgz", - "integrity": "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==", - "license": "MIT", - "peerDependencies": { - "@xterm/xterm": "^5.0.0" - } - }, - "node_modules/@xterm/xterm": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", - "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", - "license": "MIT" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abs-svg-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ajv": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.4.tgz", - "integrity": "sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-styles/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "license": "MIT" - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", - "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.0.tgz", - "integrity": "sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.3" - }, - "engines": { - "node": "^18.12.0 || >= 20.9.0" - } - }, - "node_modules/canvas-confetti": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.4.tgz", - "integrity": "sha512-yxQbJkAVrFXWNbTUjPqjF7G+g6pDotOUHGbkZq2NELZUMDpiJ85rIEazVb8GTaAptNW2miJAXbs1BtioA251Pw==", - "license": "ISC", - "funding": { - "type": "donate", - "url": "https://www.paypal.me/kirilvatev" - } - }, - "node_modules/canvg": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", - "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chart.js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", - "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", - "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", - "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", - "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", - "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", - "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", - "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "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 - } - } - }, - "node_modules/cobe": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cobe/-/cobe-0.6.5.tgz", - "integrity": "sha512-MA8bu81EFY6JjQpj+FovEuhyJ25khx2Q7Lh+ot/UkCJe5yKyDgzdc6u2lGZIOmsZTXK6Itg1i4lQZIJZbPWnAg==", - "license": "MIT", - "dependencies": { - "phenomenon": "^1.6.0" - } - }, - "node_modules/codemirror": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", - "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/codemirror-lang-mermaid": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/codemirror-lang-mermaid/-/codemirror-lang-mermaid-0.5.0.tgz", - "integrity": "sha512-Taw/2gPCyNArQJCxIP/HSUif+3zrvD+6Ugt7KJZ2dUKou/8r3ZhcfG8krNTZfV2iu8AuGnymKuo7bLPFyqsh/A==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.9.0", - "@lezer/highlight": "^1.1.6", - "@lezer/lr": "^1.3.10" - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/color-bits": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-bits/-/color-bits-1.1.1.tgz", - "integrity": "sha512-KOU0xOussQ1b7jDqEb2wx89ZGdCepRI30c0LZRUrjcb6zS0sgfxYt0UmocvG6EhTvbraJZQjZZn7wN10tFWgjg==", - "license": "ISC" - }, - "node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-string/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color/node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/colorthief": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/colorthief/-/colorthief-2.6.0.tgz", - "integrity": "sha512-yL3B7laeOr4kH9XasFF5rl+9Taz+Pmt/CRbaTI6XepZFyQvk4K/abaGKIAsngVpxKkgFeoJ2IwdRpS228icrig==", - "license": "MIT", - "dependencies": { - "@lokesh.dhakar/quantize": "^1.4.0", - "file-type": "^16.5.3", - "ndarray-pixels": "^4.1.0", - "sharp": "^0.33.5" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/comment-json": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", - "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "core-util-is": "^1.0.3", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/core-js": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", - "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/country-flag-icons": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.6.4.tgz", - "integrity": "sha512-Z3Zi419FI889tlElMsVhCIS5eRkiLDWixr576J5DPiTe5RGxpbRi+enMpHdYVp5iK5WFjr8P/RgyIFAGhFsiFg==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==", - "license": "MIT", - "dependencies": { - "uniq": "^1.0.0" - } - }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", - "license": "MIT" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.266", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", - "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "license": "MIT" - }, - "node_modules/emojibase-data": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/emojibase-data/-/emojibase-data-15.3.2.tgz", - "integrity": "sha512-TpDyTDDTdqWIJixV5sTA6OQ0P0JfIIeK2tFRR3q56G9LK65ylAZ7z3KyBXokpvTTJ+mLUXQXbLNyVkjvnTLE+A==", - "license": "MIT", - "funding": { - "type": "ko-fi", - "url": "https://ko-fi.com/milesjohnson" - }, - "peerDependencies": { - "emojibase": "*" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", - "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-toolkit": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", - "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.2.2.tgz", - "integrity": "sha512-g34RI7RFS4HybYFwGa/okj+8WZM+/fy+pEM+aqRQoVvM4gQhKrd4wIEddKmlZfWD75j8LTwB5zwkmNv3DceH1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.2.2", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-polyfill": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz", - "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==", - "license": "MIT" - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extract-colors": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/extract-colors/-/extract-colors-4.2.1.tgz", - "integrity": "sha512-QAWcuwxnL9pisK7YfuG8qab6IF7UD6bbKTjiM+QTJ9Xvfi7fBymQd/xTFaPhkzkB5kyq+wla3AHanM7LInFLaQ==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-equals": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", - "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-png": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", - "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", - "license": "MIT", - "dependencies": { - "@types/pako": "^2.0.3", - "iobuffer": "^5.3.2", - "pako": "^2.1.0" - } - }, - "node_modules/fast-png/node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "license": "MIT", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flags": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/flags/-/flags-4.0.2.tgz", - "integrity": "sha512-qNMPc10TKe/5pA0evWxS0vDm3AMpicB7uf6e/+828chNAWUoVziRJfyOcBWwadl4zBhmTfPz+hxTVpNKF7+/PA==", - "license": "MIT", - "dependencies": { - "@edge-runtime/cookies": "^5.0.2", - "jose": "^5.2.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0", - "@sveltejs/kit": "*", - "next": "*", - "react": "*", - "react-dom": "*" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fontkit": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", - "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", - "license": "MIT", - "dependencies": { - "@swc/helpers": "^0.5.12", - "brotli": "^1.3.2", - "clone": "^2.1.2", - "dfa": "^1.2.0", - "fast-deep-equal": "^3.1.3", - "restructure": "^3.0.0", - "tiny-inflate": "^1.0.3", - "unicode-properties": "^1.4.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "12.23.25", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", - "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.23.23", - "motion-utils": "^12.23.6", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/geist": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/geist/-/geist-1.5.1.tgz", - "integrity": "sha512-mAHZxIsL2o3ZITFaBVFBnwyDOw+zNLYum6A6nIjpzCGIO8QtC3V76XF2RnZTyLx1wlDTmMDy8jg3Ib52MIjGvQ==", - "license": "SIL OPEN FONT LICENSE", - "peerDependencies": { - "next": ">=13.2.0" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/gsap": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.0.tgz", - "integrity": "sha512-S/xb2okPzwk6ASjhQGo3jPs2/lDdQWXjnF5VdDiFGOelbbWtNHOi7uZKyNfFgHyfd2D0O9mgNyZQvzU1uuRFBQ==", - "license": "Standard 'no charge' license: https://gsap.com/standard-license." - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hast/-/hast-1.0.0.tgz", - "integrity": "sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==", - "deprecated": "Renamed to rehype", - "license": "MIT" - }, - "node_modules/hast-util-from-dom": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", - "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", - "license": "ISC", - "dependencies": { - "@types/hast": "^3.0.0", - "hastscript": "^9.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", - "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-dom": "^5.0.0", - "hast-util-from-html": "^2.0.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-sanitize": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "unist-util-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hey-listen": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hjson": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/hjson/-/hjson-3.2.2.tgz", - "integrity": "sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==", - "license": "MIT", - "bin": { - "hjson": "bin/hjson" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/hsl-to-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz", - "integrity": "sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==", - "license": "MIT", - "dependencies": { - "hsl-to-rgb-for-reals": "^1.1.0" - } - }, - "node_modules/hsl-to-rgb-for-reals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz", - "integrity": "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==", - "license": "ISC" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "license": "MIT", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/html2pdf.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.10.3.tgz", - "integrity": "sha512-RcB1sh8rs5NT3jgbN5zvvTmkmZrsUrxpZ/RI8TMbvuReNZAdJZG5TMfA2TBP6ZXxpXlWf9NB/ciLXVb6W2LbRQ==", - "license": "MIT", - "dependencies": { - "es6-promise": "^4.2.5", - "html2canvas": "^1.0.0", - "jspdf": "^3.0.0" - } - }, - "node_modules/hyphen": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/hyphen/-/hyphen-1.10.6.tgz", - "integrity": "sha512-fXHXcGFTXOvZTSkPJuGOQf5Lv5T/R2itiiCVPg9LxAje5D00O0pP83yJShFq5V89Ly//Gt6acj7z8pbBr34stw==", - "license": "ISC" - }, - "node_modules/iceberg-js": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", - "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/immer": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", - "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/input-format": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/input-format/-/input-format-0.3.14.tgz", - "integrity": "sha512-gHMrgrbCgmT4uK5Um5eVDUohuV9lcs95ZUUN9Px2Y0VIfjTzT2wF8Q3Z4fwLFm7c5Z2OXCm53FHoovj6SlOKdg==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">=18.1.0", - "react-dom": ">=18.1.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/intl-messageformat": { - "version": "10.7.18", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz", - "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==", - "license": "BSD-3-Clause", - "dependencies": { - "@formatjs/ecma402-abstract": "2.3.6", - "@formatjs/fast-memoize": "2.2.7", - "@formatjs/icu-messageformat-parser": "2.11.4", - "tslib": "^2.8.0" - } - }, - "node_modules/iobuffer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", - "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", - "license": "MIT" - }, - "node_modules/iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==", - "license": "MIT" - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "license": "MIT" - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-emoji-supported": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/is-emoji-supported/-/is-emoji-supported-0.0.5.tgz", - "integrity": "sha512-WOlXUhDDHxYqcSmFZis+xWhhqXiK2SU0iYiqmth5Ip0FHLZQAt9rKL5ahnilE8/86WH8tZ3bmNNNC+bTzamqlw==", - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "license": "MIT" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", - "license": "MIT", - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/its-fine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", - "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.9" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/jay-peg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jay-peg/-/jay-peg-1.1.1.tgz", - "integrity": "sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==", - "license": "MIT", - "dependencies": { - "restructure": "^3.0.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "license": "MIT" - }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonrepair": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.13.1.tgz", - "integrity": "sha512-WJeiE0jGfxYmtLwBTEk8+y/mYcaleyLXWaqp5bJu0/ZTSeG0KQq/wWQ8pmnkKenEdN6pdnn6QtcoSUkbqDHWNw==", - "license": "ISC", - "bin": { - "jsonrepair": "bin/cli.js" - } - }, - "node_modules/jspdf": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.4.tgz", - "integrity": "sha512-dc6oQ8y37rRcHn316s4ngz/nOjayLF/FFxBF4V9zamQKRqXxyiH1zagkCdktdWhtoQId5K20xt1lB90XzkB+hQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.28.4", - "fast-png": "^6.2.0", - "fflate": "^0.8.1" - }, - "optionalDependencies": { - "canvg": "^3.0.11", - "core-js": "^3.6.0", - "dompurify": "^3.2.4", - "html2canvas": "^1.0.0-rc.5" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/katex": { - "version": "0.16.27", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", - "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/konva": { - "version": "9.3.22", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.22.tgz", - "integrity": "sha512-yQI5d1bmELlD/fowuyfOp9ff+oamg26WOCkyqUyc+nczD/lhRa3EvD2MZOoc4c1293TAubW9n34fSQLgSeEgSw==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT" - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lib0": { - "version": "0.2.114", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz", - "integrity": "sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==", - "license": "MIT", - "dependencies": { - "isomorphic.js": "^0.2.4" - }, - "bin": { - "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", - "0gentesthtml": "bin/gentesthtml.js", - "0serve": "bin/0serve.js" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.31", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz", - "integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/linebreak": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", - "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", - "license": "MIT", - "dependencies": { - "base64-js": "0.0.8", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/linebreak/node_modules/base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/linkifyjs": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", - "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", - "license": "MIT" - }, - "node_modules/liquid-glass-react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/liquid-glass-react/-/liquid-glass-react-1.1.1.tgz", - "integrity": "sha512-pKzaktaMAEztd93wpWcz2Z5Z9qdLJUNJdMX+n00Ca4XsnrLTQ5xJzm/+GQXZUeuFXe/PQ8ziVMZO6531PyaFJw==", - "license": "MIT", - "workspaces": [ - "liquid-glass" - ], - "peerDependencies": { - "react": ">=19", - "react-dom": ">=19" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lottie-react": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", - "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", - "license": "MIT", - "dependencies": { - "lottie-web": "^5.10.2" - }, - "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" - } - }, - "node_modules/lottie-web": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", - "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", - "license": "MIT" - }, - "node_modules/lowlight": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", - "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "highlight.js": "~11.11.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lucide-react": { - "version": "0.479.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.479.0.tgz", - "integrity": "sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.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.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", - "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "longest-streak": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "license": "MIT" - }, - "node_modules/media-engine": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz", - "integrity": "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==", - "license": "MIT" - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge-refs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", - "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", - "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/mermaid/node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mermaid/node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-cjk-friendly": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly/-/micromark-extension-cjk-friendly-1.2.3.tgz", - "integrity": "sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==", - "license": "MIT", - "dependencies": { - "devlop": "^1.1.0", - "micromark-extension-cjk-friendly-util": "2.1.1", - "micromark-util-chunked": "^2.0.1", - "micromark-util-resolve-all": "^2.0.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "micromark": "^4.0.0", - "micromark-util-types": "^2.0.0" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-cjk-friendly-gfm-strikethrough": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-gfm-strikethrough/-/micromark-extension-cjk-friendly-gfm-strikethrough-1.2.3.tgz", - "integrity": "sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==", - "license": "MIT", - "dependencies": { - "devlop": "^1.1.0", - "get-east-asian-width": "^1.3.0", - "micromark-extension-cjk-friendly-util": "2.1.1", - "micromark-util-character": "^2.1.1", - "micromark-util-chunked": "^2.0.1", - "micromark-util-resolve-all": "^2.0.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "micromark": "^4.0.0", - "micromark-util-types": "^2.0.0" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-cjk-friendly-util": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-cjk-friendly-util/-/micromark-extension-cjk-friendly-util-2.1.1.tgz", - "integrity": "sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "micromark-util-character": "^2.1.1", - "micromark-util-symbol": "^2.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependenciesMeta": { - "micromark-util-types": { - "optional": true - } - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/motion-dom": { - "version": "12.23.23", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", - "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.23.6" - } - }, - "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "license": "MIT", - "dependencies": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "node_modules/ndarray-ops": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", - "integrity": "sha512-BppWAFRjMYF7N/r6Ie51q6D4fs0iiGmeXIACKY66fLpnwIui3Wc3CXiD/30mgLbDjPpSLrsqcp3Z62+IcHZsDw==", - "license": "MIT", - "dependencies": { - "cwise-compiler": "^1.0.0" - } - }, - "node_modules/ndarray-pixels": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ndarray-pixels/-/ndarray-pixels-4.1.0.tgz", - "integrity": "sha512-xKPI4zXJ2pkUcVX24zIN1AWqqPWvRWWhRuO6PlY4EdB2VNRauNwA6rDdsAQG/ldQp0sU7nTXgPR/io1duy3Zyg==", - "license": "MIT", - "dependencies": { - "@types/ndarray": "^1.0.14", - "ndarray": "^1.0.19", - "ndarray-ops": "^1.2.2", - "sharp": "^0.33.4" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", - "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", - "license": "MIT", - "dependencies": { - "@next/env": "15.5.7", - "@swc/helpers": "0.5.15", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.7", - "@next/swc-darwin-x64": "15.5.7", - "@next/swc-linux-arm64-gnu": "15.5.7", - "@next/swc-linux-arm64-musl": "15.5.7", - "@next/swc-linux-x64-gnu": "15.5.7", - "@next/swc-linux-x64-musl": "15.5.7", - "@next/swc-win32-arm64-msvc": "15.5.7", - "@next/swc-win32-x64-msvc": "15.5.7", - "sharp": "^0.34.3" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-intl": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.5.8.tgz", - "integrity": "sha512-BdN6494nvt09WtmW5gbWdwRhDDHC/Sg7tBMhN7xfYds3vcRCngSDXat81gmJkblw9jYOv8zXzzFJyu5VYXnJzg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/amannn" - } - ], - "license": "MIT", - "dependencies": { - "@formatjs/intl-localematcher": "^0.5.4", - "@swc/core": "^1.15.2", - "negotiator": "^1.0.0", - "next-intl-swc-plugin-extractor": "^4.5.8", - "po-parser": "^1.0.2", - "use-intl": "^4.5.8" - }, - "peerDependencies": { - "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/next-intl-swc-plugin-extractor": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/next-intl-swc-plugin-extractor/-/next-intl-swc-plugin-extractor-4.5.8.tgz", - "integrity": "sha512-hscCKUv+5GQ0CCNbvqZ8gaxnAGToCgDTbL++jgCq8SCk/ljtZDEeQZcMk46Nm6Ynn49Q/JKF4Npo/Sq1mpbusA==", - "license": "MIT" - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/next/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/next/node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/next/node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/next/node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/node-abi": { - "version": "3.85.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", - "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "license": "MIT" - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-svg-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", - "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", - "license": "MIT", - "dependencies": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } - }, - "node_modules/npm": { - "version": "11.6.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.6.4.tgz", - "integrity": "sha512-ERjKtGoFpQrua/9bG0+h3xiv/4nVdGViCjUYA1AmlV24fFvfnSB7B7dIfZnySQ1FDLd0ZVrWPsLLp78dCtJdRQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/metavuln-calculator", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which" - ], - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.1.8", - "@npmcli/config": "^10.4.4", - "@npmcli/fs": "^5.0.0", - "@npmcli/map-workspaces": "^5.0.3", - "@npmcli/metavuln-calculator": "^9.0.3", - "@npmcli/package-json": "^7.0.4", - "@npmcli/promise-spawn": "^9.0.1", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.3", - "@sigstore/tuf": "^4.0.0", - "abbrev": "^4.0.0", - "archy": "~1.0.0", - "cacache": "^20.0.3", - "chalk": "^5.6.2", - "ci-info": "^4.3.1", - "cli-columns": "^4.0.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^13.0.0", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.2", - "ini": "^6.0.0", - "init-package-json": "^8.2.4", - "is-cidr": "^6.0.1", - "json-parse-even-better-errors": "^5.0.0", - "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.0.11", - "libnpmexec": "^10.1.10", - "libnpmfund": "^7.0.11", - "libnpmorg": "^8.0.1", - "libnpmpack": "^9.0.11", - "libnpmpublish": "^11.1.3", - "libnpmsearch": "^9.0.1", - "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.3", - "minimatch": "^10.1.1", - "minipass": "^7.1.1", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^12.1.0", - "nopt": "^9.0.0", - "npm-audit-report": "^7.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.2", - "npm-pick-manifest": "^11.0.3", - "npm-profile": "^12.0.1", - "npm-registry-fetch": "^19.1.1", - "npm-user-validate": "^4.0.0", - "p-map": "^7.0.4", - "pacote": "^21.0.4", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.1.0", - "qrcode-terminal": "^0.12.0", - "read": "^5.0.1", - "semver": "^7.7.3", - "spdx-expression-parse": "^4.0.0", - "ssri": "^13.0.0", - "supports-color": "^10.2.2", - "tar": "^7.5.2", - "text-table": "~0.2.0", - "tiny-relative-date": "^2.0.2", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^7.0.0", - "which": "^6.0.0" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.1.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/query": "^5.0.0", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.0", - "bin-links": "^6.0.0", - "cacache": "^20.0.1", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^9.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^11.2.1", - "minimatch": "^10.0.3", - "nopt": "^9.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.0", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "pacote": "^21.0.2", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.0.0", - "proggy": "^4.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "semver": "^7.3.7", - "ssri": "^13.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^4.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.4.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "ini": "^6.0.0", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", - "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "5.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "glob": "^13.0.0", - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^20.0.0", - "json-parse-even-better-errors": "^5.0.0", - "pacote": "^21.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "10.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "4.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.0.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.0.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "proc-log": "^6.0.0", - "read-cmd-shim": "^6.0.0", - "write-file-atomic": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "20.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.6.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "3.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.3.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "5.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "8.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.4.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/diff": { - "version": "8.0.2", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.3", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "13.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^11.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.2.0", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "8.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^7.0.0", - "npm-package-arg": "^13.0.0", - "promzard": "^3.0.1", - "read": "^5.0.1", - "semver": "^7.7.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/ip-address": { - "version": "10.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "5.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/isexe": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "10.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.0.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.1.8", - "@npmcli/installed-package-contents": "^4.0.0", - "binary-extensions": "^3.0.0", - "diff": "^8.0.2", - "minimatch": "^10.0.3", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "tar": "^7.5.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "10.1.10", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.1.8", - "@npmcli/package-json": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", - "read": "^5.0.1", - "semver": "^7.3.7", - "signal-exit": "^4.1.0", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.1.8" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "9.0.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.1.8", - "@npmcli/run-script": "^10.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7", - "sigstore": "^4.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "10.1.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "12.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.2", - "tinyglobby": "^0.2.12", - "which": "^6.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^4.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "8.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "13.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "11.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "12.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "19.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "4.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "21.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^5.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "2.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "6.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/proggy": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "^3.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.7.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "4.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.0.0", - "@sigstore/tuf": "^4.0.0", - "@sigstore/verify": "^3.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.22", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "13.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "10.2.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "7.5.2", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "4.0.0", - "debug": "^4.4.1", - "make-fetch-happen": "^15.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/which": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/number-flow": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/number-flow/-/number-flow-0.5.8.tgz", - "integrity": "sha512-FPr1DumWyGi5Nucoug14bC6xEz70A1TnhgSHhKyfqjgji2SOTz+iLJxKtv37N5JyJbteGYCm6NQ9p1O4KZ7iiA==", - "license": "MIT", - "dependencies": { - "esm-env": "^1.1.4" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", - "license": "MIT" - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/papaparse": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", - "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/partysocket": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.1.6.tgz", - "integrity": "sha512-LkEk8N9hMDDsDT0iDK0zuwUDFVrVMUXFXCeN3850Ng8wtjPqPBeJlwdeY6ROlJSEh3tPoTTasXoSBYH76y118w==", - "license": "MIT", - "dependencies": { - "event-target-polyfill": "^0.0.4" - } - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path2d": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.2.tgz", - "integrity": "sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/pdfjs-dist": { - "version": "4.8.69", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz", - "integrity": "sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "canvas": "^3.0.0-rc2", - "path2d": "^0.2.1" - } - }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT", - "optional": true - }, - "node_modules/phenomenon": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/phenomenon/-/phenomenon-1.6.0.tgz", - "integrity": "sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/playwright": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.57.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/po-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/po-parser/-/po-parser-1.0.2.tgz", - "integrity": "sha512-yTIQL8PZy7V8c0psPoJUx7fayez+Mo/53MZgX9MPuPHx+Dt+sRPNuRbI+6Oqxnddhkd68x4Nlgon/zizL1Xg+w==", - "license": "MIT" - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/posthog-js": { - "version": "1.302.2", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.302.2.tgz", - "integrity": "sha512-4voih22zQe7yHA7DynlQ3B7kgzJOaKIjzV7K3jJ2Qf+UDXd1ZgO7xYmLWYVtuKEvD1OXHbKk/fPhUTZeHEWpBw==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@posthog/core": "1.7.1", - "core-js": "^3.38.1", - "fflate": "^0.4.8", - "preact": "^10.19.3", - "web-vitals": "^4.2.4" - } - }, - "node_modules/posthog-js/node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", - "license": "MIT" - }, - "node_modules/posthog-node": { - "version": "5.17.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", - "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", - "license": "MIT", - "dependencies": { - "@posthog/core": "1.7.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/preact": { - "version": "10.28.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", - "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/prosemirror-changeset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", - "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", - "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", - "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz", - "integrity": "sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", - "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", - "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", - "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-markdown": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", - "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.0.0", - "markdown-it": "^14.0.0", - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", - "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.25.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", - "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", - "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", - "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", - "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.3.tgz", - "integrity": "sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.2.3", - "prosemirror-model": "^1.25.4", - "prosemirror-state": "^1.4.4", - "prosemirror-transform": "^1.10.5", - "prosemirror-view": "^1.41.4" - } - }, - "node_modules/prosemirror-trailing-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", - "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.5.tgz", - "integrity": "sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.21.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.41.4", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz", - "integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/radix-ui": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", - "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-accessible-icon": "1.1.7", - "@radix-ui/react-accordion": "1.2.12", - "@radix-ui/react-alert-dialog": "1.1.15", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-aspect-ratio": "1.1.7", - "@radix-ui/react-avatar": "1.1.10", - "@radix-ui/react-checkbox": "1.3.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-context-menu": "2.2.16", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-dropdown-menu": "2.1.16", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-form": "0.1.8", - "@radix-ui/react-hover-card": "1.1.15", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-menubar": "1.1.16", - "@radix-ui/react-navigation-menu": "1.2.14", - "@radix-ui/react-one-time-password-field": "0.1.8", - "@radix-ui/react-password-toggle-field": "0.1.3", - "@radix-ui/react-popover": "1.1.15", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-progress": "1.1.7", - "@radix-ui/react-radio-group": "1.3.8", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-scroll-area": "1.2.10", - "@radix-ui/react-select": "2.2.6", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slider": "1.3.6", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-switch": "1.2.6", - "@radix-ui/react-tabs": "1.1.13", - "@radix-ui/react-toast": "1.2.15", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-toggle-group": "1.1.11", - "@radix-ui/react-toolbar": "1.1.11", - "@radix-ui/react-tooltip": "1.2.8", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-escape-keydown": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "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 - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "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 - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "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 - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "optional": true, - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-color-palette": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/react-color-palette/-/react-color-palette-7.3.1.tgz", - "integrity": "sha512-O8eTbogOKExVbhFOCaQ6WACQtGznymLqbd95i4C42PZd8im9OwL1NjuGxswk2JxJR5jfcTu7KQzl7VbpU48m+g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-day-picker": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", - "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "date-fns": "^2.28.0 || ^3.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-diff-viewer-continued": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/react-diff-viewer-continued/-/react-diff-viewer-continued-3.4.0.tgz", - "integrity": "sha512-kMZmUyb3Pv5L9vUtCfIGYsdOHs8mUojblGy1U1Sm0D7FhAOEsH9QhnngEIRo5hXWIPNGupNRJls1TJ6Eqx84eg==", - "license": "MIT", - "dependencies": { - "@emotion/css": "^11.11.2", - "classnames": "^2.3.2", - "diff": "^5.1.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 8" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-diff-viewer-continued/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-hook-form": { - "version": "7.68.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.68.0.tgz", - "integrity": "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-infinite-scroll-component": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.1.tgz", - "integrity": "sha512-R8YoOyiNDynSWmfVme5LHslsKrP+/xcRUWR2ies8UgUab9dtyw5ECnMCVPPmnmjjF4MWQmfVdRwRWcWaDgeyMA==", - "license": "MIT", - "dependencies": { - "throttle-debounce": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/react-is": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz", - "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==", - "license": "MIT" - }, - "node_modules/react-konva": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-19.2.1.tgz", - "integrity": "sha512-sqZWCzQGpdMrU5aeunR0oxUY8UeCPbU8gnAYxMtAn6BT4coeSpiATKOctsoxRu6F56TAcF+s0c6Lul9ansNqQA==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.32.3", - "its-fine": "^2.0.0", - "react-reconciler": "0.33.0", - "scheduler": "0.27.0" - }, - "peerDependencies": { - "konva": "^8.0.1 || ^7.2.5 || ^9.0.0 || ^10.0.0", - "react": "^19.2.0", - "react-dom": "^19.2.0" - } - }, - "node_modules/react-konva/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-papaparse": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/react-papaparse/-/react-papaparse-4.4.0.tgz", - "integrity": "sha512-xTEwHZYJ+1dh9mQDQjjwJXmWyX20DdZ52u+ddw75V+Xm5qsjXSvWmC7c8K82vRwMjKAOH2S9uFyGpHEyEztkUQ==", - "license": "MIT", - "dependencies": { - "@types/papaparse": "^5.3.9", - "papaparse": "^5.4.1" - }, - "engines": { - "node": ">=8", - "npm": ">=5" - } - }, - "node_modules/react-pdf": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.2.1.tgz", - "integrity": "sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "dequal": "^2.0.3", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.3.0", - "pdfjs-dist": "4.8.69", - "tiny-invariant": "^1.0.0", - "warning": "^4.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "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" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-phone-number-input": { - "version": "3.4.14", - "resolved": "https://registry.npmjs.org/react-phone-number-input/-/react-phone-number-input-3.4.14.tgz", - "integrity": "sha512-T9MziNuvthzv6+JAhKD71ab/jVXW5U20nQZRBJd6+q+ujmkC+/ISOf2GYo8pIi4VGjdIYRIHDftMAYn3WKZT3w==", - "license": "MIT", - "dependencies": { - "classnames": "^2.5.1", - "country-flag-icons": "^1.5.17", - "input-format": "^0.3.14", - "libphonenumber-js": "^1.12.27", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-reconciler": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", - "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^19.2.0" - } - }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "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 - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-resizable-panels": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-3.0.6.tgz", - "integrity": "sha512-b3qKHQ3MLqOgSS+FRYKapNkJZf5EQzuf6+RLiq1/IlTHw99YrZ2NJZLk4hQIzTnnIkRg2LUqyVinu6YWWpUYew==", - "license": "MIT", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "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 - } - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-excel-file": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/read-excel-file/-/read-excel-file-6.0.1.tgz", - "integrity": "sha512-rH6huBFxsjZsUARCYh55O08cn1gqZH8bnLf0kI6y5K7+9yqBVzy8veO4gPV4VGKv4M9rdcRtXTDGZZNwPi1gDA==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.11", - "fflate": "^0.8.2", - "unzipper": "^0.12.3" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", - "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^4.7.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/recharts": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.5.1.tgz", - "integrity": "sha512-+v+HJojK7gnEgG6h+b2u7k8HH7FhyFUzAc4+cPrsjL4Otdgqr/ecXzAnHciqlzV1ko064eNcsdzrYOM78kankA==", - "license": "MIT", - "workspaces": [ - "www" - ], - "dependencies": { - "@reduxjs/toolkit": "1.x.x || 2.x.x", - "clsx": "^2.1.1", - "decimal.js-light": "^2.5.1", - "es-toolkit": "^1.39.3", - "eventemitter3": "^5.0.1", - "immer": "^10.1.1", - "react-redux": "8.x.x || 9.x.x", - "reselect": "5.1.1", - "tiny-invariant": "^1.3.3", - "use-sync-external-store": "^1.2.2", - "victory-vendor": "^37.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "optional": true - }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rehype-harden": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/rehype-harden/-/rehype-harden-1.1.6.tgz", - "integrity": "sha512-5WyX6BFEWYmmbCF/S2gNRklfgPGTiGjviAjbseO4XlpqEilWBkvWwve6uU/JB3C0JvG/qxCZa3rBn8+ajy4i/A==", - "license": "MIT", - "dependencies": { - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/rehype-katex": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", - "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/katex": "^0.16.0", - "hast-util-from-html-isomorphic": "^2.0.0", - "hast-util-to-text": "^4.0.0", - "katex": "^0.16.0", - "unist-util-visit-parents": "^6.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sanitize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-sanitize": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-cjk-friendly": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/remark-cjk-friendly/-/remark-cjk-friendly-1.2.3.tgz", - "integrity": "sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==", - "license": "MIT", - "dependencies": { - "micromark-extension-cjk-friendly": "1.2.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@types/mdast": "^4.0.0", - "unified": "^11.0.0" - }, - "peerDependenciesMeta": { - "@types/mdast": { - "optional": true - } - } - }, - "node_modules/remark-cjk-friendly-gfm-strikethrough": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/remark-cjk-friendly-gfm-strikethrough/-/remark-cjk-friendly-gfm-strikethrough-1.2.3.tgz", - "integrity": "sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==", - "license": "MIT", - "dependencies": { - "micromark-extension-cjk-friendly-gfm-strikethrough": "1.2.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@types/mdast": "^4.0.0", - "unified": "^11.0.0" - }, - "peerDependenciesMeta": { - "@types/mdast": { - "optional": true - } - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", - "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-math": "^3.0.0", - "micromark-extension-math": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/remend/-/remend-1.0.1.tgz", - "integrity": "sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==", - "license": "Apache-2.0" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restructure": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", - "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", - "optional": true, - "engines": { - "node": ">= 0.8.15" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", - "license": "MIT" - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.94.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", - "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/scheduler": { - "version": "0.25.0-rc-603e6108-20241029", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz", - "integrity": "sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", - "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/seroval-plugins": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz", - "integrity": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" - } - }, - "node_modules/server-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", - "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/sharp/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/sharp/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/sharp/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.19.0.tgz", - "integrity": "sha512-77VJr3OR/VUZzPiStyRhADmO2jApMM0V2b1qf0RpfWya8Zr1PeZev5AEpPGAAKWdiYUtcZGBE4F5QvJml1PvWA==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "3.19.0", - "@shikijs/engine-javascript": "3.19.0", - "@shikijs/engine-oniguruma": "3.19.0", - "@shikijs/langs": "3.19.0", - "@shikijs/themes": "3.19.0", - "@shikijs/types": "3.19.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/solid-floating-ui": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/solid-floating-ui/-/solid-floating-ui-0.3.1.tgz", - "integrity": "sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@floating-ui/dom": "^1.5", - "solid-js": "^1.8" - } - }, - "node_modules/solid-js": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", - "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", - "license": "MIT", - "dependencies": { - "csstype": "^3.1.0", - "seroval": "~1.3.0", - "seroval-plugins": "~1.3.0" - } - }, - "node_modules/solid-motionone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/solid-motionone/-/solid-motionone-1.0.4.tgz", - "integrity": "sha512-aqEjgecoO9raDFznu/dEci7ORSmA26Kjj9J4Cn1Gyr0GZuOVdvsNxdxClTL9J40Aq/uYFx4GLwC8n70fMLHiuA==", - "license": "MIT", - "dependencies": { - "@motionone/dom": "^10.17.0", - "@motionone/utils": "^10.17.0", - "@solid-primitives/props": "^3.1.11", - "@solid-primitives/refs": "^1.0.8", - "@solid-primitives/transition-group": "^1.0.5", - "csstype": "^3.1.3" - }, - "peerDependencies": { - "solid-js": "^1.8.0" - } - }, - "node_modules/solid-presence": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/solid-presence/-/solid-presence-0.1.8.tgz", - "integrity": "sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==", - "license": "MIT", - "dependencies": { - "@corvu/utils": "~0.4.0" - }, - "peerDependencies": { - "solid-js": "^1.8" - } - }, - "node_modules/solid-prevent-scroll": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/solid-prevent-scroll/-/solid-prevent-scroll-0.1.10.tgz", - "integrity": "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==", - "license": "MIT", - "dependencies": { - "@corvu/utils": "~0.4.1" - }, - "peerDependencies": { - "solid-js": "^1.8" - } - }, - "node_modules/sonner": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", - "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stackblur-canvas": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", - "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.14" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamdown": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/streamdown/-/streamdown-1.6.10.tgz", - "integrity": "sha512-B4Y3Z/qiXl1Dc+LzAB5c52Cd1QGRiFjaDwP+ERoj1JtCykdRDM8X6HwQnn3YkpkSk0x3R7S/6LrGe1nQiElHQQ==", - "license": "Apache-2.0", - "dependencies": { - "clsx": "^2.1.1", - "hast": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.3.6", - "html-url-attributes": "^3.0.1", - "katex": "^0.16.22", - "lucide-react": "^0.542.0", - "marked": "^16.2.1", - "mermaid": "^11.11.0", - "rehype-harden": "^1.1.6", - "rehype-katex": "^7.0.1", - "rehype-raw": "^7.0.0", - "remark-cjk-friendly": "^1.2.3", - "remark-cjk-friendly-gfm-strikethrough": "^1.2.3", - "remark-gfm": "^4.0.1", - "remark-math": "^6.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remend": "1.0.1", - "shiki": "^3.12.2", - "tailwind-merge": "^3.3.1", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/streamdown/node_modules/lucide-react": { - "version": "0.542.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", - "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/streamdown/node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/style-mod": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", - "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", - "license": "MIT" - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/styled-components": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", - "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", - "license": "MIT", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/styled-components/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/styled-components/node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-arc-to-cubic-bezier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", - "license": "ISC" - }, - "node_modules/svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", - "license": "MIT" - }, - "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwind-scrollbar": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-4.0.2.tgz", - "integrity": "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==", - "license": "MIT", - "dependencies": { - "prism-react-renderer": "^2.4.1" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "4.x" - } - }, - "node_modules/tailwind-scrollbar-hide": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-2.0.0.tgz", - "integrity": "sha512-lqiIutHliEiODwBRHy4G2+Tcayo2U7+3+4frBmoMETD72qtah+XhOk5XcPzC1nJvXhXUdfl2ajlMhUc2qC6CIg==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/third-party-capital": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz", - "integrity": "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==", - "license": "ISC" - }, - "node_modules/throttle-debounce": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", - "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/turndown": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", - "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", - "license": "MIT", - "dependencies": { - "@mixmark-io/domino": "^2.2.0" - } - }, - "node_modules/turndown-plugin-gfm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", - "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", - "license": "MIT" - }, - "node_modules/tw-animate-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", - "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Wombosvideo" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", - "license": "MIT" - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", - "license": "MIT", - "dependencies": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "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 - } - } - }, - "node_modules/use-composed-ref": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", - "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-intl": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.5.8.tgz", - "integrity": "sha512-rWPV2Sirw55BQbA/7ndUBtsikh8WXwBrUkZJ1mD35+emj/ogPPqgCZdv1DdrEFK42AjF1g5w8d3x8govhqPH6Q==", - "license": "MIT", - "dependencies": { - "@formatjs/fast-memoize": "^2.2.0", - "@schummar/icu-type-parser": "1.21.5", - "intl-messageformat": "^10.5.14" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", - "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "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 - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "license": "MIT", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vaul": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", - "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/victory-vendor": { - "version": "37.3.6", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", - "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/vite-compatible-readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz", - "integrity": "sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", - "license": "Apache-2.0" - }, - "node_modules/webfontloader": { - "version": "1.6.28", - "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", - "license": "Apache-2.0" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y-indexeddb": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.12.tgz", - "integrity": "sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==", - "license": "MIT", - "dependencies": { - "lib0": "^0.2.74" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, - "peerDependencies": { - "yjs": "^13.0.0" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yjs": { - "version": "13.6.27", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", - "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", - "license": "MIT", - "dependencies": { - "lib0": "^0.2.99" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoga-layout": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", - "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", - "license": "MIT" - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/apps/frontend/src/app/help/layout.tsx b/apps/frontend/src/app/help/layout.tsx index ed9e4abcfa..506291afc3 100644 --- a/apps/frontend/src/app/help/layout.tsx +++ b/apps/frontend/src/app/help/layout.tsx @@ -1,44 +1,11 @@ -'use client'; +import { HelpLayoutClient } from '@/components/help/help-layout-client'; -import * as React from 'react'; -import { useEffect, useState } from 'react'; -import { ScrollArea } from '@/components/ui/scroll-area'; -import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar'; -import { HelpSidebar } from '@/components/help/help-sidebar'; -import { HelpSearchModal } from '@/components/help/help-search-modal'; +interface HelpLayoutProps { + children: React.ReactNode; +} export default function HelpLayout({ children, -}: { - children: React.ReactNode; -}) { - const [showSearchModal, setShowSearchModal] = useState(false); - - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - if ((event.metaKey || event.ctrlKey) && event.key === 'k') { - event.preventDefault(); - setShowSearchModal(true); - } - }; - - window.addEventListener('keydown', handleKeyDown); - return () => window.removeEventListener('keydown', handleKeyDown); - }, []); - - return ( -
- - setShowSearchModal(true)} /> - - -
- {children} -
-
-
- -
-
- ); +}: HelpLayoutProps) { + return {children}; } diff --git a/apps/frontend/src/app/templates/[shareId]/page.tsx b/apps/frontend/src/app/templates/[shareId]/page.tsx index d68b30cf51..cde571fdb4 100644 --- a/apps/frontend/src/app/templates/[shareId]/page.tsx +++ b/apps/frontend/src/app/templates/[shareId]/page.tsx @@ -117,7 +117,7 @@ const IntegrationIcon: React.FC<{ const firstLetter = displayName.charAt(0).toUpperCase(); - const iconMap: Record = { + const iconMap: Record = { 'github': , 'browser': , 'terminal': , diff --git a/apps/frontend/src/components/dashboard/examples/index.tsx b/apps/frontend/src/components/dashboard/examples/index.tsx index dcc23c24cc..d254d16435 100644 --- a/apps/frontend/src/components/dashboard/examples/index.tsx +++ b/apps/frontend/src/components/dashboard/examples/index.tsx @@ -168,7 +168,7 @@ export const Examples = ({ >
- {React.cloneElement(prompt.icon as React.ReactElement, { size: 14 })} + {React.cloneElement(prompt.icon as React.ReactElement<{ size?: number }>, { size: 14 })}
{prompt.title}
diff --git a/apps/frontend/src/components/help/help-layout-client.tsx b/apps/frontend/src/components/help/help-layout-client.tsx new file mode 100644 index 0000000000..f96afd253e --- /dev/null +++ b/apps/frontend/src/components/help/help-layout-client.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar'; +import { HelpSidebar } from '@/components/help/help-sidebar'; +import { HelpSearchModal } from '@/components/help/help-search-modal'; + +export function HelpLayoutClient({ children }: { children: React.ReactNode }) { + const [showSearchModal, setShowSearchModal] = useState(false); + + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ((event.metaKey || event.ctrlKey) && event.key === 'k') { + event.preventDefault(); + setShowSearchModal(true); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, []); + + return ( +
+ + setShowSearchModal(true)} /> + + +
+ {children} +
+
+
+ +
+
+ ); +} + diff --git a/apps/frontend/src/components/thread/content/PlaybackControls.tsx b/apps/frontend/src/components/thread/content/PlaybackControls.tsx index 42e24d781d..bfed407ea8 100644 --- a/apps/frontend/src/components/thread/content/PlaybackControls.tsx +++ b/apps/frontend/src/components/thread/content/PlaybackControls.tsx @@ -36,9 +36,9 @@ export interface PlaybackState { export interface PlaybackController { playbackState: PlaybackState; updatePlaybackState: (updates: Partial) => void; - renderHeader: () => JSX.Element; - renderFloatingControls: () => JSX.Element; - renderWelcomeOverlay: () => JSX.Element; + renderHeader: () => React.JSX.Element; + renderFloatingControls: () => React.JSX.Element; + renderWelcomeOverlay: () => React.JSX.Element; togglePlayback: () => void; resetPlayback: () => void; skipToEnd: () => void; diff --git a/apps/frontend/src/components/thread/content/ShowToolStream.tsx b/apps/frontend/src/components/thread/content/ShowToolStream.tsx index 1063d810f3..5056962bb9 100644 --- a/apps/frontend/src/components/thread/content/ShowToolStream.tsx +++ b/apps/frontend/src/components/thread/content/ShowToolStream.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useRef, useState, useMemo } from 'react'; import { CircleDashed } from 'lucide-react'; import { getToolIcon, getUserFriendlyToolName, extractPrimaryParam } from '@/components/thread/utils'; import { AppIcon } from '../tool-views/shared/AppIcon'; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; // Media generation tools that show shimmer preview const MEDIA_GENERATION_TOOLS = new Set([ @@ -199,6 +200,38 @@ export const ShowToolStream: React.FC = ({ return { html: rawContent, plainText: rawContent }; }; + // Determine which field to extract for smooth animation based on tool type + const smoothFieldPath = useMemo(() => { + if (isEditFile) return 'code_edit'; + if (isCreateFile || isFullFileRewrite) return 'file_contents'; + if (STREAMABLE_TOOLS.COMMAND_TOOLS.has(toolName || '')) return 'command'; + if (STREAMABLE_TOOLS.BROWSER_TOOLS.has(toolName || '')) return 'url'; + if (STREAMABLE_TOOLS.WEB_TOOLS.has(toolName || '')) return 'query'; + return 'content'; + }, [toolName, isEditFile, isCreateFile, isFullFileRewrite]); + + // Get raw arguments from tool call for smooth animation + const rawToolArguments = useMemo(() => { + if (effectiveToolCall?.arguments) { + return effectiveToolCall.arguments; + } + // Fallback to parsing from content + try { + const parsed = JSON.parse(throttledContent); + return parsed.arguments || parsed; + } catch { + return throttledContent; + } + }, [effectiveToolCall, throttledContent]); + + // Apply smooth animation to tool content (120 chars/sec for snappy code display) + const { displayedValue: smoothFieldValue, isAnimating: isFieldAnimating } = useSmoothToolField( + rawToolArguments, + smoothFieldPath, + 120, + !isCompleted // Only animate while streaming (not completed) + ); + // Extract streaming content from JSON or plain text const streamingContent = useMemo(() => { if (!throttledContent) return { html: '', plainText: '' }; @@ -210,18 +243,23 @@ export const ShowToolStream: React.FC = ({ // For file operations, extract file_contents or code_edit if (STREAMABLE_TOOLS.FILE_OPERATIONS.has(toolName || '')) { if (isEditFile && parsed.code_edit) { - return { html: parsed.code_edit, plainText: parsed.code_edit }; + // Use smooth value if available and animating + const value = isFieldAnimating ? smoothFieldValue : parsed.code_edit; + return { html: value, plainText: value }; } if ((isCreateFile || isFullFileRewrite) && parsed.file_contents) { - return { html: parsed.file_contents, plainText: parsed.file_contents }; + const value = isFieldAnimating ? smoothFieldValue : parsed.file_contents; + return { html: value, plainText: value }; } if (parsed.arguments) { const args = typeof parsed.arguments === 'string' ? JSON.parse(parsed.arguments) : parsed.arguments; if (isEditFile && args.code_edit) { - return { html: args.code_edit, plainText: args.code_edit }; + const value = isFieldAnimating ? smoothFieldValue : args.code_edit; + return { html: value, plainText: value }; } if ((isCreateFile || isFullFileRewrite) && args.file_contents) { - return { html: args.file_contents, plainText: args.file_contents }; + const value = isFieldAnimating ? smoothFieldValue : args.file_contents; + return { html: value, plainText: value }; } } } @@ -229,17 +267,20 @@ export const ShowToolStream: React.FC = ({ // Command tools - extract command if (STREAMABLE_TOOLS.COMMAND_TOOLS.has(toolName || '')) { if (parsed.command) { - return { html: `command: ${parsed.command}`, plainText: `command: ${parsed.command}` }; + const value = isFieldAnimating ? smoothFieldValue : parsed.command; + return { html: `command: ${value}`, plainText: `command: ${value}` }; } if (parsed.arguments?.command) { - return { html: `command: ${parsed.arguments.command}`, plainText: `command: ${parsed.arguments.command}` }; + const value = isFieldAnimating ? smoothFieldValue : parsed.arguments.command; + return { html: `command: ${value}`, plainText: `command: ${value}` }; } } // Browser tools if (STREAMABLE_TOOLS.BROWSER_TOOLS.has(toolName || '')) { if (parsed.url) { - return { html: `url: ${parsed.url}`, plainText: `url: ${parsed.url}` }; + const value = isFieldAnimating ? smoothFieldValue : parsed.url; + return { html: `url: ${value}`, plainText: `url: ${value}` }; } if (parsed.action) { return { html: `action: ${parsed.action}`, plainText: `action: ${parsed.action}` }; @@ -252,7 +293,8 @@ export const ShowToolStream: React.FC = ({ // Web tools if (STREAMABLE_TOOLS.WEB_TOOLS.has(toolName || '')) { if (parsed.query) { - return { html: `query: ${parsed.query}`, plainText: `query: ${parsed.query}` }; + const value = isFieldAnimating ? smoothFieldValue : parsed.query; + return { html: `query: ${value}`, plainText: `query: ${value}` }; } if (parsed.url) { return { html: `url: ${parsed.url}`, plainText: `url: ${parsed.url}` }; @@ -273,7 +315,7 @@ export const ShowToolStream: React.FC = ({ // Fallback: return content as-is return { html: throttledContent, plainText: throttledContent }; - }, [throttledContent, toolName, isEditFile, isCreateFile, isFullFileRewrite]); + }, [throttledContent, toolName, isEditFile, isCreateFile, isFullFileRewrite, smoothFieldValue, isFieldAnimating]); // Show streaming content for all streamable tools with delayed transitions useEffect(() => { diff --git a/apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx b/apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx index 657f3e271a..5ee6a7b647 100644 --- a/apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx +++ b/apps/frontend/src/components/thread/tool-views/shared/LoadingState.tsx @@ -27,7 +27,7 @@ export function LoadingState({ progressText, autoProgress = true, initialProgress = 0, -}: LoadingStateProps): JSX.Element { +}: LoadingStateProps): React.JSX.Element { const [progress, setProgress] = useState(initialProgress); useEffect(() => { diff --git a/apps/frontend/src/components/thread/types.ts b/apps/frontend/src/components/thread/types.ts index cd433398fd..237fb7b4cf 100644 --- a/apps/frontend/src/components/thread/types.ts +++ b/apps/frontend/src/components/thread/types.ts @@ -1,74 +1,37 @@ -import React from 'react'; import type { Project } from '@/lib/api/threads'; import { Message as BaseApiMessageType } from '@/lib/api/threads'; +// Re-export shared types - single source of truth +export type { + UnifiedMessage, + ParsedContent, + ParsedMetadata, + AgentStatus, +} from '@agentpress/shared'; + +// Re-export streaming types from shared +export type { + StreamStatus, + StreamMessage, + ChunkMessage, + StatusMessage, + ToolCallStreamMessage, + ToolOutputMessage, + ErrorStreamMessage, + PingMessage, + LlmResponseStartMessage, + StreamingToolCall, + StreamingMetadata, +} from '@agentpress/shared'; + +export { StreamMessageType, validateStreamMessage } from '@agentpress/shared'; + // Define a type for the params to make React.use() work properly export type ThreadParams = { threadId: string; projectId: string; }; -// Unified Message Interface matching the backend/database schema -export interface UnifiedMessage { - sequence?: number; - message_id: string | null; // Can be null for transient stream events (chunks, unsaved statuses) - thread_id: string; - type: 'user' | 'assistant' | 'tool' | 'system' | 'status' | 'browser_state' | 'image_context' | 'llm_response_end' | 'llm_response_start'; // image_context for images loaded into LLM context - is_llm_message: boolean; - content: string; // ALWAYS a JSON string from the backend - metadata: string; // ALWAYS a JSON string from the backend - created_at: string; // ISO timestamp string - updated_at: string; // ISO timestamp string - agent_id?: string; // ID of the agent associated with this message - agents?: { - name: string; - }; // Agent information from join -} - -// Helper type for parsed content - structure depends on message.type -export interface ParsedContent { - role?: 'user' | 'assistant' | 'tool' | 'system'; // From the JSON string in content - content?: any; // Can be string, object, etc. after parsing - tool_calls?: any[]; // For native tool calls - tool_call_id?: string; // For tool results - name?: string; // For tool results - status_type?: string; // For status messages - usage?: { - prompt_tokens?: number; - completion_tokens?: number; - total_tokens?: number; - cache_read_tokens?: number; - cache_creation_tokens?: number; - }; // For llm_response_end messages - [key: string]: any; // Allow other properties -} - -// Helper type for parsed metadata -export interface ParsedMetadata { - stream_status?: 'chunk' | 'complete' | 'tool_call_chunk'; - thread_run_id?: string; - tool_index?: number; - assistant_message_id?: string; // Link tool results/statuses back - linked_tool_result_message_id?: string; // Link status to tool result - // New format fields - directly in metadata, no wrapper - tool_calls?: Array<{ - tool_call_id: string; - function_name: string; - arguments: Record | string; // Can be string (partial JSON during streaming) or object (complete) - source: 'native' | 'xml'; - }>; - text_content?: string; - function_name?: string; // Stored directly in metadata, not in result - result?: { - success: boolean; - output: any; - error?: string | null; - }; - return_format?: 'native' | 'xml'; - tool_call_id?: string; - [key: string]: any; // Allow other properties -} - // Extend the base Message type with the expected database fields export interface ApiMessageType extends Omit { message_id?: string; @@ -81,8 +44,5 @@ export interface ApiMessageType extends Omit { type?: string; } -// Thread page-specific types -export type AgentStatus = 'idle' | 'running' | 'connecting' | 'error'; - // Re-export existing types export type { Project }; diff --git a/apps/frontend/src/components/ui/date-range-picker.tsx b/apps/frontend/src/components/ui/date-range-picker.tsx index 549514549e..d40fb7f448 100644 --- a/apps/frontend/src/components/ui/date-range-picker.tsx +++ b/apps/frontend/src/components/ui/date-range-picker.tsx @@ -57,7 +57,7 @@ export const DateRangePicker: FC = ({ onUpdate, align = 'end', locale = 'en-US', -}): JSX.Element => { +}): React.JSX.Element => { const [isOpen, setIsOpen] = useState(false) const [range, setRange] = useState({ @@ -192,7 +192,7 @@ export const DateRangePicker: FC = ({ preset: string label: string isSelected: boolean - }): JSX.Element => ( + }): React.JSX.Element => (
)} + {displayInstruction && ( +
+ Instruction: + {displayInstruction} + {isInstructionAnimating && } +
+ )}
)}
@@ -373,9 +406,10 @@ export function BrowserToolView({ {operation} )} - {url && ( + {(displayUrl || url) && ( - {url} + {displayUrl || url} + {isUrlAnimating && } )}
diff --git a/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx b/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx index a797d439c7..35cb6d25c6 100644 --- a/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx @@ -20,6 +20,7 @@ import { LoadingState } from './shared/LoadingState'; import { toast } from 'sonner'; import { AppIcon } from './shared/AppIcon'; import { SmartJsonViewer } from './shared/SmartJsonViewer'; +import { useSmoothText } from '@/hooks/messages/useSmoothText'; export function GenericToolView({ toolCall, @@ -93,11 +94,20 @@ export function GenericToolView({ return String(content); }; - const formattedAssistantContent = React.useMemo( + const rawAssistantContent = React.useMemo( () => parsedAssistantContent ? formatAsString(parsedAssistantContent) : null, [parsedAssistantContent] ); + // Apply smooth text streaming for arguments when streaming + const { text: smoothAssistantContent, isAnimating: isAssistantAnimating } = useSmoothText( + rawAssistantContent || '', + 120, + isStreaming && !toolResult && !!rawAssistantContent + ); + + const formattedAssistantContent = isStreaming && smoothAssistantContent ? smoothAssistantContent : rawAssistantContent; + const formattedToolContent = React.useMemo( () => parsedToolContent ? formatAsString(parsedToolContent) : null, [parsedToolContent] @@ -249,6 +259,7 @@ export function GenericToolView({ ) : (
                           {formattedAssistantContent}
+                          {isAssistantAnimating && }
                         
)}
diff --git a/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx b/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx index 613384de7b..d9a0277104 100644 --- a/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx @@ -24,6 +24,8 @@ import { Progress } from '@/components/ui/progress'; import { ScrollArea } from "@/components/ui/scroll-area"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import Image from 'next/image'; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; +import { useSmoothText } from '@/hooks/messages/useSmoothText'; export function WebCrawlToolView({ toolCall, @@ -63,6 +65,15 @@ export function WebCrawlToolView({ const name = toolCall.function_name.replace(/_/g, '-').toLowerCase(); + // Apply smooth text streaming for URL field + const rawArguments = toolCall?.rawArguments || toolCall?.arguments; + const { displayedValue: smoothUrl, isAnimating: isUrlAnimating } = useSmoothToolField( + rawArguments, + 'url', + 120, + isStreaming && !toolResult + ); + // Extract data directly from structured props const url = toolCall.arguments?.url || toolCall.arguments?.target_url || null; @@ -77,6 +88,19 @@ export function WebCrawlToolView({ } } + // Apply smooth text streaming for content + const { text: smoothContent, isAnimating: isContentAnimating } = useSmoothText( + webpageContent?.text || '', + 120, + isStreaming && !toolResult && !!webpageContent?.text + ); + + // Use smooth URL when streaming + const displayUrl = isStreaming && smoothUrl ? smoothUrl : url; + + // Use smooth content when streaming + const displayContent = isStreaming && smoothContent ? smoothContent : webpageContent?.text; + const toolTitle = getToolTitle(name); // Format domain for display @@ -89,7 +113,7 @@ export function WebCrawlToolView({ } }; - const domain = url ? formatDomain(url) : 'Unknown'; + const domain = displayUrl ? formatDomain(displayUrl) : 'Unknown'; // Get favicon const getFavicon = (url: string) => { @@ -101,13 +125,14 @@ export function WebCrawlToolView({ } }; - const favicon = url ? getFavicon(url) : null; + const favicon = displayUrl || url ? getFavicon(displayUrl || url) : null; const copyContent = async () => { - if (!webpageContent?.text) return; + const contentToCopy = displayContent || webpageContent?.text; + if (!contentToCopy) return; try { - await navigator.clipboard.writeText(webpageContent.text); + await navigator.clipboard.writeText(contentToCopy); setCopiedContent(true); setTimeout(() => setCopiedContent(false), 2000); } catch (err) { @@ -126,7 +151,7 @@ export function WebCrawlToolView({ return { wordCount, charCount, lineCount }; }; - const contentStats = webpageContent?.text ? getContentStats(webpageContent.text) : null; + const contentStats = displayContent || webpageContent?.text ? getContentStats(displayContent || webpageContent?.text || '') : null; return ( @@ -175,13 +200,14 @@ export function WebCrawlToolView({ Crawling Webpage

- Fetching content from {domain} + Fetching content from {displayUrl || domain} + {isUrlAnimating && }

{progress}% complete

- ) : url ? ( + ) : (displayUrl || url) ? ( // Results State
@@ -207,8 +233,9 @@ export function WebCrawlToolView({ /> )}
-

{truncateString(url, 70)}

+

{truncateString(displayUrl || '', 70)}

{domain}

+ {isUrlAnimating && }
@@ -243,7 +270,7 @@ export function WebCrawlToolView({ )}
- {webpageContent?.text ? ( + {(displayContent || webpageContent?.text) ? (
{/* Content Header */}
@@ -294,7 +321,8 @@ export function WebCrawlToolView({ {/* Content Body */}
-                        {webpageContent.text}
+                        {displayContent || webpageContent?.text}
+                        {isContentAnimating && }
                       
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx index 8dabaa560d..48abedccb6 100644 --- a/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx @@ -27,6 +27,7 @@ interface CheckCommandOutputData { } import { ToolCallData, ToolResultData } from '../types'; +import { useSmoothText } from '@/hooks/messages/useSmoothText'; function extractCheckCommandOutputData( toolCall: ToolCallData, @@ -238,10 +239,20 @@ export function CheckCommandOutputToolView({ const name = toolCall.function_name.replace(/_/g, '-').toLowerCase(); const toolTitle = getToolTitle(name); + // Apply smooth text streaming for output + const { text: smoothOutput, isAnimating: isOutputAnimating } = useSmoothText( + output || '', + 120, + isStreaming && !toolResult + ); + + // Use smooth output when streaming, otherwise use regular output + const displayOutput = isStreaming && smoothOutput ? smoothOutput : output; + const formattedOutput = React.useMemo(() => { - if (!output) return []; + if (!displayOutput) return []; - let processedOutput = output; + let processedOutput = displayOutput; // Handle case where output is already an object if (typeof output === 'object' && output !== null) { @@ -285,7 +296,7 @@ export function CheckCommandOutputToolView({ }); return processedOutput.split('\n'); - }, [output]); + }, [displayOutput]); const hasMoreLines = formattedOutput.length > 10; const previewLines = formattedOutput.slice(0, 10); @@ -383,6 +394,7 @@ export function CheckCommandOutputToolView({ {showFullOutput && emptyLines.map((_, idx) => ( {'\n'} ))} + {isOutputAnimating && } {!showFullOutput && hasMoreLines && (
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx index 07922e4dcb..103a834066 100644 --- a/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx @@ -14,6 +14,8 @@ import { Badge } from '@/components/ui/badge'; import { LoadingState } from '../shared/LoadingState'; import { extractCommandData } from './_utils'; import { useToolStreamStore } from '@/stores/tool-stream-store'; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; +import { useSmoothText } from '@/hooks/messages/useSmoothText'; export function CommandToolView({ toolCall, @@ -45,9 +47,30 @@ export function CommandToolView({ toolTimestamp, assistantTimestamp ); + + // Apply smooth text streaming for command field + const rawArguments = toolCall?.rawArguments || toolCall?.arguments; + const { displayedValue: smoothCommand, isAnimating: isCommandAnimating } = useSmoothToolField( + rawArguments, + 'command', + 120, + isStreaming && !toolResult + ); + + // Apply smooth text streaming for output (use useSmoothText since output is a plain string) + const { text: smoothOutput, isAnimating: isOutputAnimating } = useSmoothText( + streamingOutput || output || '', + 120, + isStreaming && isOutputStreaming && !toolResult + ); + + // Use smooth streaming output when available, otherwise use regular streaming output or result output + const displayOutput = isStreaming && isOutputStreaming && smoothOutput + ? smoothOutput + : (isStreaming && streamingOutput ? streamingOutput : output); - // Use streaming output if available during streaming, otherwise use result output - const displayOutput = isStreaming && streamingOutput ? streamingOutput : output; + // Use smooth command when streaming + const displayCommand = isStreaming && smoothCommand ? smoothCommand : command; // Auto-scroll to bottom when streaming output updates useEffect(() => { @@ -59,7 +82,7 @@ export function CommandToolView({ const actualAssistantTimestamp = assistantTimestamp; const name = toolCall.function_name.replace(/_/g, '-'); - const displayText = name === 'check-command-output' ? sessionName : command; + const displayText = name === 'check-command-output' ? sessionName : displayCommand; const displayLabel = name === 'check-command-output' ? 'Session' : 'Command'; const displayPrefix = name === 'check-command-output' ? 'tmux:' : '$'; @@ -220,7 +243,8 @@ export function CommandToolView({
                         {displayPrefix} 
-                        {command}
+                        {displayCommand}
+                        {isCommandAnimating && }
                       
@@ -245,8 +269,8 @@ export function CommandToolView({
-                        {streamingOutput}
-                        
+                        {displayOutput}
+                        {isOutputAnimating && }
                       
@@ -284,7 +308,7 @@ export function CommandToolView({
                         {displayPrefix} 
-                        {command}
+                        {displayCommand}
                       
diff --git a/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx index 2dd191d57f..657c9c3acb 100644 --- a/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx @@ -71,6 +71,7 @@ import { toast } from 'sonner'; import { PresentationSlidePreview } from '../presentation-tools/PresentationSlidePreview'; import { usePresentationViewerStore } from '@/stores/presentation-viewer-store'; import { useKortixComputerStore } from '@/stores/kortix-computer-store'; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; const UnifiedDiffView: React.FC<{ lineDiff: LineDiff[]; fileName?: string }> = ({ lineDiff, fileName }) => (
@@ -271,6 +272,22 @@ export function FileOperationToolView({ const streamingSource = isStreaming ? throttledStreamingSource : rawStreamingSource; + // Apply smooth text streaming for file_contents (create/rewrite operations) + const { displayedValue: smoothFileContents, isAnimating: isFileContentsAnimating } = useSmoothToolField( + rawStreamingSource, + 'file_contents', + 120, + isStreaming && (operation === 'create' || operation === 'rewrite') && !toolResult + ); + + // Apply smooth text streaming for code_edit (edit operations) + const { displayedValue: smoothCodeEdit, isAnimating: isCodeEditAnimating } = useSmoothToolField( + rawStreamingSource, + 'code_edit', + 120, + isStreaming && operation === 'edit' && !toolResult + ); + const extractedContent = useMemo(() => { let filePath: string | null = args.file_path || args.target_file || args.path || null; let fileContent: string | null = null; @@ -289,9 +306,143 @@ export function FileOperationToolView({ } if (isStreaming && streamingSource) { + // Use smooth streaming content when available + if (operation === 'create' || operation === 'rewrite') { + if (smoothFileContents) { + fileContent = smoothFileContents; + } else { + try { + const parsed = JSON.parse(streamingSource); + if (parsed.file_contents) { + fileContent = parsed.file_contents; + } + if (!filePath && parsed.file_path) { + filePath = parsed.file_path; + } + } catch (e) { + // Fallback to regex parsing + const startMatch = streamingSource.match(/"file_contents"\s*:\s*"/); + if (startMatch) { + const startIndex = startMatch.index! + startMatch[0].length; + let rawContent = streamingSource.substring(startIndex); + const endQuoteMatch = rawContent.match(/(? +
); diff --git a/apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx b/apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx index 57be2519f5..c0a9400147 100644 --- a/apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/web-scrape-tool/WebScrapeToolView.tsx @@ -25,6 +25,7 @@ import { Button } from '@/components/ui/button'; import { Progress } from '@/components/ui/progress'; import { ScrollArea } from "@/components/ui/scroll-area"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; export function WebScrapeToolView({ toolCall, @@ -64,6 +65,15 @@ export function WebScrapeToolView({ const name = toolCall.function_name.replace(/_/g, '-').toLowerCase(); + // Apply smooth text streaming for URL field + const rawArguments = toolCall?.rawArguments || toolCall?.arguments; + const { displayedValue: smoothUrl, isAnimating: isUrlAnimating } = useSmoothToolField( + rawArguments, + 'url', + 120, + isStreaming && !toolResult + ); + const { url, files, @@ -78,6 +88,9 @@ export function WebScrapeToolView({ assistantTimestamp ); + // Use smooth URL when streaming + const displayUrl = isStreaming && smoothUrl ? smoothUrl : url; + const toolTitle = getToolTitle(name); const formatDomain = (url: string): string => { try { @@ -88,7 +101,7 @@ export function WebScrapeToolView({ } }; - const domain = url ? formatDomain(url) : 'Unknown'; + const domain = displayUrl ? formatDomain(displayUrl) : 'Unknown'; const getFavicon = (url: string) => { try { @@ -99,7 +112,7 @@ export function WebScrapeToolView({ } }; - const favicon = url ? getFavicon(url) : null; + const favicon = displayUrl || url ? getFavicon(displayUrl || url) : null; const copyFilePath = async (filePath: string) => { try { @@ -171,13 +184,14 @@ export function WebScrapeToolView({ Extracting Content

- Analyzing and processing {domain} + Analyzing and processing {displayUrl || domain} + {isUrlAnimating && }

{progress}% complete

- ) : url ? ( + ) : displayUrl || url ? ( // Results State
@@ -200,8 +214,9 @@ export function WebScrapeToolView({ /> )}
-

{truncateString(url, 70)}

+

{truncateString(displayUrl || '', 70)}

{domain}

+ {isUrlAnimating && }
diff --git a/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx index 5172affd24..f9e5b69e3f 100644 --- a/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchToolView.tsx @@ -23,6 +23,7 @@ import { Button } from '@/components/ui/button'; import { ScrollArea } from "@/components/ui/scroll-area"; import { LoadingState } from '../shared/LoadingState'; import { extractWebSearchData } from './_utils'; +import { useSmoothToolField } from '@/hooks/messages/useSmoothToolArguments'; export function WebSearchToolView({ toolCall, @@ -35,6 +36,15 @@ export function WebSearchToolView({ const [expandedResults, setExpandedResults] = useState>({}); const [currentQueryIndex, setCurrentQueryIndex] = useState(0); + // Apply smooth text streaming for query field + const rawArguments = toolCall?.rawArguments || toolCall?.arguments; + const { displayedValue: smoothQuery, isAnimating: isQueryAnimating } = useSmoothToolField( + rawArguments, + 'query', + 120, + isStreaming && !toolResult + ); + const { query, searchResults, @@ -53,6 +63,9 @@ export function WebSearchToolView({ assistantTimestamp ); + // Use smooth query when streaming + const displayQuery = isStreaming && smoothQuery ? smoothQuery : query; + // Reset to first query when batch results change useEffect(() => { if (isBatch && batchResults && batchResults.length > 0) { @@ -149,7 +162,7 @@ export function WebSearchToolView({ iconColor="text-blue-500 dark:text-blue-400" bgColor="bg-gradient-to-b from-blue-100 to-blue-50 shadow-inner dark:from-blue-800/40 dark:to-blue-900/60 dark:shadow-blue-950/20" title={name === 'image-search' ? "Searching for images" : "Searching the web"} - filePath={typeof query === 'string' ? query : undefined} + filePath={typeof displayQuery === 'string' ? displayQuery : undefined} showProgress={true} /> ) : searchResults.length > 0 || answer || images.length > 0 ? ( diff --git a/apps/frontend/src/hooks/messages/useAgentStream.ts b/apps/frontend/src/hooks/messages/useAgentStream.ts index c1ff421764..1bb77597fb 100644 --- a/apps/frontend/src/hooks/messages/useAgentStream.ts +++ b/apps/frontend/src/hooks/messages/useAgentStream.ts @@ -1,35 +1,14 @@ -import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { useQueryClient } from '@tanstack/react-query'; -import { - streamAgent, - getAgentStatus, - stopAgent, -} from '@/lib/api/agents'; +import { useMemo } from 'react'; import { toast } from 'sonner'; import { UnifiedMessage, - ParsedContent, - ParsedMetadata, } from '@/components/thread/types'; -import { safeJsonParse } from '@/components/thread/utils'; -import { - createAccumulatorState, - clearAccumulator, - type ToolCallAccumulatorState, -} from '@agentpress/shared/streaming'; import { - orderContentBySequence, type TextChunk, -} from '@agentpress/shared/streaming'; -import { - mapAgentStatus, - preprocessStreamData, - isCompletionMessage, - parseStreamingMessage, - handleAssistantChunk, - handleToolCallChunk, - handleToolResult, - createMessageWithToolCalls, + useAgentStreamCore, + type StreamConfig, + type UseAgentStreamCoreCallbacks, } from '@agentpress/shared/streaming'; import { agentKeys } from '@/hooks/agents/keys'; import { composioKeys } from '@/hooks/composio/keys'; @@ -39,15 +18,18 @@ import { threadKeys } from '@/hooks/threads/keys'; import { usePricingModalStore } from '@/stores/pricing-modal-store'; import { accountStateKeys } from '@/hooks/billing'; import { clearToolTracking } from './tool-tracking'; +import { createClient } from '@/lib/supabase/client'; + +const API_URL = process.env.NEXT_PUBLIC_BACKEND_URL || ''; // Define the structure returned by the hook export interface UseAgentStreamResult { status: string; - textContent: string; + textContent: string; // String for compatibility with existing components toolCall: UnifiedMessage | null; // UnifiedMessage with metadata.tool_calls error: string | null; agentRunId: string | null; - startStreaming: (runId: string) => void; + startStreaming: (runId: string) => Promise; stopStreaming: () => Promise; } @@ -78,1016 +60,124 @@ export function useAgentStream( ): UseAgentStreamResult { const queryClient = useQueryClient(); - const [status, setStatus] = useState('idle'); - const [textContent, setTextContent] = useState([]); - - // Optimized streaming with requestAnimationFrame for smooth rendering - const rafRef = useRef(null); - const pendingContentRef = useRef<{ content: string; sequence?: number }[]>([]); - const lastFlushTimeRef = useRef(0); - - // Flush pending content using requestAnimationFrame for optimal rendering - const flushPendingContent = useCallback(() => { - if (pendingContentRef.current.length > 0) { - // Sort chunks by sequence before adding to state - const sortedContent = pendingContentRef.current.slice().sort((a, b) => { - const aSeq = a.sequence ?? 0; - const bSeq = b.sequence ?? 0; - return aSeq - bSeq; - }); - pendingContentRef.current = []; + // Build query keys array for invalidation + const queryKeys: (string | readonly string[])[] = [ + fileQueryKeys.all, + ['active-agent-runs'], + accountStateKeys.all, + threadKeys.messages(threadId), + ]; + + if (agentId) { + queryKeys.push( + agentKeys.all, + agentKeys.detail(agentId), + agentKeys.lists(), + agentKeys.details(), + ['agent-tools', agentId], + ['agent-tools'], + ['custom-mcp-tools', agentId], + ['custom-mcp-tools'], + composioKeys.mcpServers(), + composioKeys.profiles.all(), + composioKeys.profiles.credentials(), + ['triggers', agentId], + ['triggers'], + knowledgeBaseKeys.agent(agentId), + knowledgeBaseKeys.all, + ['versions'], + ['versions', 'list'], + ['versions', 'list', agentId], + ['versions', 'detail'], + ['version-store'], + ); + } + + // Create simplified config - core hook handles EventSource creation + const config: StreamConfig = { + apiUrl: API_URL || '', + getAuthToken: async () => { + const supabase = createClient(); + const { data: { session } } = await supabase.auth.getSession(); + return session?.access_token || null; + }, + createEventSource: (url: string) => new EventSource(url), + queryKeys, + handleBillingError: (errorMessage: string, balance?: string | null) => { + const messageLower = errorMessage.toLowerCase(); + const isCreditsExhausted = + messageLower.includes('insufficient credits') || + messageLower.includes('out of credits') || + messageLower.includes('no credits') || + messageLower.includes('balance'); + + const alertTitle = isCreditsExhausted + ? 'You ran out of credits' + : 'Billing check failed'; - React.startTransition(() => { - setTextContent((prev) => { - // Combine with existing content and sort all together - const combined = [...prev, ...sortedContent]; - // Deduplicate by sequence number - keep the latest chunk for each sequence - const deduplicated = new Map(); - for (const chunk of combined) { - const seq = chunk.sequence ?? 0; - // Keep the latest chunk for each sequence (later chunks overwrite earlier ones) - deduplicated.set(seq, chunk); - } - // Convert back to array and sort by sequence - return Array.from(deduplicated.values()).sort((a, b) => { - const aSeq = a.sequence ?? 0; - const bSeq = b.sequence ?? 0; - return aSeq - bSeq; - }); - }); + const alertSubtitle = balance + ? `Your current balance is ${balance} credits. Upgrade your plan to continue.` + : isCreditsExhausted + ? 'Upgrade your plan to get more credits and continue using the AI assistant.' + : 'Please upgrade to continue.'; + + usePricingModalStore.getState().openPricingModal({ + isAlert: true, + alertTitle, + alertSubtitle }); - lastFlushTimeRef.current = performance.now(); - } - rafRef.current = null; - }, []); - - const addContentThrottled = useCallback((content: { content: string; sequence?: number }) => { - pendingContentRef.current.push(content); - - // Use requestAnimationFrame for optimal rendering timing - // This syncs updates with the browser's render cycle for smoothest display - if (!rafRef.current) { - // If we have many pending chunks or it's been a while, flush immediately - const timeSinceLastFlush = performance.now() - lastFlushTimeRef.current; - if (pendingContentRef.current.length > 10 || timeSinceLastFlush > 50) { - // Immediate flush for responsiveness - rafRef.current = requestAnimationFrame(flushPendingContent); + }, + showToast: (message: string, type?: 'error' | 'success' | 'warning') => { + if (type === 'error') { + toast.error(message, { duration: 15000 }); + } else if (type === 'success') { + toast.success(message); + } else if (type === 'warning') { + toast.warning(message); } else { - // Schedule on next animation frame for smooth batching - rafRef.current = requestAnimationFrame(flushPendingContent); - } - } - }, [flushPendingContent]); - - const [toolCall, setToolCall] = useState(null); - const [error, setError] = useState(null); - const [agentRunId, setAgentRunId] = useState(null); - - const streamCleanupRef = useRef<(() => void) | null>(null); - const isMountedRef = useRef(true); - const currentRunIdRef = useRef(null); - const threadIdRef = useRef(threadId); - const setMessagesRef = useRef(setMessages); - - // DELTA STREAMING: Track accumulated tool call arguments with sequence numbers - const accumulatorRef = useRef(createAccumulatorState()); - - // Track previous tool call state to prevent unnecessary re-renders - const previousToolCallStateRef = useRef(null); - const lastToolCallUpdateTimeRef = useRef(0); - const THROTTLE_MS = 50; // Minimum time between updates (50ms = ~20 updates/sec max) - - // Store callbacks in ref to prevent handler recreation on every parent render - const callbacksRef = useRef(callbacks); - useEffect(() => { - callbacksRef.current = callbacks; - }, [callbacks]); - - const orderedTextContent = useMemo(() => { - return orderContentBySequence(textContent); - }, [textContent]); - - // Refs to capture current state for persistence - const statusRef = useRef(status); - const agentRunIdRef = useRef(agentRunId); - const textContentRef = useRef(textContent); - const toolCallRef = useRef(toolCall); - - // Update refs whenever state changes - useEffect(() => { - statusRef.current = status; - }, [status]); - - useEffect(() => { - agentRunIdRef.current = agentRunId; - }, [agentRunId]); - - useEffect(() => { - textContentRef.current = textContent; - }, [textContent]); - - useEffect(() => { - toolCallRef.current = toolCall; - }, [toolCall]); - - // On thread change, ensure any existing stream is cleaned up - useEffect(() => { - const previousThreadId = threadIdRef.current; - if ( - previousThreadId && - previousThreadId !== threadId && - streamCleanupRef.current - ) { - streamCleanupRef.current(); - streamCleanupRef.current = null; - // Cancel any pending RAF flush and clear pending content buffer - if (rafRef.current) { - cancelAnimationFrame(rafRef.current); - rafRef.current = null; - } - pendingContentRef.current = []; - setStatus('idle'); - setTextContent([]); - setToolCall(null); - setAgentRunId(null); - currentRunIdRef.current = null; - // Clear accumulated tool call deltas and previous state - clearAccumulator(accumulatorRef.current); - previousToolCallStateRef.current = null; - lastToolCallUpdateTimeRef.current = 0; - // Clear tool tracking when thread changes - clearToolTracking(); - } - threadIdRef.current = threadId; - }, [threadId]); - - useEffect(() => { - setMessagesRef.current = setMessages; - }, [setMessages]); - - // Use shared mapAgentStatus function (imported above) - - // Internal function to update status and notify consumer - // Uses callbacksRef to avoid recreating this function when callbacks change - const updateStatus = useCallback( - (newStatus: string) => { - if (isMountedRef.current) { - setStatus(newStatus); - callbacksRef.current.onStatusChange?.(newStatus); - if (newStatus === 'error' && error) { - callbacksRef.current.onError?.(error); - } - if ( - [ - 'completed', - 'stopped', - 'failed', - 'error', - 'agent_not_running', - ].includes(newStatus) - ) { - callbacksRef.current.onClose?.(newStatus); - } + toast(message); } }, - [error], - ); - - // Function to handle finalization of a stream - const finalizeStream = useCallback( - (finalStatus: string, runId: string | null = agentRunId) => { - if (!isMountedRef.current) return; - - const currentThreadId = threadIdRef.current; - const currentSetMessages = setMessagesRef.current; - - // Only finalize if this is for the current run ID or if no specific run ID is provided - if ( - runId && - currentRunIdRef.current && - currentRunIdRef.current !== runId - ) { - return; - } - - if (streamCleanupRef.current) { - streamCleanupRef.current(); - streamCleanupRef.current = null; - } - - // Reset streaming-specific state - // Cancel any pending RAF flush and clear pending content buffer - if (rafRef.current) { - cancelAnimationFrame(rafRef.current); - rafRef.current = null; - } - pendingContentRef.current = []; - setTextContent([]); - setToolCall(null); - // Clear accumulated tool call deltas and previous state - clearAccumulator(accumulatorRef.current); - previousToolCallStateRef.current = null; - lastToolCallUpdateTimeRef.current = 0; - // Clear tool tracking for new stream + clearToolTracking: () => { clearToolTracking(); - - // Update status and clear run ID - updateStatus(finalStatus); - setAgentRunId(null); - currentRunIdRef.current = null; - - queryClient.invalidateQueries({ - queryKey: fileQueryKeys.all, - }); - - queryClient.invalidateQueries({ - queryKey: ['active-agent-runs'], - }); - - // Invalidate account state after agent run completes (credits may have been deducted) - queryClient.invalidateQueries({ - queryKey: accountStateKeys.all, - }); - - queryClient.invalidateQueries({ - queryKey: threadKeys.messages(currentThreadId), - }); - - if (agentId) { - // Core agent data - queryClient.invalidateQueries({ queryKey: agentKeys.all }); - queryClient.invalidateQueries({ queryKey: agentKeys.detail(agentId) }); - queryClient.invalidateQueries({ queryKey: agentKeys.lists() }); - queryClient.invalidateQueries({ queryKey: agentKeys.details() }); - - // Agent tools and integrations - queryClient.invalidateQueries({ queryKey: ['agent-tools', agentId] }); - queryClient.invalidateQueries({ queryKey: ['agent-tools'] }); - - // MCP configurations - queryClient.invalidateQueries({ queryKey: ['custom-mcp-tools', agentId] }); - queryClient.invalidateQueries({ queryKey: ['custom-mcp-tools'] }); - queryClient.invalidateQueries({ queryKey: composioKeys.mcpServers() }); - queryClient.invalidateQueries({ queryKey: composioKeys.profiles.all() }); - queryClient.invalidateQueries({ queryKey: composioKeys.profiles.credentials() }); - - // Triggers - queryClient.invalidateQueries({ queryKey: ['triggers', agentId] }); - queryClient.invalidateQueries({ queryKey: ['triggers'] }); - - // Knowledge base - queryClient.invalidateQueries({ queryKey: knowledgeBaseKeys.agent(agentId) }); - queryClient.invalidateQueries({ queryKey: knowledgeBaseKeys.all }); - - queryClient.invalidateQueries({ queryKey: ['versions'] }); - queryClient.invalidateQueries({ queryKey: ['versions', 'list'] }); - queryClient.invalidateQueries({ queryKey: ['versions', 'list', agentId] }); - queryClient.invalidateQueries({ queryKey: ['versions', 'detail'] }); - queryClient.invalidateQueries({ - queryKey: ['versions', 'detail'], - predicate: (query) => { - return query.queryKey.includes(agentId); - } - }); - - // Invalidate any version store cache - queryClient.invalidateQueries({ queryKey: ['version-store'] }); - - // Force refetch of agent configuration data - queryClient.refetchQueries({ queryKey: agentKeys.detail(agentId) }); - queryClient.refetchQueries({ queryKey: ['versions', 'list', agentId] }); - } - - if ( - runId && - (finalStatus === 'completed' || - finalStatus === 'stopped' || - finalStatus === 'agent_not_running') - ) { - getAgentStatus(runId).catch((err) => {}); - } - }, - [agentRunId, updateStatus, agentId, queryClient], - ); - - // Stream message handler - const handleStreamMessage = useCallback( - (rawData: string) => { - if (!isMountedRef.current) return; - - const processedData = preprocessStreamData(rawData); - if (!processedData) return; - - // Early exit for completion messages - if (isCompletionMessage(processedData)) { - finalizeStream('completed', currentRunIdRef.current); - return; - } - - // Check for error messages first - try { - const jsonData = JSON.parse(processedData); - if (jsonData.status === 'error') { - console.error( - '[useAgentStream] Received error status message:', - jsonData, - ); - const errorMessage = jsonData.message || 'Unknown error occurred'; - const messageLower = errorMessage.toLowerCase(); - - // Check if this is a billing error - const isBillingError = - messageLower.includes('insufficient credits') || - messageLower.includes('credit') || - messageLower.includes('balance') || - messageLower.includes('out of credits') || - messageLower.includes('no credits') || - messageLower.includes('billing check failed'); - - if (isBillingError) { - React.startTransition(() => { - setError(errorMessage); - }); - callbacksRef.current.onError?.(errorMessage); - - const isCreditsExhausted = - messageLower.includes('insufficient credits') || - messageLower.includes('out of credits') || - messageLower.includes('no credits') || - messageLower.includes('balance'); - - // Extract balance from message if present - const balanceMatch = errorMessage.match(/balance is (-?\d+)\s*credits/i); - const balance = balanceMatch ? balanceMatch[1] : null; - - const alertTitle = isCreditsExhausted - ? 'You ran out of credits' - : 'Billing check failed'; - - const alertSubtitle = balance - ? `Your current balance is ${balance} credits. Upgrade your plan to continue.` - : isCreditsExhausted - ? 'Upgrade your plan to get more credits and continue using the AI assistant.' - : 'Please upgrade to continue.'; - - usePricingModalStore.getState().openPricingModal({ - isAlert: true, - alertTitle, - alertSubtitle - }); - return; - } - - React.startTransition(() => { - setError(errorMessage); - }); - toast.error(errorMessage, { duration: 15000 }); - callbacksRef.current.onError?.(errorMessage); - return; - } - // Check for stopped status with billing error message - if (jsonData.status === 'stopped' && jsonData.message) { - const message = jsonData.message.toLowerCase(); - const originalMessage = jsonData.message; - const isBillingError = - message.includes('insufficient credits') || - message.includes('credit') || - message.includes('balance') || - message.includes('out of credits') || - message.includes('no credits') || - message.includes('billing check failed'); - - if (isBillingError) { - console.error( - '[useAgentStream] Agent stopped due to billing error:', - jsonData.message, - ); - React.startTransition(() => { - setError(jsonData.message); - }); - callbacksRef.current.onError?.(jsonData.message); - - const isCreditsExhausted = - message.includes('insufficient credits') || - message.includes('out of credits') || - message.includes('no credits') || - message.includes('balance'); - - // Extract balance from message if present - const balanceMatch = originalMessage.match(/balance is (-?\d+)\s*credits/i); - const balance = balanceMatch ? balanceMatch[1] : null; - - const alertTitle = isCreditsExhausted - ? 'You ran out of credits' - : 'Billing check failed'; - - const alertSubtitle = balance - ? `Your current balance is ${balance} credits. Upgrade your plan to continue.` - : isCreditsExhausted - ? 'Upgrade your plan to get more credits and continue using the AI assistant.' - : 'Please upgrade to continue.'; - - usePricingModalStore.getState().openPricingModal({ - isAlert: true, - alertTitle, - alertSubtitle - }); - - finalizeStream('stopped', currentRunIdRef.current); - return; - } - } - // Handle completed status messages - if (jsonData.type === 'status' && jsonData.status === 'completed') { - finalizeStream('completed', currentRunIdRef.current); - return; - } - // Handle tool_output_stream messages for real-time shell output - if (jsonData.type === 'tool_output_stream') { - callbacksRef.current.onToolOutputStream?.({ - tool_call_id: jsonData.tool_call_id, - tool_name: jsonData.tool_name, - output: jsonData.output, - is_final: jsonData.is_final, - }); - return; - } - } catch (jsonError) { - // Not JSON or could not parse as JSON, continue processing - } - - // Process JSON messages - const message = parseStreamingMessage(processedData); - if (!message) { - console.warn( - '[useAgentStream] Failed to parse streamed message:', - processedData, - ); - return; - } - - const parsedContent = safeJsonParse(message.content, {}); - const parsedMetadata = safeJsonParse( - message.metadata, - {}, - ); - - // Update status to streaming if we receive a valid message - if (statusRef.current !== 'streaming') { - React.startTransition(() => { - updateStatus('streaming'); - }); - } - - switch (message.type) { - case 'assistant': - if (parsedMetadata.stream_status === 'tool_call_chunk') { - // Handle tool call chunks using shared utilities - const reconstructedToolCalls = handleToolCallChunk( - message, - parsedMetadata, - accumulatorRef.current - ); - - if (reconstructedToolCalls) { - // Create updated message with reconstructed tool calls - const updatedMessage = createMessageWithToolCalls( - message, - parsedMetadata, - reconstructedToolCalls - ); - - // Create a stable representation for comparison to prevent unnecessary re-renders - const currentStateKey = JSON.stringify({ - toolCallIds: reconstructedToolCalls.map(tc => tc.tool_call_id), - functionNames: reconstructedToolCalls.map(tc => tc.function_name), - argLengths: reconstructedToolCalls.map(tc => - typeof tc.arguments === 'string' ? tc.arguments.length : JSON.stringify(tc.arguments).length - ), - count: reconstructedToolCalls.length, - }); - - // Check if there's a meaningful change - const hasChanged = previousToolCallStateRef.current !== currentStateKey; - - // Throttle updates: allow immediate update if structure changed (new tool call, function name change) - // or if enough time has passed since last update - const now = performance.now(); - const timeSinceLastUpdate = now - lastToolCallUpdateTimeRef.current; - - let structureChanged = false; - if (hasChanged) { - if (previousToolCallStateRef.current === null) { - structureChanged = true; // First update - } else { - try { - const currentState = JSON.parse(currentStateKey); - const previousState = JSON.parse(previousToolCallStateRef.current); - // Check if count changed (new tool call added) - const countChanged = currentState.count !== previousState.count; - // Check if function names changed - const functionNamesChanged = JSON.stringify(currentState.functionNames || []) !== - JSON.stringify(previousState.functionNames || []); - structureChanged = countChanged || functionNamesChanged; - } catch (e) { - // If parsing fails, treat as structure change to be safe - structureChanged = true; - } - } - } - - const shouldUpdate = structureChanged || (hasChanged && timeSinceLastUpdate >= THROTTLE_MS); - - if (shouldUpdate) { - previousToolCallStateRef.current = currentStateKey; - lastToolCallUpdateTimeRef.current = now; - - // Set toolCall state with ALL reconstructed tool calls (non-urgent update) - React.startTransition(() => { - setToolCall(updatedMessage); - }); - } - - // Always call the callback to ensure downstream handlers get updates - callbacksRef.current.onToolCallChunk?.(updatedMessage); - } - } else { - // Handle text chunks - const chunkContent = handleAssistantChunk(message, parsedContent, parsedMetadata); - if (chunkContent) { - // Use throttled approach for smoother streaming - addContentThrottled({ - sequence: message.sequence, - content: chunkContent, - }); - callbacksRef.current.onAssistantChunk?.({ content: chunkContent }); - } else if (parsedMetadata.stream_status === 'complete') { - // Flush any pending content before completing - flushPendingContent(); - - React.startTransition(() => { - setTextContent([]); - setToolCall(null); - }); - // Clear accumulated tool call deltas and previous state when assistant message completes - clearAccumulator(accumulatorRef.current); - previousToolCallStateRef.current = null; - lastToolCallUpdateTimeRef.current = 0; - if (message.message_id) callbacksRef.current.onMessage(message); - } else if (!parsedMetadata.stream_status) { - // Handle non-chunked assistant messages if needed - callbacksRef.current.onAssistantStart?.(); - if (message.message_id) callbacksRef.current.onMessage(message); - } - } - break; - case 'tool': - // Handle tool result using shared utilities - const reconstructedToolCallsFromResult = handleToolResult( - message, - parsedMetadata, - accumulatorRef.current - ); - - if (reconstructedToolCallsFromResult) { - // Update streamingToolCall to include this completed tool with its result - const updatedMessageWithResults = createMessageWithToolCalls( - message, - parsedMetadata, - reconstructedToolCallsFromResult - ); - - // Force update to streamingToolCall state - React.startTransition(() => { - setToolCall(updatedMessageWithResults); - }); - - // Also call the callback to notify downstream handlers - callbacksRef.current.onToolCallChunk?.(updatedMessageWithResults); - } - - // DO NOT clear accumulator - other tools may still be streaming - // Only clear when assistant message completes - if (message.message_id) callbacksRef.current.onMessage(message); - break; - case 'status': - switch (parsedContent.status_type) { - case 'tool_completed': - case 'tool_failed': - case 'tool_error': - // Don't clear toolCall state here - other tools may still be streaming - // Individual tool completion is handled by useThreadToolCalls via the messages array - // DO NOT clear accumulated tool calls - status messages don't indicate all tools are done - // Only clear when assistant message completes - break; - case 'finish': - // Optional: Handle finish reasons like 'xml_tool_limit_reached' - // Don't finalize here, wait for thread_run_end or completion message - break; - case 'error': - React.startTransition(() => { - setError(parsedContent.message || 'Worker run failed'); - }); - finalizeStream('error', currentRunIdRef.current); - break; - default: - break; - } - break; - case 'llm_response_end': - case 'llm_response_start': - // llm_response_end and llm_response_start messages are ignored (metadata only) - break; - case 'user': - case 'system': - // Handle other message types if necessary - if (message.message_id) callbacksRef.current.onMessage(message); - break; - default: - console.warn( - '[useAgentStream] Unhandled message type:', - message.type, - ); - } - }, - [ - finalizeStream, - updateStatus, - addContentThrottled, - flushPendingContent, - ], - ); - - const handleStreamError = useCallback( - (err: Error | string | Event) => { - if (!isMountedRef.current) return; - - // Extract error message - let errorMessage = 'Unknown streaming error'; - if (typeof err === 'string') { - errorMessage = err; - } else if (err instanceof Error) { - errorMessage = err.message; - } else if (err instanceof Event && err.type === 'error') { - errorMessage = 'Stream connection error'; - } - - const lower = errorMessage.toLowerCase(); - const isExpected = - lower.includes('not found') || lower.includes('not running'); - - if (!isExpected) { - console.error('[useAgentStream] Streaming error:', errorMessage, err); - setError(errorMessage); - toast.error(errorMessage, { duration: 15000 }); - } - - const runId = currentRunIdRef.current; - if (!runId) { - finalizeStream('error'); - return; - } }, - [finalizeStream], - ); - - const handleStreamClose = useCallback(() => { - if (!isMountedRef.current) return; - - const runId = currentRunIdRef.current; - const currentStatus = status; - - // If we've already finalized the stream (completed/stopped/error), don't show error - if ( - currentStatus === 'completed' || - currentStatus === 'stopped' || - currentStatus === 'error' || - currentStatus === 'agent_not_running' - ) { - // Stream closed normally after completion - return; - } - - if (!runId) { - // If status was streaming, something went wrong, finalize as error - if (currentStatus === 'streaming' || currentStatus === 'connecting') { - finalizeStream('error'); - } else if ( - currentStatus !== 'idle' && - currentStatus !== 'completed' && - currentStatus !== 'stopped' && - currentStatus !== 'agent_not_running' - ) { - finalizeStream('idle'); - } - return; - } - - // Add a small delay to account for DB update race condition - // The stream might close normally, but status check happens before DB updates - setTimeout(() => { - if (!isMountedRef.current) return; - if (currentRunIdRef.current !== runId) return; - - // Double-check status wasn't finalized while waiting - // If status changed to completed/stopped, don't show error - if ( - status === 'completed' || - status === 'stopped' || - status === 'error' || - status === 'agent_not_running' - ) { - return; - } - - getAgentStatus(runId) - .then((agentStatus) => { - if (!isMountedRef.current) return; - - // Check if this is still the current run ID - if (currentRunIdRef.current !== runId) { - return; - } - - // Final check - if status was finalized while waiting, don't show error - if ( - status === 'completed' || - status === 'stopped' || - status === 'error' || - status === 'agent_not_running' - ) { - return; - } - - // Only show error if agent is still running AND we didn't receive completion - if (agentStatus.status === 'running') { - setError('Stream closed unexpectedly while agent was running.'); - finalizeStream('error', runId); - toast.warning('Stream disconnected. Worker might still be running.'); - } else if (agentStatus.status === 'stopped') { - // Check if agent stopped due to billing error - const errorMessage = agentStatus.error || ''; - const lower = errorMessage.toLowerCase(); - const isBillingError = - lower.includes('insufficient credits') || - lower.includes('credit') || - lower.includes('balance') || - lower.includes('out of credits') || - lower.includes('no credits') || - lower.includes('billing check failed'); - - if (isBillingError && errorMessage) { - console.error( - `[useAgentStream] Agent stopped due to billing error: ${errorMessage}`, - ); - setError(errorMessage); - callbacksRef.current.onError?.(errorMessage); - - const isCreditsExhausted = - lower.includes('insufficient credits') || - lower.includes('out of credits') || - lower.includes('no credits') || - lower.includes('balance'); - - // Extract balance from message if present - const balanceMatch = errorMessage.match(/balance is (-?\d+)\s*credits/i); - const balance = balanceMatch ? balanceMatch[1] : null; - - const alertTitle = isCreditsExhausted - ? 'You ran out of credits' - : 'Billing check failed'; - - const alertSubtitle = balance - ? `Your current balance is ${balance} credits. Upgrade your plan to continue.` - : isCreditsExhausted - ? 'Upgrade your plan to get more credits and continue using the AI assistant.' - : 'Please upgrade to continue.'; - - usePricingModalStore.getState().openPricingModal({ - isAlert: true, - alertTitle, - alertSubtitle - }); - } - - const finalStatus = mapAgentStatus(agentStatus.status); - finalizeStream(finalStatus, runId); - } else { - // Agent completed successfully or is in another valid state - const finalStatus = mapAgentStatus(agentStatus.status); - finalizeStream(finalStatus, runId); - } - }) - .catch((err) => { - if (!isMountedRef.current) return; - - // Check if this is still the current run ID - if (currentRunIdRef.current !== runId) { - return; - } - - const errorMessage = err instanceof Error ? err.message : String(err); - console.error( - `[useAgentStream] Error checking agent status for ${runId} after stream close: ${errorMessage}`, - ); - - const isNotFoundError = - errorMessage.includes('not found') || - errorMessage.includes('404') || - errorMessage.includes('does not exist'); - - if (isNotFoundError) { - finalizeStream('agent_not_running', runId); - } else { - finalizeStream('error', runId); - } - }); - }, 500); // Wait 500ms to allow DB to update after stream completion - }, [status, finalizeStream]); - - // Effect to manage the stream lifecycle - useEffect(() => { - isMountedRef.current = true; - - return () => { - isMountedRef.current = false; - - // Clean up requestAnimationFrame - if (rafRef.current) { - cancelAnimationFrame(rafRef.current); - rafRef.current = null; - } - - // Flush any remaining pending content - flushPendingContent(); - }; - }, [flushPendingContent]); - - // Public Functions - const startStreaming = useCallback( - async (runId: string) => { - if (!isMountedRef.current) return; - - // Store previous stream cleanup for potential restoration - const previousCleanup = streamCleanupRef.current; - const previousRunId = currentRunIdRef.current; - - try { - // Verify agent is running BEFORE cleaning up previous stream - const agentStatus = await getAgentStatus(runId); - if (!isMountedRef.current) return; - - if (agentStatus.status !== 'running') { - const final = - agentStatus.status === 'completed' || - agentStatus.status === 'stopped' - ? mapAgentStatus(agentStatus.status) - : 'agent_not_running'; - - if (!previousRunId || previousRunId === runId) { - finalizeStream(final, runId); - } - return; - } - - // New agent is running, now it's safe to clean up previous stream - if (previousCleanup && previousRunId !== runId) { - previousCleanup(); - streamCleanupRef.current = null; - } - - // Reset state for the new stream - // Cancel any pending RAF flush and clear pending content buffer - if (rafRef.current) { - cancelAnimationFrame(rafRef.current); - rafRef.current = null; - } - pendingContentRef.current = []; - setTextContent([]); - setToolCall(null); - setError(null); - updateStatus('connecting'); - setAgentRunId(runId); - currentRunIdRef.current = runId; - // Clear accumulated tool call deltas and previous state - clearAccumulator(accumulatorRef.current); - previousToolCallStateRef.current = null; - lastToolCallUpdateTimeRef.current = 0; - // Clear tool tracking for new stream - clearToolTracking(); - - // Agent is running, proceed to create the stream - const cleanup = streamAgent(runId, { - onMessage: (data) => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamMessage(data); - }, - onError: (err) => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamError(err); - }, - onClose: () => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamClose(); - }, - }); - streamCleanupRef.current = cleanup; - - // Status will be updated to 'streaming' by the first message received - // If no message arrives shortly, verify liveness again - setTimeout(async () => { - if (!isMountedRef.current) return; - if (currentRunIdRef.current !== runId) return; - if (statusRef.current === 'streaming') return; - try { - const latest = await getAgentStatus(runId); - if (!isMountedRef.current) return; - if (currentRunIdRef.current !== runId) return; - if (latest.status !== 'running') { - finalizeStream( - mapAgentStatus(latest.status) || 'agent_not_running', - runId, - ); - } - } catch { - // ignore - } - }, 1500); - } catch (err) { - if (!isMountedRef.current) return; - - // Only handle error if this is still the current run ID - if (currentRunIdRef.current !== runId) { - return; - } + }; - const errorMessage = err instanceof Error ? err.message : String(err); - const lower = errorMessage.toLowerCase(); - const isExpected = - lower.includes('not found') || - lower.includes('404') || - lower.includes('does not exist') || - lower.includes('not running'); + // Map callbacks to core callbacks + const coreCallbacks: UseAgentStreamCoreCallbacks = { + onMessage: callbacks.onMessage, + onStatusChange: callbacks.onStatusChange, + onError: callbacks.onError, + onClose: callbacks.onClose, + onAssistantStart: callbacks.onAssistantStart, + onAssistantChunk: callbacks.onAssistantChunk, + onToolCallChunk: callbacks.onToolCallChunk, + onToolOutputStream: callbacks.onToolOutputStream, + }; - if (isExpected) { - if (!previousRunId || previousRunId === runId) { - finalizeStream('agent_not_running', runId); - } - } else { - console.error( - `[useAgentStream] Error initiating stream for ${runId}: ${errorMessage}`, - ); - setError(errorMessage); - - if (!previousRunId || previousRunId === runId) { - finalizeStream('error', runId); - } else { - currentRunIdRef.current = previousRunId; - setAgentRunId(previousRunId); - } - } - } - }, - [ - threadId, - updateStatus, - finalizeStream, - handleStreamMessage, - handleStreamError, - handleStreamClose, - ], + // Use the core hook + const coreResult = useAgentStreamCore( + config, + coreCallbacks, + threadId, + setMessages, + queryClient, + { type: 'raf' } // Frontend uses RAF throttling ); - const stopStreaming = useCallback(async () => { - if (!isMountedRef.current || !agentRunId) return; - - const runIdToStop = agentRunId; - - // Immediately update status and clean up stream - finalizeStream('stopped', runIdToStop); - - try { - await stopAgent(runIdToStop); - toast.success('Worker stopped.'); - } catch (err) { - const errorMessage = err instanceof Error ? err.message : String(err); - console.error( - `[useAgentStream] Error sending stop request for ${runIdToStop}: ${errorMessage}`, - ); - toast.error(`Failed to stop Worker: ${errorMessage}`); - } - }, [agentRunId, finalizeStream]); + // Convert TextChunk[] to string for compatibility with existing components + const textContentString = useMemo(() => { + if (!coreResult.textContent || coreResult.textContent.length === 0) return ''; + return coreResult.textContent.map(chunk => chunk.content).join(''); + }, [coreResult.textContent]); return { - status, - textContent: orderedTextContent, - toolCall, - error, - agentRunId, - startStreaming, - stopStreaming, + status: coreResult.status, + textContent: textContentString, + toolCall: coreResult.toolCall, + error: coreResult.error, + agentRunId: coreResult.agentRunId, + startStreaming: coreResult.startStreaming, + stopStreaming: coreResult.stopStreaming, }; } diff --git a/apps/frontend/src/lib/api/agents.ts b/apps/frontend/src/lib/api/agents.ts index a843b2afbc..211c20b7e6 100644 --- a/apps/frontend/src/lib/api/agents.ts +++ b/apps/frontend/src/lib/api/agents.ts @@ -683,7 +683,13 @@ export const streamAgent = ( }; eventSource.onerror = (event) => { - console.error(`[STREAM] EventSource error for ${agentRunId}:`, event); + // EventSource.onerror fires on normal close too, check readyState first + // Only log if it's actually an error (readyState !== CLOSED) or if we can't determine + const isActualError = eventSource.readyState !== EventSource.CLOSED; + + if (isActualError) { + console.error(`[STREAM] EventSource error for ${agentRunId}:`, event); + } getAgentStatus(agentRunId) .then((status) => { @@ -694,22 +700,24 @@ export const streamAgent = ( } }) .catch((err) => { - console.error( - `[STREAM] Error checking agent status after stream error:`, - err, - ); - const errMsg = err instanceof Error ? err.message : String(err); const isNotFoundErr = errMsg.includes('not found') || errMsg.includes('404') || - errMsg.includes('does not exist'); + errMsg.includes('does not exist') || + errMsg.includes('is not running'); if (isNotFoundErr) { + // Expected: agent run completed or doesn't exist nonRunningAgentRuns.add(agentRunId); cleanupEventSource(agentRunId, 'agent not found'); callbacks.onClose(); } else { + // Only log actual errors + console.error( + `[STREAM] Error checking agent status after stream error:`, + err, + ); console.warn(`[STREAM] Cleaning up stream for ${agentRunId} due to persistent error`); cleanupEventSource(agentRunId, 'persistent error'); callbacks.onError(errMsg); diff --git a/apps/mobile/hooks/useAgentStream.ts b/apps/mobile/hooks/useAgentStream.ts index 7bfdb6b779..037edc3c2c 100644 --- a/apps/mobile/hooks/useAgentStream.ts +++ b/apps/mobile/hooks/useAgentStream.ts @@ -1,38 +1,23 @@ -import { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { useQueryClient } from '@tanstack/react-query'; +import { useMemo } from 'react'; import EventSource from 'react-native-sse'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import type { UnifiedMessage, ParsedContent, ParsedMetadata } from '@agentpress/shared'; +import type { UnifiedMessage } from '@agentpress/shared'; import { API_URL, getAuthToken } from '@/api/config'; -import { safeJsonParse } from '@agentpress/shared'; import { chatKeys } from '@/lib/chat'; import { - createAccumulatorState, - clearAccumulator, - type ToolCallAccumulatorState, -} from '@agentpress/shared/streaming'; -import { - orderContentBySequence, type TextChunk, -} from '@agentpress/shared/streaming'; -import { - mapAgentStatus, - preprocessStreamData, - isCompletionMessage, - parseStreamingMessage, - handleAssistantChunk, - handleToolCallChunk, - handleToolResult, - createMessageWithToolCalls, + useAgentStreamCore, + type StreamConfig, + type UseAgentStreamCoreCallbacks, } from '@agentpress/shared/streaming'; interface UseAgentStreamResult { status: string; - textContent: string; - toolCall: UnifiedMessage | null; // Changed from ParsedContent to UnifiedMessage + textContent: string; // String for compatibility with existing components + toolCall: UnifiedMessage | null; error: string | null; agentRunId: string | null; - startStreaming: (runId: string) => void; + startStreaming: (runId: string) => Promise; stopStreaming: () => Promise; } @@ -54,841 +39,61 @@ export function useAgentStream( ): UseAgentStreamResult { const queryClient = useQueryClient(); - const [status, setStatus] = useState('idle'); - const [textContent, setTextContent] = useState([]); - - // Throttled state updates for smoother streaming - const throttleRef = useRef | null>(null); - const pendingContentRef = useRef<{ content: string; sequence?: number }[]>([]); - - // Throttled content update function for smoother streaming - const flushPendingContent = useCallback(() => { - // Clear and release any pending throttle to avoid starving updates - if (throttleRef.current) { - clearTimeout(throttleRef.current); - throttleRef.current = null; - } - - if (pendingContentRef.current.length > 0) { - // Sort chunks by sequence before adding to state - const sortedContent = pendingContentRef.current.slice().sort((a, b) => { - const aSeq = a.sequence ?? 0; - const bSeq = b.sequence ?? 0; - return aSeq - bSeq; - }); - pendingContentRef.current = []; - - // Use React.startTransition for smoother updates (works in React Native) - setTextContent((prev) => { - // Combine with existing content and sort all together - const combined = [...prev, ...sortedContent]; - return combined.sort((a, b) => { - const aSeq = a.sequence ?? 0; - const bSeq = b.sequence ?? 0; - return aSeq - bSeq; - }); - }); - } - }, []); - - const addContentThrottled = useCallback((content: { content: string; sequence?: number }) => { - pendingContentRef.current.push(content); - - // True throttle: only schedule a flush if one isn't already pending - if (throttleRef.current) { - return; - } - - // Set throttle for smooth updates (16ms ≈ 60fps) - throttleRef.current = setTimeout(() => { - flushPendingContent(); - }, 16); - }, [flushPendingContent]); - - const [toolCall, setToolCall] = useState(null); // Changed from ParsedContent - const [error, setError] = useState(null); - const [agentRunId, setAgentRunId] = useState(null); - - const streamCleanupRef = useRef<(() => void) | null>(null); - const isMountedRef = useRef(true); - const currentRunIdRef = useRef(null); - const threadIdRef = useRef(threadId); - const setMessagesRef = useRef(setMessages); - const retryTimeoutRef = useRef | null>(null); - const retryCountRef = useRef(0); - const startStreamingRef = useRef<((runId: string) => void) | null>(null); - - // DELTA STREAMING: Track accumulated tool call arguments with sequence numbers - const accumulatorRef = useRef(createAccumulatorState()); - - const orderedTextContent = useMemo(() => { - return orderContentBySequence(textContent); - }, [textContent]); - - // Refs to capture current state for persistence - const statusRef = useRef(status); - const agentRunIdRef = useRef(agentRunId); - const textContentRef = useRef(textContent); - - // Update refs whenever state changes - useEffect(() => { - statusRef.current = status; - }, [status]); - - useEffect(() => { - agentRunIdRef.current = agentRunId; - }, [agentRunId]); - - useEffect(() => { - textContentRef.current = textContent; - }, [textContent]); - - // On thread change, ensure any existing stream is cleaned up - useEffect(() => { - const previousThreadId = threadIdRef.current; - const cleanup = streamCleanupRef.current; - const isRealThreadSwitch = - previousThreadId && - threadId && - previousThreadId !== threadId && - cleanup; - - if (isRealThreadSwitch && cleanup) { - console.log(`[useAgentStream] Thread changed from ${previousThreadId} to ${threadId}, cleaning up stream`); - cleanup(); - streamCleanupRef.current = null; - setStatus('idle'); - setTextContent([]); - setToolCall(null); - setAgentRunId(null); - currentRunIdRef.current = null; - // Clear accumulated tool call deltas and previous state - clearAccumulator(accumulatorRef.current); - - if (retryTimeoutRef.current) { - clearTimeout(retryTimeoutRef.current); - retryTimeoutRef.current = null; - } - retryCountRef.current = 0; - } - threadIdRef.current = threadId; - }, [threadId]); - - useEffect(() => { - setMessagesRef.current = setMessages; - }, [setMessages]); - - // Use shared mapAgentStatus function (imported above) - - // Internal function to update status and notify consumer - const updateStatus = useCallback( - (newStatus: string) => { - if (isMountedRef.current) { - setStatus(newStatus); - callbacks.onStatusChange?.(newStatus); - if (newStatus === 'error' && error) { - callbacks.onError?.(error); - } - if ( - [ - 'completed', - 'stopped', - 'failed', - 'error', - 'agent_not_running', - ].includes(newStatus) - ) { - callbacks.onClose?.(newStatus); - } - } - }, - [callbacks, error], - ); - - // Function to handle finalization of a stream - const finalizeStream = useCallback( - (finalStatus: string, runId: string | null = agentRunId) => { - if (!isMountedRef.current) return; - - console.log( - `[useAgentStream] Finalizing stream with status: ${finalStatus}, runId: ${runId}`, - ); - - const currentThreadId = threadIdRef.current; - const currentSetMessages = setMessagesRef.current; - - // Only finalize if this is for the current run ID or if no specific run ID is provided - if ( - runId && - currentRunIdRef.current && - currentRunIdRef.current !== runId - ) { - console.log( - `[useAgentStream] Ignoring finalization for old run ID ${runId}, current is ${currentRunIdRef.current}`, - ); - return; - } - - if (streamCleanupRef.current) { - streamCleanupRef.current(); - streamCleanupRef.current = null; - } - - // Reset streaming-specific state - setTextContent([]); - setToolCall(null); - - // Update status and clear run ID - updateStatus(finalStatus); - setAgentRunId(null); - currentRunIdRef.current = null; - - queryClient.invalidateQueries({ - queryKey: ['active-agent-runs'], - }); - - // Refetch thread messages to ensure all messages are synced with the database - queryClient.invalidateQueries({ - queryKey: chatKeys.messages(currentThreadId), - }); - - if (agentId) { - queryClient.invalidateQueries({ queryKey: ['agents'] }); - queryClient.invalidateQueries({ queryKey: ['agent', agentId] }); - } - - if ( - runId && - (finalStatus === 'completed' || - finalStatus === 'stopped' || - finalStatus === 'agent_not_running') - ) { - getAgentStatus(runId).catch((err) => {}); - } - }, - [agentRunId, updateStatus, agentId, queryClient], - ); - - // Stream message handler - const handleStreamMessage = useCallback( - (rawData: string) => { - if (!isMountedRef.current) return; - - const processedData = preprocessStreamData(rawData); - if (!processedData) return; - - // Early exit for completion messages - if (isCompletionMessage(processedData)) { - finalizeStream('completed', currentRunIdRef.current); - return; - } - - // Check for error messages and special message types first - try { - const jsonData = JSON.parse(processedData); - if (jsonData.status === 'error') { - console.error( - '[useAgentStream] Received error status message:', - jsonData, - ); - const errorMessage = jsonData.message || 'Unknown error occurred'; - setError(errorMessage); - callbacks.onError?.(errorMessage); - return; - } - // Handle ping messages (keep-alive) - only ignore if truly empty - if (jsonData.type === 'ping') { - // Only ignore ping if it has no content field or content is empty - if (!jsonData.content) { - return; - } - // If ping has content, log it and continue processing (shouldn't happen, but safer) - console.log('[useAgentStream] ⚠️ Ping message with content, continuing processing:', { - hasContent: !!jsonData.content, - contentLength: jsonData.content?.length, - }); - // Continue to normal processing path below - } - // Handle tool_output_stream messages - only ignore if truly empty - if (jsonData.type === 'tool_output_stream') { - // Log what we're receiving for debugging - console.log('[useAgentStream] 📦 Received tool_output_stream message:', { - tool_call_id: jsonData.tool_call_id, - tool_name: jsonData.tool_name, - hasOutput: !!jsonData.output, - outputLength: jsonData.output?.length, - is_final: jsonData.is_final, - }); - - // Only ignore tool_output_stream if it has no output field or output is empty - if (!jsonData.output) { - console.log('[useAgentStream] Ignoring empty tool_output_stream'); - return; - } - - // If tool_output_stream has output but shouldn't be processed as text, log it - // Note: tool_output_stream is for tool output streaming, not regular text chunks - // But we log it to help debug if text chunks are being mislabeled - const outputStr = typeof jsonData.output === 'string' ? jsonData.output : String(jsonData.output); - console.log('[useAgentStream] ⚠️ tool_output_stream with output (not processing as text):', { - outputPreview: outputStr.substring(0, 100), - outputLength: outputStr.length, - outputType: typeof jsonData.output, - }); - // Continue to normal processing path below - this allows the message to be processed - // if it's actually a mislabeled text chunk, but typically tool_output_stream - // should be handled separately (not implemented in mobile yet) - } - } catch (jsonError) { - // Not JSON or could not parse as JSON, continue processing - } - - // Process JSON messages - const message = parseStreamingMessage(processedData); - if (!message) { - console.warn( - '[useAgentStream] Failed to parse streamed message:', - processedData, - ); - return; - } - - const parsedContent = safeJsonParse(message.content, {}); - const parsedMetadata = safeJsonParse( - message.metadata, - {}, - ); - - // Update status to streaming if we receive a valid message - if (statusRef.current !== 'streaming') { - updateStatus('streaming'); - } - - switch (message.type) { - case 'assistant': - if (parsedMetadata.stream_status === 'tool_call_chunk') { - // Handle tool call chunks using shared utilities - const reconstructedToolCalls = handleToolCallChunk( - message, - parsedMetadata, - accumulatorRef.current - ); - - if (reconstructedToolCalls) { - // Create updated message with reconstructed tool calls - const updatedMessage = createMessageWithToolCalls( - message, - parsedMetadata, - reconstructedToolCalls - ); - - // Set toolCall state with ALL reconstructed tool calls - setToolCall(updatedMessage); - // Call the callback with the reconstructed message - callbacks.onToolCallChunk?.(updatedMessage); - } - } else { - // Handle text chunks - const chunkContent = handleAssistantChunk(message, parsedContent, parsedMetadata); - if (chunkContent) { - if (retryCountRef.current > 0) { - console.log('[useAgentStream] Successfully connected, resetting retry counter'); - retryCountRef.current = 0; - } - - // Use throttled approach for smoother streaming - addContentThrottled({ - sequence: message.sequence, - content: chunkContent, - }); - callbacks.onAssistantChunk?.({ content: chunkContent }); - } else if (parsedMetadata.stream_status === 'complete') { - // Flush any pending content before completing - flushPendingContent(); - - console.log(`[useAgentStream] 🏁 Assistant message complete - clearing tool call state`); - - setTextContent([]); - setToolCall(null); - // Clear accumulated tool call deltas and previous state when assistant message completes - clearAccumulator(accumulatorRef.current); - if (message.message_id) callbacks.onMessage(message); - } else if (!parsedMetadata.stream_status) { - // Handle non-chunked assistant messages if needed - callbacks.onAssistantStart?.(); - if (message.message_id) callbacks.onMessage(message); - } - } - break; - case 'tool': - // Handle tool result using shared utilities - const reconstructedToolCallsFromResult = handleToolResult( - message, - parsedMetadata, - accumulatorRef.current - ); - - if (reconstructedToolCallsFromResult) { - // Update streamingToolCall to include this completed tool with its result - const updatedMessageWithResults = createMessageWithToolCalls( - message, - parsedMetadata, - reconstructedToolCallsFromResult - ); - - console.log(`[useAgentStream] 🔄 Updating tool call state with result`, { - totalToolCalls: reconstructedToolCallsFromResult.length, - completedCount: reconstructedToolCallsFromResult.filter((tc: any) => tc.completed).length, - toolCallsWithResults: reconstructedToolCallsFromResult.filter((tc: any) => tc.tool_result).length, - }); - - // Force update to streamingToolCall state - setToolCall(updatedMessageWithResults); - - // Also call the callback to notify downstream handlers - callbacks.onToolCallChunk?.(updatedMessageWithResults); - } - - // DO NOT clear accumulator - other tools may still be streaming - // Only clear when assistant message completes - if (message.message_id) callbacks.onMessage(message); - break; - case 'status': - switch (parsedContent.status_type) { - case 'tool_completed': - case 'tool_failed': - case 'tool_error': - console.log(`[useAgentStream] 📊 Status message: ${parsedContent.status_type}`, { - message: parsedContent.message, - accumulatedToolCalls: accumulatorRef.current.accumulatedToolCalls.size, - completedToolCalls: accumulatorRef.current.completedToolCallIds.size, - toolResults: accumulatorRef.current.toolResults.size, - }); - // Don't clear toolCall state here - other tools may still be streaming - // Individual tool completion is handled by useThreadToolCalls via the messages array - // DO NOT clear accumulated tool calls - status messages don't indicate all tools are done - // Only clear when assistant message completes - break; - case 'finish': - // Optional: Handle finish reasons like 'xml_tool_limit_reached' - // Don't finalize here, wait for thread_run_end or completion message - break; - // case 'thread_run_end': - // // Thread run has ended - finalize the stream - // console.log(`[useAgentStream] 🏁 Thread run ended - finalizing stream`); - // finalizeStream('completed', currentRunIdRef.current); - // break; - case 'error': - setError(parsedContent.message || 'Worker run failed'); - finalizeStream('error', currentRunIdRef.current); - break; - default: - break; - } - break; - case 'llm_response_end': - case 'llm_response_start': - // llm_response_end and llm_response_start messages are ignored (metadata only) - break; - case 'user': - case 'system': - // Handle other message types if necessary - if (message.message_id) callbacks.onMessage(message); - break; - default: - // Note: ping and tool_output_stream messages are handled in the error checking section above - // and return early, so they shouldn't reach here. If they do, ignore them silently. - const messageType = (message as any).type; - if (messageType === 'ping' || messageType === 'tool_output_stream') { - // These are handled in the error checking section above, ignore here - break; - } - console.warn( - '[useAgentStream] Unhandled message type:', - message.type, - ); - } - }, - [ - status, - toolCall, - callbacks, - finalizeStream, - updateStatus, - addContentThrottled, - flushPendingContent, - ], - ); - - const handleStreamError = useCallback( - (err: any) => { - if (!isMountedRef.current) return; - - let errorMessage = 'Unknown streaming error'; - let is404 = false; - - if (typeof err === 'string') { - errorMessage = err; - } else if (err instanceof Error) { - errorMessage = err.message; - } else if (err && typeof err === 'object') { - if (err.xhrStatus === 404) { - is404 = true; - errorMessage = 'Stream endpoint not found (404) - run may still be initializing'; - } else if (err.message) { - errorMessage = err.message; - } else if (err.type === 'error') { - errorMessage = 'Stream connection error'; - } - } + // Build query keys array for invalidation + const queryKeys: (string | readonly string[])[] = [ + ['active-agent-runs'], + chatKeys.messages(threadId), + ]; - const lower = errorMessage.toLowerCase(); - const isExpected = - is404 || - lower.includes('not found') || - lower.includes('not running') || - lower.includes('404'); - - const runId = currentRunIdRef.current; - - if (isExpected) { - console.info('[useAgentStream] Stream endpoint not ready (expected for new runs):', errorMessage); - - if (is404 && runId) { - console.log(`[useAgentStream] Current retry count before increment: ${retryCountRef.current}`); - - if (retryCountRef.current < 3) { - retryCountRef.current += 1; - const retryDelay = retryCountRef.current * 1000; - console.log(`[useAgentStream] Scheduling retry ${retryCountRef.current}/3 in ${retryDelay}ms for run ${runId}`); - - if (streamCleanupRef.current) { - streamCleanupRef.current(); - streamCleanupRef.current = null; - } - - retryTimeoutRef.current = setTimeout(() => { - if (isMountedRef.current && currentRunIdRef.current === runId && startStreamingRef.current) { - console.log(`[useAgentStream] Retrying stream connection for run ${runId}, retry count at execution: ${retryCountRef.current}`); - startStreamingRef.current(runId); - } - }, retryDelay); - } else { - console.warn(`[useAgentStream] Max retries (3) reached for run ${runId}, giving up`); - finalizeStream('error', runId); - } - } - return; - } - - console.error('[useAgentStream] Streaming error:', errorMessage, err); - setError(errorMessage); - - if (!runId) { - console.warn( - '[useAgentStream] Stream error occurred but no agentRunId is active.', - ); - finalizeStream('error'); - return; - } - }, - [finalizeStream], - ); - - const handleStreamClose = useCallback(() => { - if (!isMountedRef.current) return; - - const runId = currentRunIdRef.current; - console.log( - `[useAgentStream] Stream closed for run ID: ${runId}, status: ${status}`, + if (agentId) { + queryKeys.push( + ['agents'], + ['agent', agentId], ); + } - if (!runId) { - console.warn('[useAgentStream] Stream closed but no active agentRunId.'); - if (status === 'streaming' || status === 'connecting') { - finalizeStream('error'); - } else if ( - status !== 'idle' && - status !== 'completed' && - status !== 'stopped' && - status !== 'agent_not_running' - ) { - finalizeStream('idle'); - } - return; - } - - console.log(`[useAgentStream] Checking final status for run ID: ${runId}`); - getAgentStatus(runId) - .then((agentStatus) => { - if (!isMountedRef.current) return; - - if (currentRunIdRef.current !== runId) { - console.log( - `[useAgentStream] Run ID changed during status check in handleStreamClose, ignoring`, - ); - return; - } - - console.log( - `[useAgentStream] Final status for run ID ${runId}: ${agentStatus.status}`, - ); - - if (agentStatus.status === 'running') { - setError('Stream closed unexpectedly while agent was running.'); - finalizeStream('error', runId); - } else { - const finalStatus = mapAgentStatus(agentStatus.status); - finalizeStream(finalStatus, runId); - } - }) - .catch((err) => { - if (!isMountedRef.current) return; - - if (currentRunIdRef.current !== runId) { - console.log( - `[useAgentStream] Run ID changed during error handling in handleStreamClose, ignoring`, - ); - return; - } - - const errorMessage = err instanceof Error ? err.message : String(err); - console.error( - `[useAgentStream] Error checking agent status for ${runId} after stream close: ${errorMessage}`, - ); - - const isNotFoundError = - errorMessage.includes('not found') || - errorMessage.includes('404') || - errorMessage.includes('does not exist'); - - if (isNotFoundError) { - finalizeStream('agent_not_running', runId); - } else { - finalizeStream('error', runId); - } - }); - }, [status, finalizeStream]); - - useEffect(() => { - isMountedRef.current = true; - - return () => { - isMountedRef.current = false; - - if (throttleRef.current) { - clearTimeout(throttleRef.current); - throttleRef.current = null; - } - - if (retryTimeoutRef.current) { - clearTimeout(retryTimeoutRef.current); - retryTimeoutRef.current = null; - } - - flushPendingContent(); - }; - }, [flushPendingContent]); - - const startStreaming = useCallback( - async (runId: string) => { - if (!isMountedRef.current) return; - - console.log(`[useAgentStream] Starting stream for run ID: ${runId}, current retry count: ${retryCountRef.current}`); - - const previousCleanup = streamCleanupRef.current; - const previousRunId = currentRunIdRef.current; - - currentRunIdRef.current = runId; - - if (retryTimeoutRef.current) { - clearTimeout(retryTimeoutRef.current); - retryTimeoutRef.current = null; - } - - try { - if (!isMountedRef.current) return; - - if (previousCleanup && previousRunId !== runId) { - console.log(`[useAgentStream] Cleaning up previous stream ${previousRunId} to start new stream ${runId}, resetting retry count`); - retryCountRef.current = 0; - previousCleanup(); - streamCleanupRef.current = null; - } - - setTextContent([]); - setToolCall(null); - setError(null); - updateStatus('connecting'); - setAgentRunId(runId); - - // Get auth credentials (token for authenticated users) - const token = await getAuthToken(); - - console.log('[useAgentStream] 🔐 Auth check:', { - hasToken: !!token, - }); - - let url = `${API_URL}/agent-run/${runId}/stream`; - if (token) { - url += `?token=${token}`; - console.log('[useAgentStream] ✅ Using token auth for stream'); - } else { - console.error('[useAgentStream] ❌ NO AUTH CREDENTIALS AVAILABLE!'); - } - - console.log('[useAgentStream] 🌐 Stream URL:', url.replace(/token=[^&]+/, 'token=[HIDDEN]')); - const eventSource = new EventSource(url); - - eventSource.addEventListener('message', (event: any) => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamMessage(event.data); - }); - - eventSource.addEventListener('error', (event: any) => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamError(event); - }); - - eventSource.addEventListener('close', () => { - if (threadIdRef.current !== threadId) return; - if (currentRunIdRef.current !== runId) return; - handleStreamClose(); - }); - - const cleanup = () => { - eventSource.removeAllEventListeners(); - eventSource.close(); - }; - - streamCleanupRef.current = cleanup; - console.log( - `[useAgentStream] Stream created successfully for run ID: ${runId}`, - ); - - setTimeout(async () => { - if (!isMountedRef.current) return; - if (currentRunIdRef.current !== runId) return; - if (statusRef.current === 'streaming') return; - try { - const latest = await getAgentStatus(runId); - if (!isMountedRef.current) return; - if (currentRunIdRef.current !== runId) return; - if (latest.status !== 'running') { - finalizeStream( - mapAgentStatus(latest.status) || 'agent_not_running', - runId, - ); - } - } catch { - } - }, 1500); - } catch (err) { - if (!isMountedRef.current) return; - - if (currentRunIdRef.current !== runId) { - console.log( - `[useAgentStream] Error occurred for old run ID ${runId}, ignoring`, - ); - return; - } + // Create simplified config - core hook handles EventSource creation and API calls + const config: StreamConfig = { + apiUrl: API_URL, + getAuthToken, + createEventSource: (url: string) => new EventSource(url), + queryKeys, + }; - const errorMessage = err instanceof Error ? err.message : String(err); - const lower = errorMessage.toLowerCase(); - const isExpected = - lower.includes('not found') || - lower.includes('404') || - lower.includes('does not exist') || - lower.includes('not running'); + // Map callbacks to core callbacks + const coreCallbacks: UseAgentStreamCoreCallbacks = { + onMessage: callbacks.onMessage, + onStatusChange: callbacks.onStatusChange, + onError: callbacks.onError, + onClose: callbacks.onClose, + onAssistantStart: callbacks.onAssistantStart, + onAssistantChunk: callbacks.onAssistantChunk, + onToolCallChunk: callbacks.onToolCallChunk, + }; - if (isExpected) { - console.info( - `[useAgentStream] Stream not started for ${runId}: ${errorMessage}`, - ); - - if (!previousRunId || previousRunId === runId) { - finalizeStream('agent_not_running', runId); - } else { - console.log(`[useAgentStream] Keeping previous stream ${previousRunId} active since new stream ${runId} failed to start`); - } - } else { - console.error( - `[useAgentStream] Error initiating stream for ${runId}: ${errorMessage}`, - ); - setError(errorMessage); - - if (!previousRunId || previousRunId === runId) { - finalizeStream('error', runId); - } else { - console.log(`[useAgentStream] Keeping previous stream ${previousRunId} active despite error starting new stream ${runId}`); - currentRunIdRef.current = previousRunId; - setAgentRunId(previousRunId); - } - } - } - }, - [ - threadId, - updateStatus, - finalizeStream, - handleStreamMessage, - handleStreamError, - handleStreamClose, - ], + // Use the core hook + const coreResult = useAgentStreamCore( + config, + coreCallbacks, + threadId, + setMessages, + queryClient, + { type: 'timeout', throttleMs: 16 } // Mobile uses timeout throttling ); - const stopStreaming = useCallback(async () => { - if (!isMountedRef.current || !agentRunId) return; - - const runIdToStop = agentRunId; - - finalizeStream('stopped', runIdToStop); - - try { - const token = await getAuthToken(); - await fetch(`${API_URL}/agent-runs/${runIdToStop}/stop`, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json', - }, - }); - } catch (err) { - const errorMessage = err instanceof Error ? err.message : String(err); - console.error( - `[useAgentStream] Error sending stop request for ${runIdToStop}: ${errorMessage}`, - ); - } - }, [agentRunId, finalizeStream]); - - useEffect(() => { - startStreamingRef.current = startStreaming; - }, [startStreaming]); + // Convert TextChunk[] to string for compatibility with existing components + const textContentString = useMemo(() => { + if (!coreResult.textContent || coreResult.textContent.length === 0) return ''; + return coreResult.textContent.map(chunk => chunk.content).join(''); + }, [coreResult.textContent]); return { - status, - textContent: orderedTextContent, - toolCall, - error, - agentRunId, - startStreaming, - stopStreaming, + status: coreResult.status, + textContent: textContentString, + toolCall: coreResult.toolCall, + error: coreResult.error, + agentRunId: coreResult.agentRunId, + startStreaming: coreResult.startStreaming, + stopStreaming: coreResult.stopStreaming, }; } - -async function getAgentStatus(runId: string): Promise<{ status: string }> { - const token = await getAuthToken(); - const response = await fetch(`${API_URL}/agent-runs/${runId}/status`, { - headers: { - 'Authorization': `Bearer ${token}`, - }, - }); - - if (!response.ok) { - throw new Error(`Failed to get agent status: ${response.status}`); - } - - return response.json(); -} diff --git a/backend/core/run/agent_runner.py b/backend/core/run/agent_runner.py index faca546b07..cac8585338 100644 --- a/backend/core/run/agent_runner.py +++ b/backend/core/run/agent_runner.py @@ -50,9 +50,8 @@ async def setup(self): self.config.trace = langfuse.trace(name="run_agent", session_id=self.config.thread_id, metadata={"project_id": self.config.project_id}) from core.jit.config import JITConfig - # Get disabled tools via ToolManager - temp_tool_manager = ToolManager(self.thread_manager, self.config.project_id, self.config.thread_id, self.config.agent_config) - disabled_tools = temp_tool_manager.get_disabled_tools_from_config() + # Get disabled tools from config (before ThreadManager is created) + disabled_tools = self._get_disabled_tools_from_config() jit_config = JITConfig.from_run_context( agent_config=self.config.agent_config, disabled_tools=disabled_tools @@ -87,12 +86,16 @@ async def setup(self): # Initialize MCP with cache_only=True (fast, no network calls) await stream_status_message("initializing", "Setting up MCP tools...") + mcp_start = time.time() if self.config.agent_config: mcp_manager = MCPManager(self.thread_manager, self.account_id) await mcp_manager.initialize_jit_loader(self.config.agent_config, cache_only=True) + logger.info(f"⏱️ [SETUP TIMING] MCP initialize_jit_loader: {(time.time() - mcp_start) * 1000:.1f}ms") # Ensure project metadata is cached (non-blocking if already cached) + project_meta_start = time.time() await ensure_project_metadata_cached(self.config.project_id, self.client) + logger.info(f"⏱️ [SETUP TIMING] ensure_project_metadata_cached: {(time.time() - project_meta_start) * 1000:.1f}ms") # Warm tool cache in background (non-blocking) from core.jit.tool_cache import get_tool_cache @@ -107,6 +110,50 @@ async def setup(self): elapsed_ms = (time.time() - setup_start) * 1000 logger.info(f"✅ [SETUP] Complete in {elapsed_ms:.1f}ms") + def _get_disabled_tools_from_config(self) -> List[str]: + """Get list of disabled tools from agent config.""" + disabled_tools = [] + + if not self.config.agent_config or 'agentpress_tools' not in self.config.agent_config: + return disabled_tools + + raw_tools = self.config.agent_config['agentpress_tools'] + + if not isinstance(raw_tools, dict): + return disabled_tools + + if self.config.agent_config.get('is_suna_default', False) and not raw_tools: + return disabled_tools + + def is_tool_enabled(tool_name: str) -> bool: + try: + tool_config = raw_tools.get(tool_name, True) + if isinstance(tool_config, bool): + return tool_config + elif isinstance(tool_config, dict): + return tool_config.get('enabled', True) + else: + return True + except Exception: + return True + + all_tools = [ + 'sb_shell_tool', 'sb_files_tool', 'sb_expose_tool', + 'web_search_tool', 'image_search_tool', 'sb_vision_tool', 'sb_presentation_tool', 'sb_image_edit_tool', + 'sb_kb_tool', 'sb_design_tool', 'sb_upload_file_tool', + 'browser_tool', 'people_search_tool', 'company_search_tool', + 'apify_tool', 'reality_defender_tool', 'vapi_voice_tool', 'paper_search_tool', + 'agent_config_tool', 'mcp_search_tool', 'credential_profile_tool', 'trigger_tool', + 'agent_creation_tool' + ] + + for tool_name in all_tools: + if not is_tool_enabled(tool_name): + disabled_tools.append(tool_name) + + logger.debug(f"Disabled tools from config: {disabled_tools}") + return disabled_tools + def setup_tools(self): start = time.time() @@ -182,9 +229,13 @@ async def _prepare_execution(self) -> dict: await stream_status_message("initializing", "Registering tools...") setup_tools_task = asyncio.create_task(self._setup_tools_async()) await setup_tools_task + logger.info(f"⏱️ [PREPARE TIMING] _setup_tools_async: {(time.time() - parallel_start) * 1000:.1f}ms") + restore_start = time.time() await self._restore_dynamic_tools() + logger.info(f"⏱️ [PREPARE TIMING] _restore_dynamic_tools: {(time.time() - restore_start) * 1000:.1f}ms") + mcp_clean_start = time.time() if (hasattr(self.thread_manager, 'mcp_loader') and self.config.agent_config and (self.config.agent_config.get("custom_mcps") or self.config.agent_config.get("configured_mcps"))): @@ -193,12 +244,14 @@ async def _prepare_execution(self) -> dict: mcp_manager.clean_legacy_mcp_tools() else: logger.info("⚠️ [MCP] No MCP configs, skipping") + logger.info(f"⏱️ [PREPARE TIMING] MCP cleanup: {(time.time() - mcp_clean_start) * 1000:.1f}ms") tools_elapsed = (time.time() - parallel_start) * 1000 - logger.info(f"⏱️ [TIMING] Tool setup: {tools_elapsed:.1f}ms") + logger.info(f"⏱️ [TIMING] Tool setup total: {tools_elapsed:.1f}ms") await stream_status_message("initializing", "Building system prompt...") prompt_start = time.time() + logger.info(f"⏱️ [PREPARE TIMING] About to call build_system_prompt...") system_message, memory_context = await PromptManager.build_system_prompt( self.config.model_name, self.config.agent_config, @@ -209,7 +262,7 @@ async def _prepare_execution(self) -> dict: user_id=self.account_id, mcp_loader=getattr(self.thread_manager, 'mcp_loader', None) ) - logger.info(f"⏱️ [TIMING] build_system_prompt() in {(time.time() - prompt_start) * 1000:.1f}ms ({len(str(system_message.get('content', '')))} chars)") + logger.info(f"⏱️ [PREPARE TIMING] build_system_prompt: {(time.time() - prompt_start) * 1000:.1f}ms ({len(str(system_message.get('content', '')))} chars)") if memory_context: self.thread_manager.set_memory_context(memory_context) @@ -270,6 +323,13 @@ async def _execute_single_turn(self, system_message: dict, cancellation_event: O if latest_message.data and len(latest_message.data) > 0: message_type = latest_message.data[0].get('type') if message_type == 'assistant': + # No new user message after assistant response - stop the loop + logger.debug(f"Last message is assistant, no new input - stopping execution for {self.config.thread_id}") + yield { + "type": "status", + "status": "stopped", + "message": "Execution complete - awaiting user input" + } return temporary_message = None @@ -357,8 +417,14 @@ async def _process_response(self, response, generation, cancellation_event: Opti return if agent_should_terminate or last_tool_call in ['ask', 'complete']: + logger.debug(f"Agent termination signal: terminate={agent_should_terminate}, tool_call={last_tool_call}") if generation: generation.end(status_message="agent_stopped") + yield { + "type": "status", + "status": "stopped", + "message": f"Agent completed (tool_call={last_tool_call})" + } except Exception as e: processed_error = ErrorProcessor.process_system_error(e, context={"thread_id": self.config.thread_id}) diff --git a/backend/core/run/mcp_manager.py b/backend/core/run/mcp_manager.py index 854785b103..b8fd90077e 100644 --- a/backend/core/run/mcp_manager.py +++ b/backend/core/run/mcp_manager.py @@ -1,4 +1,6 @@ -from typing import Optional +import asyncio +import time +from typing import Optional, Dict, Any from core.agentpress.thread_manager import ThreadManager from core.tools.mcp_tool_wrapper import MCPToolWrapper from core.agentpress.tool import SchemaType @@ -67,3 +69,94 @@ async def register_mcp_tools(self, agent_config: dict) -> Optional[MCPToolWrappe except Exception as e: logger.error(f"Failed to initialize MCP tools: {e}") return None + + async def initialize_jit_loader(self, agent_config: Dict[str, Any], cache_only: bool = False) -> None: + """Initialize MCP JIT loader with optional cache-only mode.""" + jit_start = time.time() + if not agent_config: + return + + try: + agent_id = agent_config.get('agent_id') + + version_start = time.time() + from core.versioning.version_service import get_version_service + version_service = await get_version_service() + fresh_config = await version_service.get_current_mcp_config(agent_id, self.account_id) + logger.info(f"⏱️ [MCP JIT TIMING] get_current_mcp_config: {(time.time() - version_start) * 1000:.1f}ms") + + except Exception as e: + logger.error(f"❌ Failed to load fresh config via version service: {e}", exc_info=True) + fresh_config = None + + if fresh_config: + agent_config_update = { + 'custom_mcps': fresh_config.get('custom_mcp', []), + 'configured_mcps': fresh_config.get('configured_mcps', []) + } + agent_config.update(agent_config_update) + self.thread_manager.tool_registry.invalidate_mcp_cache() + + custom_mcps = agent_config.get("custom_mcps", []) + configured_mcps = agent_config.get("configured_mcps", []) + + logger.debug(f"⚡ [MCP JIT] Loading MCPs: {len(custom_mcps)} custom, {len(configured_mcps)} configured") + + if custom_mcps or configured_mcps: + try: + from core.jit.mcp_loader import MCPJITLoader + + mcp_config = { + 'custom_mcp': custom_mcps, + 'configured_mcps': configured_mcps, + 'account_id': self.account_id + } + + build_map_start = time.time() + if not hasattr(self.thread_manager, 'mcp_loader') or self.thread_manager.mcp_loader is None: + self.thread_manager.mcp_loader = MCPJITLoader(mcp_config) + await self.thread_manager.mcp_loader.build_tool_map(cache_only=cache_only) + else: + if fresh_config: + await self.thread_manager.mcp_loader.rebuild_tool_map(fresh_config) + if cache_only: + await self.thread_manager.mcp_loader.build_tool_map(cache_only=cache_only) + logger.info(f"⏱️ [MCP JIT TIMING] build_tool_map: {(time.time() - build_map_start) * 1000:.1f}ms") + + stats = self.thread_manager.mcp_loader.get_activation_stats() + toolkits = await self.thread_manager.mcp_loader.get_toolkits() + + mode_str = "cache-only" if cache_only else "full discovery" + logger.info(f"⚡ [MCP JIT] Initialized: {stats['total_tools']} tools from {len(toolkits)} toolkits ({mode_str})") + logger.info(f"⏱️ [MCP JIT TIMING] Total initialize_jit_loader: {(time.time() - jit_start) * 1000:.1f}ms") + + if not cache_only: + from core.jit.mcp_registry import warm_cache_for_agent_toolkits + asyncio.create_task(warm_cache_for_agent_toolkits(mcp_config)) + + except Exception as e: + logger.error(f"❌ [MCP JIT] Initialization failed: {e}") + if not hasattr(self.thread_manager, 'mcp_loader'): + self.thread_manager.mcp_loader = None + + def clean_legacy_mcp_tools(self) -> None: + """Remove legacy MCP tools from registry (MCPToolWrapper instances or tools with names >64 chars).""" + tools_before = len(self.thread_manager.tool_registry.tools) + + for tool_name in list(self.thread_manager.tool_registry.tools.keys()): + tool_info = self.thread_manager.tool_registry.tools[tool_name] + instance = tool_info.get('instance') + + should_remove = ( + (hasattr(instance, '__class__') and 'MCPToolWrapper' in instance.__class__.__name__) or + len(tool_name) > 64 + ) + + if should_remove: + del self.thread_manager.tool_registry.tools[tool_name] + + tools_after = len(self.thread_manager.tool_registry.tools) + removed_count = tools_before - tools_after + + if removed_count > 0: + logger.info(f"⚡ [MCP JIT] Registry cleaned: {tools_before} → {tools_after} tools ({removed_count} legacy tools removed)") diff --git a/backend/core/run/prompt_manager.py b/backend/core/run/prompt_manager.py index 684da8d71d..a70e9bf758 100644 --- a/backend/core/run/prompt_manager.py +++ b/backend/core/run/prompt_manager.py @@ -23,15 +23,23 @@ async def build_system_prompt(model_name: str, agent_config: Optional[dict], use_dynamic_tools: bool = True, mcp_loader=None) -> Tuple[dict, Optional[dict]]: + build_start = time.time() + if agent_config and agent_config.get('system_prompt'): system_content = agent_config['system_prompt'].strip() else: from core.prompts.core_prompt import get_core_system_prompt system_content = get_core_system_prompt() + t1 = time.time() system_content = PromptManager._build_base_prompt(system_content, use_dynamic_tools) + logger.debug(f"⏱️ [PROMPT TIMING] _build_base_prompt: {(time.time() - t1) * 1000:.1f}ms") + + t2 = time.time() system_content = await PromptManager._append_builder_tools_prompt(system_content, agent_config) + logger.debug(f"⏱️ [PROMPT TIMING] _append_builder_tools_prompt: {(time.time() - t2) * 1000:.1f}ms") + # Start parallel fetch tasks kb_task = PromptManager._fetch_knowledge_base(agent_config, client) user_context_task = PromptManager._fetch_user_context_data(user_id, client) memory_task = PromptManager._fetch_user_memories(user_id, thread_id, client) @@ -40,12 +48,22 @@ async def build_system_prompt(model_name: str, agent_config: Optional[dict], # Get agent_id for fresh config loading agent_id = agent_config.get('agent_id') if agent_config else None + t3 = time.time() system_content = await PromptManager._append_mcp_tools_info(system_content, agent_config, mcp_wrapper_instance, agent_id, user_id) + logger.debug(f"⏱️ [PROMPT TIMING] _append_mcp_tools_info: {(time.time() - t3) * 1000:.1f}ms") + + t4 = time.time() system_content = await PromptManager._append_jit_mcp_info(system_content, mcp_loader, agent_id, user_id) + logger.debug(f"⏱️ [PROMPT TIMING] _append_jit_mcp_info: {(time.time() - t4) * 1000:.1f}ms") + system_content = PromptManager._append_xml_tool_calling_instructions(system_content, xml_tool_calling, tool_registry) system_content = PromptManager._append_datetime_info(system_content) + t5 = time.time() kb_data, user_context_data, memory_data, file_data = await asyncio.gather(kb_task, user_context_task, memory_task, file_task) + logger.debug(f"⏱️ [PROMPT TIMING] parallel fetches (kb/user_context/memory/file): {(time.time() - t5) * 1000:.1f}ms") + + logger.info(f"⏱️ [PROMPT TIMING] Total build_system_prompt: {(time.time() - build_start) * 1000:.1f}ms") if kb_data: system_content += kb_data diff --git a/backend/core/run/tool_manager.py b/backend/core/run/tool_manager.py index d9ff5687c7..5a8e08b331 100644 --- a/backend/core/run/tool_manager.py +++ b/backend/core/run/tool_manager.py @@ -284,3 +284,64 @@ def _get_enabled_methods_for_tool(self, tool_name: str) -> Optional[List[str]]: from core.utils.tool_discovery import get_enabled_methods_for_tool return get_enabled_methods_for_tool(tool_name, self.migrated_tools) + + def get_disabled_tools_from_config(self) -> List[str]: + """Get list of disabled tools from agent config.""" + disabled_tools = [] + + if not self.agent_config or 'agentpress_tools' not in self.agent_config: + return disabled_tools + + raw_tools = self.agent_config['agentpress_tools'] + + if not isinstance(raw_tools, dict): + return disabled_tools + + if self.agent_config.get('is_suna_default', False) and not raw_tools: + return disabled_tools + + def is_tool_enabled(tool_name: str) -> bool: + try: + tool_config = raw_tools.get(tool_name, True) + if isinstance(tool_config, bool): + return tool_config + elif isinstance(tool_config, dict): + return tool_config.get('enabled', True) + else: + return True + except Exception: + return True + + all_tools = [ + 'sb_shell_tool', 'sb_files_tool', 'sb_expose_tool', + 'web_search_tool', 'image_search_tool', 'sb_vision_tool', 'sb_presentation_tool', 'sb_image_edit_tool', + 'sb_kb_tool', 'sb_design_tool', 'sb_upload_file_tool', + 'browser_tool', 'people_search_tool', 'company_search_tool', + 'apify_tool', 'reality_defender_tool', 'vapi_voice_tool', 'paper_search_tool', + 'agent_config_tool', 'mcp_search_tool', 'credential_profile_tool', 'trigger_tool', + 'agent_creation_tool' + ] + + for tool_name in all_tools: + if not is_tool_enabled(tool_name): + disabled_tools.append(tool_name) + + logger.debug(f"Disabled tools from config: {disabled_tools}") + return disabled_tools + + def register_suna_specific_tools(self, disabled_tools: List[str], account_id: Optional[str] = None): + """Register Suna-specific tools like agent_creation_tool.""" + if 'agent_creation_tool' not in disabled_tools: + from core.tools.agent_creation_tool import AgentCreationTool + from core.services.supabase import DBConnection + + db = DBConnection() + + if account_id: + enabled_methods = self._get_enabled_methods_for_tool('agent_creation_tool') + if enabled_methods is not None: + self.thread_manager.add_tool(AgentCreationTool, function_names=enabled_methods, thread_manager=self.thread_manager, db_connection=db, account_id=account_id) + else: + self.thread_manager.add_tool(AgentCreationTool, thread_manager=self.thread_manager, db_connection=db, account_id=account_id) + else: + logger.warning("Could not register agent_creation_tool: account_id not available") \ No newline at end of file diff --git a/backend/core/worker/handlers.py b/backend/core/worker/handlers.py index 98caac0eb0..af4f5c8eba 100644 --- a/backend/core/worker/handlers.py +++ b/backend/core/worker/handlers.py @@ -124,7 +124,9 @@ async def check_for_stop_signal(): except: pass + t_agent_config = time.time() agent_config = await load_agent_config(agent_id, account_id) + logger.info(f"⏱️ [HANDLER TIMING] load_agent_config: {(time.time() - t_agent_config) * 1000:.1f}ms") set_tool_output_streaming_context( agent_run_id=agent_run_id, diff --git a/packages/shared/node_modules/.bin/tsc b/packages/shared/node_modules/.bin/tsc deleted file mode 100755 index 4c101eefc7..0000000000 --- a/packages/shared/node_modules/.bin/tsc +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" -else - exec node "$basedir/../typescript/bin/tsc" "$@" -fi diff --git a/packages/shared/node_modules/.bin/tsc b/packages/shared/node_modules/.bin/tsc new file mode 120000 index 0000000000..0863208a6a --- /dev/null +++ b/packages/shared/node_modules/.bin/tsc @@ -0,0 +1 @@ +../typescript/bin/tsc \ No newline at end of file diff --git a/packages/shared/node_modules/.bin/tsserver b/packages/shared/node_modules/.bin/tsserver deleted file mode 100755 index d0bf3ff4ba..0000000000 --- a/packages/shared/node_modules/.bin/tsserver +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/markokraemer/Projects/agentpress/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" -else - exec node "$basedir/../typescript/bin/tsserver" "$@" -fi diff --git a/packages/shared/node_modules/.bin/tsserver b/packages/shared/node_modules/.bin/tsserver new file mode 120000 index 0000000000..f8f8f1a0c3 --- /dev/null +++ b/packages/shared/node_modules/.bin/tsserver @@ -0,0 +1 @@ +../typescript/bin/tsserver \ No newline at end of file diff --git a/packages/shared/package-lock.json b/packages/shared/package-lock.json new file mode 100644 index 0000000000..94721492ee --- /dev/null +++ b/packages/shared/package-lock.json @@ -0,0 +1,151 @@ +{ + "name": "@agentpress/shared", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@agentpress/shared", + "version": "1.0.0", + "devDependencies": { + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.3.1", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "devDependencies": { + "@dprint/formatter": "^0.4.1", + "@dprint/typescript": "0.93.4", + "@esfx/canceltoken": "^1.0.0", + "@eslint/js": "^9.20.0", + "@octokit/rest": "^21.1.1", + "@types/chai": "^4.3.20", + "@types/diff": "^7.0.1", + "@types/minimist": "^1.2.5", + "@types/mocha": "^10.0.10", + "@types/ms": "^0.7.34", + "@types/node": "latest", + "@types/source-map-support": "^0.5.10", + "@types/which": "^3.0.4", + "@typescript-eslint/rule-tester": "^8.24.1", + "@typescript-eslint/type-utils": "^8.24.1", + "@typescript-eslint/utils": "^8.24.1", + "azure-devops-node-api": "^14.1.0", + "c8": "^10.1.3", + "chai": "^4.5.0", + "chokidar": "^4.0.3", + "diff": "^7.0.0", + "dprint": "^0.49.0", + "esbuild": "^0.25.0", + "eslint": "^9.20.1", + "eslint-formatter-autolinkable-stylish": "^1.4.0", + "eslint-plugin-regexp": "^2.7.0", + "fast-xml-parser": "^4.5.2", + "glob": "^10.4.5", + "globals": "^15.15.0", + "hereby": "^1.10.0", + "jsonc-parser": "^3.3.1", + "knip": "^5.44.4", + "minimist": "^1.2.8", + "mocha": "^10.8.2", + "mocha-fivemat-progress-reporter": "^0.1.0", + "monocart-coverage-reports": "^2.12.1", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "playwright": "^1.50.1", + "source-map-support": "^0.5.21", + "tslib": "^2.8.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.24.1", + "which": "^3.0.1" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "resolved": "../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript", + "link": true + } + } +} diff --git a/packages/shared/package.json b/packages/shared/package.json index 6a1ed9f740..e2835a75d8 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -14,8 +14,13 @@ "scripts": { "typecheck": "tsc --noEmit" }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + }, "devDependencies": { + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.3.1", "typescript": "^5.0.0" } } - diff --git a/packages/shared/src/streaming/index.ts b/packages/shared/src/streaming/index.ts index abdcd28378..29aeb1710e 100644 --- a/packages/shared/src/streaming/index.ts +++ b/packages/shared/src/streaming/index.ts @@ -6,4 +6,5 @@ export * from './utils'; export * from './tool-accumulator'; export * from './text-ordering'; export * from './message-handler'; +export * from './use-agent-stream-core'; diff --git a/packages/shared/src/streaming/use-agent-stream-core.ts b/packages/shared/src/streaming/use-agent-stream-core.ts new file mode 100644 index 0000000000..962ca1ef65 --- /dev/null +++ b/packages/shared/src/streaming/use-agent-stream-core.ts @@ -0,0 +1,862 @@ +/** + * Core streaming hook logic - platform agnostic + * Accepts platform-specific dependencies via adapter pattern + */ + +import { useState, useEffect, useRef, useCallback, useMemo } from 'react'; +import type { UnifiedMessage, ParsedContent, ParsedMetadata } from '../types'; +import type { TextChunk } from './text-ordering'; +import { safeJsonParse } from '../utils'; +import { + createAccumulatorState, + clearAccumulator, + type ToolCallAccumulatorState, +} from './tool-accumulator'; +import { orderContentBySequence } from './text-ordering'; +import { + mapAgentStatus, + preprocessStreamData, + isCompletionMessage, + parseStreamingMessage, + handleAssistantChunk, + handleToolCallChunk, + handleToolResult, + createMessageWithToolCalls, +} from './message-handler'; + +export interface StreamConfig { + apiUrl: string; + getAuthToken: () => Promise; + createEventSource: (url: string) => any; // EventSource or react-native-sse EventSource + queryKeys?: (string | readonly string[])[]; + handleBillingError?: (errorMessage: string, balance?: string | null) => void; + showToast?: (message: string, type?: 'error' | 'success' | 'warning') => void; + clearToolTracking?: () => void; +} + +export interface UseAgentStreamCoreCallbacks { + onMessage: (message: UnifiedMessage) => void; + onStatusChange?: (status: string) => void; + onError?: (error: string) => void; + onClose?: (finalStatus: string) => void; + onAssistantStart?: () => void; + onAssistantChunk?: (chunk: { content: string }) => void; + onToolCallChunk?: (message: UnifiedMessage) => void; + onToolOutputStream?: (data: { tool_call_id: string; tool_name: string; output: string; is_final: boolean }) => void; +} + +export interface UseAgentStreamCoreResult { + status: string; + textContent: TextChunk[]; + toolCall: UnifiedMessage | null; + error: string | null; + agentRunId: string | null; + startStreaming: (runId: string) => Promise; + stopStreaming: () => Promise; +} + +export interface ContentThrottleConfig { + type: 'raf' | 'timeout'; + throttleMs?: number; +} + +/** + * Platform-agnostic core hook for agent streaming + * Accepts adapter for platform-specific EventSource and API calls + */ +export function useAgentStreamCore( + config: StreamConfig, + callbacks: UseAgentStreamCoreCallbacks, + threadId: string, + setMessages: (messages: UnifiedMessage[]) => void, + queryClient?: any, + throttleConfig: ContentThrottleConfig = { type: 'raf' }, +): UseAgentStreamCoreResult { + const [status, setStatus] = useState('idle'); + const [textContent, setTextContent] = useState([]); + const [toolCall, setToolCall] = useState(null); + const [error, setError] = useState(null); + const [agentRunId, setAgentRunId] = useState(null); + + const streamCleanupRef = useRef<(() => void) | null>(null); + const isMountedRef = useRef(true); + const currentRunIdRef = useRef(null); + const threadIdRef = useRef(threadId); + const setMessagesRef = useRef(setMessages); + const accumulatorRef = useRef(createAccumulatorState()); + + // Content throttling refs + const rafRef = useRef(null); + const throttleTimeoutRef = useRef | null>(null); + const pendingContentRef = useRef<{ content: string; sequence?: number }[]>([]); + const lastFlushTimeRef = useRef(0); + + // Tool call throttling refs + const previousToolCallStateRef = useRef(null); + const lastToolCallUpdateTimeRef = useRef(0); + const toolCallArgumentsRef = useRef>(new Map()); // Track accumulated arguments per tool call + const THROTTLE_MS = 100; // Increased throttle time to allow smooth streaming (100ms = ~10 updates/sec) + + // Callbacks ref for stable access + const callbacksRef = useRef(callbacks); + useEffect(() => { + callbacksRef.current = callbacks; + }, [callbacks]); + + // Update refs when props change + useEffect(() => { + threadIdRef.current = threadId; + }, [threadId]); + + useEffect(() => { + setMessagesRef.current = setMessages; + }, [setMessages]); + + // Cleanup on unmount + useEffect(() => { + isMountedRef.current = true; + return () => { + isMountedRef.current = false; + if (streamCleanupRef.current) { + streamCleanupRef.current(); + } + // Clean up throttling + if (rafRef.current && typeof (globalThis as any).cancelAnimationFrame !== 'undefined') { + (globalThis as any).cancelAnimationFrame(rafRef.current); + } + if (throttleTimeoutRef.current) { + (globalThis as any).clearTimeout(throttleTimeoutRef.current); + } + }; + }, []); + + // Content throttling flush function + const flushPendingContent = useCallback(() => { + if (pendingContentRef.current.length > 0) { + const sortedContent = pendingContentRef.current.slice().sort((a: { content: string; sequence?: number }, b: { content: string; sequence?: number }) => { + const aSeq = a.sequence ?? 0; + const bSeq = b.sequence ?? 0; + return aSeq - bSeq; + }); + pendingContentRef.current = []; + + if (throttleConfig.type === 'raf' && typeof (globalThis as any).requestAnimationFrame !== 'undefined') { + // RAF-based throttling (frontend) + setTextContent((prev: TextChunk[]) => { + const combined = [...prev, ...sortedContent]; + const deduplicated = new Map(); + for (const chunk of combined) { + const seq = chunk.sequence ?? 0; + deduplicated.set(seq, chunk); + } + return Array.from(deduplicated.values()).sort((a: { content: string; sequence?: number }, b: { content: string; sequence?: number }) => { + const aSeq = a.sequence ?? 0; + const bSeq = b.sequence ?? 0; + return aSeq - bSeq; + }); + }); + lastFlushTimeRef.current = (typeof (globalThis as any).performance !== 'undefined' ? (globalThis as any).performance.now() : Date.now()) as number; + } else { + // Timeout-based throttling (mobile) + setTextContent((prev: TextChunk[]) => { + const combined = [...prev, ...sortedContent]; + return combined.sort((a: TextChunk, b: TextChunk) => { + const aSeq = a.sequence ?? 0; + const bSeq = b.sequence ?? 0; + return aSeq - bSeq; + }); + }); + } + } + + rafRef.current = null; + throttleTimeoutRef.current = null; + }, [throttleConfig.type]); + + // Add content with throttling + const addContentThrottled = useCallback((content: { content: string; sequence?: number }) => { + pendingContentRef.current.push(content); + + if (throttleConfig.type === 'raf' && typeof (globalThis as any).requestAnimationFrame !== 'undefined') { + if (!rafRef.current) { + const timeSinceLastFlush = (typeof (globalThis as any).performance !== 'undefined' + ? (globalThis as any).performance.now() - lastFlushTimeRef.current + : Date.now() - lastFlushTimeRef.current) as number; + if (pendingContentRef.current.length > 10 || timeSinceLastFlush > 50) { + rafRef.current = (globalThis as any).requestAnimationFrame(flushPendingContent); + } else { + rafRef.current = (globalThis as any).requestAnimationFrame(flushPendingContent); + } + } + } else { + // Timeout-based throttling + if (throttleTimeoutRef.current) { + return; + } + const throttleMs = throttleConfig.throttleMs || 16; + throttleTimeoutRef.current = (globalThis as any).setTimeout(() => { + flushPendingContent(); + }, throttleMs); + } + }, [flushPendingContent, throttleConfig]); + + const updateStatus = useCallback((newStatus: string) => { + if (!isMountedRef.current) return; + setStatus(newStatus); + callbacksRef.current.onStatusChange?.(newStatus); + if (newStatus === 'error' && error) { + callbacksRef.current.onError?.(error); + } + if (['completed', 'stopped', 'failed', 'error', 'agent_not_running'].includes(newStatus)) { + callbacksRef.current.onClose?.(newStatus); + } + }, [error]); + + const orderedTextContent = useMemo(() => { + // Return ordered chunks array for type compatibility, but components expect string + // So we'll return the array and let the wrapper convert it + if (textContent.length === 0) return []; + const sorted = [...textContent].sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0)); + return sorted; + }, [textContent]); + + // Finalize stream function + const finalizeStream = useCallback( + (finalStatus: string, runId: string | null = agentRunId) => { + if (!isMountedRef.current) return; + + if (runId && currentRunIdRef.current && currentRunIdRef.current !== runId) { + return; + } + + if (streamCleanupRef.current) { + streamCleanupRef.current(); + streamCleanupRef.current = null; + } + + // Clean up throttling + if (rafRef.current && typeof (globalThis as any).cancelAnimationFrame !== 'undefined') { + (globalThis as any).cancelAnimationFrame(rafRef.current); + rafRef.current = null; + } + if (throttleTimeoutRef.current) { + (globalThis as any).clearTimeout(throttleTimeoutRef.current); + throttleTimeoutRef.current = null; + } + pendingContentRef.current = []; + + setTextContent([]); + setToolCall(null); + clearAccumulator(accumulatorRef.current); + toolCallArgumentsRef.current.clear(); + previousToolCallStateRef.current = null; + lastToolCallUpdateTimeRef.current = 0; + + if (config.clearToolTracking) { + config.clearToolTracking(); + } + + updateStatus(finalStatus); + setAgentRunId(null); + currentRunIdRef.current = null; + + // Invalidate queries + if (queryClient && config.queryKeys && config.queryKeys.length > 0) { + config.queryKeys.forEach((key) => { + queryClient.invalidateQueries({ queryKey: Array.isArray(key) ? key : [key] }); + }); + } + }, + [agentRunId, updateStatus, config, queryClient], + ); + + // Handle billing errors + const handleBillingError = useCallback((errorMessage: string) => { + const messageLower = errorMessage.toLowerCase(); + const isCreditsExhausted = + messageLower.includes('insufficient credits') || + messageLower.includes('out of credits') || + messageLower.includes('no credits') || + messageLower.includes('balance'); + + const balanceMatch = errorMessage.match(/balance is (-?\d+)\s*credits/i); + const balance = balanceMatch ? balanceMatch[1] : null; + + if (config.handleBillingError) { + config.handleBillingError(errorMessage, balance); + } else { + setError(errorMessage); + callbacksRef.current.onError?.(errorMessage); + } + }, [config]); + + // Stream message handler + const handleStreamMessage = useCallback((rawData: string) => { + if (!isMountedRef.current) return; + if (threadIdRef.current !== threadId) return; + + const processedData = preprocessStreamData(rawData); + if (!processedData || processedData.trim() === '') { + return; + } + + // Early exit for completion messages + if (isCompletionMessage(processedData)) { + finalizeStream('completed', currentRunIdRef.current); + return; + } + + // Check for error messages and special message types + try { + const jsonData = JSON.parse(processedData); + + if (jsonData.status === 'error') { + const errorMessage = jsonData.message || 'Unknown error occurred'; + const messageLower = errorMessage.toLowerCase(); + const isBillingError = + messageLower.includes('insufficient credits') || + messageLower.includes('credit') || + messageLower.includes('balance') || + messageLower.includes('out of credits') || + messageLower.includes('no credits') || + messageLower.includes('billing check failed'); + + if (isBillingError) { + handleBillingError(errorMessage); + return; + } + + setError(errorMessage); + callbacksRef.current.onError?.(errorMessage); + if (config.showToast) { + config.showToast(errorMessage, 'error'); + } + return; + } + + // Check for stopped status with billing error + if (jsonData.status === 'stopped' && jsonData.message) { + const message = jsonData.message.toLowerCase(); + const isBillingError = + message.includes('insufficient credits') || + message.includes('credit') || + message.includes('balance') || + message.includes('out of credits') || + message.includes('no credits') || + message.includes('billing check failed'); + + if (isBillingError) { + handleBillingError(jsonData.message); + finalizeStream('stopped', currentRunIdRef.current); + return; + } + } + + // Handle completed status + if (jsonData.type === 'status' && jsonData.status === 'completed') { + finalizeStream('completed', currentRunIdRef.current); + return; + } + + // Handle tool_output_stream messages + if (jsonData.type === 'tool_output_stream') { + callbacksRef.current.onToolOutputStream?.({ + tool_call_id: jsonData.tool_call_id, + tool_name: jsonData.tool_name, + output: jsonData.output, + is_final: jsonData.is_final, + }); + return; + } + + // Handle ping messages + if (jsonData.type === 'ping' && !jsonData.content) { + return; + } + } catch { + // Not JSON, continue processing + } + + // Process streaming messages + const message = parseStreamingMessage(processedData); + if (!message) { + console.warn('[useAgentStreamCore] Failed to parse streamed message:', processedData); + return; + } + + const parsedContent = safeJsonParse(message.content, {}); + const parsedMetadata = safeJsonParse(message.metadata, {}); + + // Update status to streaming if we receive a valid message + if (status !== 'streaming') { + updateStatus('streaming'); + } + + switch (message.type) { + case 'assistant': + if (parsedMetadata.stream_status === 'tool_call_chunk') { + // Handle tool call chunks - accumulate arguments smoothly + const reconstructedToolCalls = handleToolCallChunk( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCalls) { + // Update accumulated arguments for each tool call + reconstructedToolCalls.forEach(tc => { + toolCallArgumentsRef.current.set(tc.tool_call_id, tc.arguments); + }); + + // Create message with current accumulated arguments + const updatedMessage = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCalls + ); + + // Throttle tool call updates to allow smooth streaming + // Check if structure changed (new tool calls, different function names) + const currentStateKey = JSON.stringify({ + toolCallIds: reconstructedToolCalls.map(tc => tc.tool_call_id), + functionNames: reconstructedToolCalls.map(tc => tc.function_name), + count: reconstructedToolCalls.length, + }); + + const hasChanged = previousToolCallStateRef.current !== currentStateKey; + const now = (typeof (globalThis as any).performance !== 'undefined' ? (globalThis as any).performance.now() : Date.now()) as number; + const timeSinceLastUpdate = now - lastToolCallUpdateTimeRef.current; + + // Check if structure changed (new tool calls added, function names changed) + let structureChanged = false; + if (hasChanged && previousToolCallStateRef.current !== null) { + try { + const currentState = JSON.parse(currentStateKey); + const previousState = JSON.parse(previousToolCallStateRef.current); + structureChanged = currentState.count !== previousState.count || + JSON.stringify(currentState.functionNames) !== JSON.stringify(previousState.functionNames); + } catch { + structureChanged = true; + } + } else if (hasChanged) { + structureChanged = true; + } + + // Always update immediately if structure changed (new tool calls) + // Otherwise throttle to allow smooth streaming of arguments + const shouldUpdate = structureChanged || (hasChanged && timeSinceLastUpdate >= THROTTLE_MS); + + if (shouldUpdate) { + previousToolCallStateRef.current = currentStateKey; + lastToolCallUpdateTimeRef.current = now; + setToolCall(updatedMessage); + } + + // Always call onToolCallChunk callback for real-time updates + // Components can use useSmoothToolField to smooth the arguments + callbacksRef.current.onToolCallChunk?.(updatedMessage); + } + } else { + // Handle text chunks + const chunkContent = handleAssistantChunk(message, parsedContent, parsedMetadata); + if (chunkContent) { + addContentThrottled({ + sequence: message.sequence, + content: chunkContent, + }); + callbacksRef.current.onAssistantChunk?.({ content: chunkContent }); + } else if (parsedMetadata.stream_status === 'complete') { + // Flush pending content before completing + flushPendingContent(); + flushPendingContent(); + setTextContent([]); + setToolCall(null); + clearAccumulator(accumulatorRef.current); + toolCallArgumentsRef.current.clear(); + previousToolCallStateRef.current = null; + lastToolCallUpdateTimeRef.current = 0; + if (message.message_id) callbacksRef.current.onMessage(message); + } else if (!parsedMetadata.stream_status) { + callbacksRef.current.onAssistantStart?.(); + if (message.message_id) callbacksRef.current.onMessage(message); + } + } + break; + + case 'tool': + // Handle tool result + const reconstructedToolCallsFromResult = handleToolResult( + message, + parsedMetadata, + accumulatorRef.current + ); + + if (reconstructedToolCallsFromResult) { + const updatedMessageWithResults = createMessageWithToolCalls( + message, + parsedMetadata, + reconstructedToolCallsFromResult + ); + + setToolCall(updatedMessageWithResults); + callbacksRef.current.onToolCallChunk?.(updatedMessageWithResults); + } + + if (message.message_id) callbacksRef.current.onMessage(message); + break; + + case 'status': + switch (parsedContent.status_type) { + case 'tool_completed': + case 'tool_failed': + case 'tool_error': + // Don't clear toolCall state - other tools may still be streaming + break; + case 'finish': + // Optional: Handle finish reasons + break; + case 'error': + setError(parsedContent.message || 'Worker run failed'); + finalizeStream('error', currentRunIdRef.current); + break; + default: + break; + } + break; + + case 'llm_response_end': + case 'llm_response_start': + // Ignore metadata-only messages + break; + + case 'user': + case 'system': + if (message.message_id) callbacksRef.current.onMessage(message); + break; + + default: + console.warn('[useAgentStreamCore] Unhandled message type:', message.type); + } + }, [threadId, status, callbacks, updateStatus, finalizeStream, addContentThrottled, flushPendingContent, handleBillingError]); + + // Handle stream error + const handleStreamError = useCallback((err: any) => { + if (!isMountedRef.current) return; + + let errorMessage = 'Unknown streaming error'; + if (typeof err === 'string') { + errorMessage = err; + } else if (err instanceof Error) { + errorMessage = err.message; + } else if (err && typeof err === 'object') { + if (err.xhrStatus === 404) { + errorMessage = 'Stream endpoint not found (404) - run may still be initializing'; + } else if (err.message) { + errorMessage = err.message; + } else if (err.type === 'error') { + errorMessage = 'Stream connection error'; + } + } + + const lower = errorMessage.toLowerCase(); + const isExpected = lower.includes('not found') || lower.includes('not running') || lower.includes('404'); + + if (!isExpected) { + console.error('[useAgentStreamCore] Streaming error:', errorMessage, err); + setError(errorMessage); + if (config.showToast) { + config.showToast(errorMessage, 'error'); + } + } + + const runId = currentRunIdRef.current; + if (!runId) { + finalizeStream('error'); + return; + } + }, [finalizeStream, config]); + + // Shared API functions + const getAgentStatus = useCallback(async (runId: string, config: StreamConfig): Promise<{ status: string; error?: string }> => { + const token = await config.getAuthToken(); + const url = `${config.apiUrl}/agent-runs/${runId}/status`; + const headers: Record = {}; + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + const response = await fetch(url, { headers }); + if (!response.ok) { + throw new Error(`Failed to get agent status: ${response.status}`); + } + return response.json(); + }, []); + + // Handle stream close + const handleStreamClose = useCallback(() => { + if (!isMountedRef.current) return; + + const runId = currentRunIdRef.current; + const currentStatus = status; + + // If already finalized, don't show error + if (['completed', 'stopped', 'error', 'agent_not_running'].includes(currentStatus)) { + return; + } + + if (!runId) { + if (currentStatus === 'streaming' || currentStatus === 'connecting') { + finalizeStream('error'); + } else if (currentStatus !== 'idle') { + finalizeStream('idle'); + } + return; + } + + // Wait a bit for DB to update + (globalThis as any).setTimeout(() => { + if (!isMountedRef.current) return; + if (currentRunIdRef.current !== runId) return; + + // Double-check status wasn't finalized while waiting + if (['completed', 'stopped', 'error', 'agent_not_running'].includes(status)) { + return; + } + + // Get agent status using shared API call + getAgentStatus(runId, config) + .then((agentStatus) => { + if (!isMountedRef.current) return; + if (currentRunIdRef.current !== runId) return; + if (['completed', 'stopped', 'error', 'agent_not_running'].includes(status)) { + return; + } + + if (agentStatus.status === 'running') { + setError('Stream closed unexpectedly while agent was running.'); + finalizeStream('error', runId); + if (config.showToast) { + config.showToast('Stream disconnected. Worker might still be running.', 'warning'); + } + } else if (agentStatus.status === 'stopped' && agentStatus.error) { + const errorMessage = agentStatus.error; + const lower = errorMessage.toLowerCase(); + const isBillingError = + lower.includes('insufficient credits') || + lower.includes('credit') || + lower.includes('balance') || + lower.includes('out of credits') || + lower.includes('no credits') || + lower.includes('billing check failed'); + + if (isBillingError) { + handleBillingError(errorMessage); + } + + const finalStatus = mapAgentStatus(agentStatus.status); + finalizeStream(finalStatus, runId); + } else { + const finalStatus = mapAgentStatus(agentStatus.status); + finalizeStream(finalStatus, runId); + } + }) + .catch((err) => { + if (!isMountedRef.current) return; + if (currentRunIdRef.current !== runId) return; + + const errorMessage = err instanceof Error ? err.message : String(err); + const isExpectedCompletion = + errorMessage.includes('not found') || + errorMessage.includes('404') || + errorMessage.includes('does not exist') || + errorMessage.includes('is not running'); + + if (isExpectedCompletion) { + finalizeStream('agent_not_running', runId); + } else { + console.error(`[useAgentStreamCore] Error checking agent status for ${runId} after stream close: ${errorMessage}`); + finalizeStream('error', runId); + } + }); + }, 500); + }, [status, finalizeStream, config, handleBillingError, getAgentStatus]); + + const startStreaming = useCallback(async (runId: string) => { + if (!isMountedRef.current) return; + + // Cleanup previous stream + if (streamCleanupRef.current) { + streamCleanupRef.current(); + } + + // Reset state + if (rafRef.current && typeof (globalThis as any).cancelAnimationFrame !== 'undefined') { + (globalThis as any).cancelAnimationFrame(rafRef.current); + rafRef.current = null; + } + if (throttleTimeoutRef.current) { + (globalThis as any).clearTimeout(throttleTimeoutRef.current); + throttleTimeoutRef.current = null; + } + pendingContentRef.current = []; + + currentRunIdRef.current = runId; + setAgentRunId(runId); + setTextContent([]); + setToolCall(null); + setError(null); + updateStatus('connecting'); + clearAccumulator(accumulatorRef.current); + previousToolCallStateRef.current = null; + lastToolCallUpdateTimeRef.current = 0; + + if (config.clearToolTracking) { + config.clearToolTracking(); + } + + // Create EventSource using shared logic + const token = await config.getAuthToken(); + const streamUrl = `${config.apiUrl}/agent-run/${runId}/stream${token ? `?token=${token}` : ''}`; + const eventSource = config.createEventSource(streamUrl); + + const cleanup = () => { + try { + if (eventSource && typeof eventSource.close === 'function') { + eventSource.close(); + } + if (eventSource && typeof eventSource.removeAllEventListeners === 'function') { + eventSource.removeAllEventListeners(); + } + } catch (err) { + console.warn('[useAgentStreamCore] Error closing event source:', err); + } + }; + + streamCleanupRef.current = cleanup; + + // Handle messages + const messageHandler = (event: any) => { + if (currentRunIdRef.current === runId && threadIdRef.current === threadId) { + handleStreamMessage(event.data || event); + } + }; + + if (eventSource.addEventListener) { + eventSource.addEventListener('message', messageHandler); + } else if (eventSource.onmessage) { + eventSource.onmessage = messageHandler; + } + + // Handle errors + const errorHandler = async (event: any) => { + if (currentRunIdRef.current !== runId) return; + + // Check agent status on error + try { + const agentStatus = await getAgentStatus(runId, config); + if (agentStatus.status !== 'running') { + updateStatus(mapAgentStatus(agentStatus.status)); + cleanup(); + callbacksRef.current.onClose?.(mapAgentStatus(agentStatus.status)); + return; + } + } catch (err) { + const errMsg = err instanceof Error ? err.message : String(err); + const isExpected = + errMsg.includes('not found') || + errMsg.includes('404') || + errMsg.includes('does not exist') || + errMsg.includes('is not running'); + + if (isExpected) { + updateStatus('completed'); + cleanup(); + callbacksRef.current.onClose?.('completed'); + return; + } + } + + handleStreamError(event); + }; + + if (eventSource.addEventListener) { + eventSource.addEventListener('error', errorHandler); + } else if (eventSource.onerror) { + eventSource.onerror = errorHandler; + } + + // Handle close + const closeHandler = () => { + if (currentRunIdRef.current === runId) { + handleStreamClose(); + } + }; + + if (eventSource.addEventListener) { + eventSource.addEventListener('close', closeHandler); + } else if (eventSource.onclose) { + eventSource.onclose = closeHandler; + } + + // Handle open + const openHandler = () => { + if (currentRunIdRef.current === runId) { + updateStatus('streaming'); + } + }; + + if (eventSource.addEventListener) { + eventSource.addEventListener('open', openHandler); + } else if (eventSource.onopen) { + eventSource.onopen = openHandler; + } + }, [config, callbacks, threadId, handleStreamMessage, handleStreamError, handleStreamClose, updateStatus, getAgentStatus]); + + const stopStreaming = useCallback(async () => { + if (streamCleanupRef.current) { + streamCleanupRef.current(); + } + + if (currentRunIdRef.current) { + try { + const runId = currentRunIdRef.current; + const token = await config.getAuthToken(); + const url = `${config.apiUrl}/agent-runs/${runId}/stop`; + const headers: Record = { + 'Content-Type': 'application/json', + }; + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + await fetch(url, { + method: 'POST', + headers, + }); + + if (config.showToast) { + config.showToast('Worker stopped.', 'success'); + } + } catch (err) { + const errorMessage = err instanceof Error ? err.message : String(err); + console.error('[useAgentStreamCore] Error stopping agent:', err); + if (config.showToast) { + config.showToast(`Failed to stop Worker: ${errorMessage}`, 'error'); + } + } + currentRunIdRef.current = null; + } + + finalizeStream('stopped', agentRunId); + }, [config, agentRunId, finalizeStream]); + + return { + status, + textContent: orderedTextContent, + toolCall, + error, + agentRunId, + startStreaming, + stopStreaming, + }; +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index a1b2ec7ea9..cbf623a0c9 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -3,7 +3,8 @@ "target": "ES2020", "module": "ESNext", "moduleResolution": "bundler", - "lib": ["ES2020"], + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", "strict": true, "skipLibCheck": true, "declaration": true, @@ -13,7 +14,8 @@ "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "isolatedModules": true, - "noEmit": true + "noEmit": true, + "types": ["react", "react-dom"] }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] From 3b7e9cd78ef374c523795321f99168462a0a0eb3 Mon Sep 17 00:00:00 2001 From: Emre Karatas Date: Sun, 4 Jan 2026 17:43:07 -0500 Subject: [PATCH 023/229] EMRE-1: Frontend improvements and refactoring ## Changes ### Components - Updated agent configuration screens (instructions, integrations, tools, triggers, workflows) - Improved agent management (version manager, creation modal, selector, grid) - Enhanced Composio integrations (connections, connector, profile selectors, tools) - Updated MCP configuration components - Refined billing components (credit purchase, pricing, subscription) - Improved knowledge base manager and related components - Enhanced thread components and tool views - Updated authentication flows (GitHub, Google sign-in, phone verification) - Improved Kortix computer components (desktop, file browser, SSH terminal) - Added new usage limits card component - Added presentation slide skeleton loading state - Added web search loading state component ### Tool Views - Updated browser, command, file operation tool views - Enhanced presentation tools with new slide preview - Improved spreadsheet and sheets tool views - Updated VAPI call tool views - Refined web scrape and web search tool views ### Hooks - Updated agent hooks (export/import, icon generation, versions) - Improved billing and account state hooks - Enhanced Composio and MCP hooks - Updated message streaming and thread hooks - Refined trigger and OAuth integration hooks ### Utilities - Added toast utility - Updated error handler - Improved document export and Google docs utilities ### Translations - Updated all language files (de, en, es, fr, it, ja, pt, zh) ### Assets - Added Kortix computer icons (black/white SVGs) ### Mobile - Updated thread content and assistant message renderer - Updated shared tools display names --- .../frontend/public/kortix-computer-black.svg | 19 ++ .../frontend/public/kortix-computer-white.svg | 19 ++ .../app/(dashboard)/admin/analytics/page.tsx | 2 +- .../(dashboard)/admin/notifications/page.tsx | 2 +- .../agents/config/[agentId]/page.tsx | 2 +- .../[agentId]/screens/instructions-screen.tsx | 2 +- .../[agentId]/screens/integrations-screen.tsx | 2 +- .../config/[agentId]/screens/tools-screen.tsx | 2 +- .../[agentId]/screens/triggers-screen.tsx | 2 +- .../[agentId]/screens/workflows-screen.tsx | 2 +- .../src/app/(dashboard)/agents/page.tsx | 2 +- .../(dashboard)/settings/api-keys/page.tsx | 2 +- apps/frontend/src/app/activate-trial/page.tsx | 2 +- apps/frontend/src/app/auth/page.tsx | 2 +- apps/frontend/src/app/auth/password/page.tsx | 2 +- .../src/app/templates/[shareId]/page.tsx | 2 +- apps/frontend/src/components/GithubSignIn.tsx | 2 +- apps/frontend/src/components/GoogleSignIn.tsx | 2 +- .../admin/admin-user-details-dialog.tsx | 2 +- .../components/agents/AgentVersionManager.tsx | 3 +- .../agents/agent-configuration-dialog.tsx | 10 +- .../agents/agent-creation-modal.tsx | 5 +- .../src/components/agents/agent-selector.tsx | 5 +- .../agents/agent-version-switcher.tsx | 7 +- .../src/components/agents/agents-grid.tsx | 13 +- .../composio/composio-connections-section.tsx | 2 +- .../agents/composio/composio-connector.tsx | 2 +- .../composio-credential-profile-selector.tsx | 4 +- .../composio/composio-profile-selector.tsx | 7 +- .../agents/composio/composio-registry.tsx | 7 +- .../composio/composio-tools-manager.tsx | 2 +- .../composio/composio-tools-selector.tsx | 7 +- .../agents/config/agent-editor-dialog.tsx | 7 +- .../config/agent-icon-editor-dialog.tsx | 7 +- .../agents/config/version-alert.tsx | 2 +- .../agents/create-version-button.tsx | 7 +- .../custom-agents-page/publish-dialog.tsx | 5 +- .../streamlined-install-dialog.tsx | 10 +- .../streamlined-profile-connector.tsx | 6 +- .../installation/trigger-config-step.tsx | 5 +- .../components/agents/json-import-dialog.tsx | 11 +- .../marketplace-agent-preview-dialog.tsx | 7 +- .../agents/mcp/custom-mcp-dialog.tsx | 7 +- .../agents/mcp/mcp-configuration-new.tsx | 2 +- .../components/agents/mcp/tools-manager.tsx | 4 +- .../components/agents/new-agent-dialog.tsx | 7 +- .../tools/granular-tool-configuration.tsx | 7 +- .../triggers/agent-triggers-configuration.tsx | 2 +- .../triggers/event-based-trigger-dialog.tsx | 11 +- .../triggers/one-click-integrations.tsx | 7 +- .../providers/simplified-schedule-config.tsx | 1 - .../agents/triggers/trigger-browse-dialog.tsx | 3 +- .../agents/upcoming-runs-dropdown.tsx | 3 +- .../agents/version-inline-editor.tsx | 5 +- .../src/components/auth/example-showcase.tsx | 13 +- .../phone-verification/otp-verification.tsx | 6 +- .../auth/phone-verification/phone-input.tsx | 5 +- .../phone-verification-page.tsx | 5 +- .../components/billing/credit-purchase.tsx | 7 +- .../billing/downgrade-confirmation-dialog.tsx | 2 +- .../billing/pricing/pricing-section.tsx | 2 +- .../subscription-cancellation-card.tsx | 5 +- .../components/billing/usage-limits-card.tsx | 183 ++++++++++++++++++ .../dashboard/custom-agents-section.tsx | 2 +- .../dashboard/dashboard-content.tsx | 4 +- .../dashboard/usage-limits-popover.tsx | 155 --------------- .../env-manager/local-env-manager.tsx | 2 +- .../file-editors/markdown-toolbar.tsx | 2 +- .../file-renderers/binary-renderer.tsx | 5 +- .../file-renderers/canvas-renderer.tsx | 32 +-- .../file-renderers/pdf-renderer.tsx | 8 +- .../file-renderers/pptx-renderer.tsx | 6 +- .../file-renderers/video-renderer.tsx | 6 +- .../knowledge-base/edit-summary-modal.tsx | 5 +- .../kb-delete-confirm-dialog.tsx | 4 +- .../knowledge-base/kb-file-preview-modal.tsx | 7 +- .../knowledge-base/knowledge-base-manager.tsx | 2 +- .../knowledge-base/shared-kb-tree.tsx | 8 +- .../knowledge-base/unified-kb-entry-modal.tsx | 14 +- .../notifications/notification-settings.tsx | 2 +- .../referrals/referral-code-section.tsx | 2 +- .../referrals/referral-email-invitation.tsx | 2 +- .../settings/user-settings-modal.tsx | 4 +- .../components/sidebar/nav-agents-view.tsx | 2 +- .../src/components/sidebar/nav-agents.tsx | 14 +- .../src/components/sidebar/nav-tasks.tsx | 6 +- .../components/sidebar/nav-trigger-runs.tsx | 4 +- .../src/components/sidebar/search-search.tsx | 5 +- .../src/components/sidebar/share-modal.tsx | 2 +- .../thread/DeleteConfirmationDialog.tsx | 4 +- .../thread/HealthCheckedVncIframe.tsx | 7 +- .../src/components/thread/ThreadComponent.tsx | 2 +- .../thread/agent-run-limit-banner.tsx | 9 +- .../thread/agent-run-limit-dialog.tsx | 9 +- .../thread/chat-input/file-upload-handler.tsx | 7 +- .../thread/chat-input/unified-config-menu.tsx | 71 +++++-- .../thread/chat-input/voice-recorder.tsx | 5 +- .../thread/content/ThreadContent.tsx | 16 +- .../src/components/thread/file-browser.tsx | 2 +- .../src/components/thread/iframe-preview.tsx | 4 +- .../kortix-computer/FileBrowserView.tsx | 2 +- .../thread/kortix-computer/FileViewerView.tsx | 2 +- .../thread/kortix-computer/KortixComputer.tsx | 16 +- .../kortix-computer/components/Desktop.tsx | 2 +- .../components/DesktopIcons.tsx | 2 +- .../kortix-computer/components/EmptyState.tsx | 103 ++++++++-- .../components/EnhancedFileBrowser.tsx | 2 +- .../components/FileInfoContent.tsx | 2 +- .../components/PanelHeader.tsx | 53 +++-- .../components/SSHTerminal.tsx | 2 +- .../components/SpreadsheetApp.tsx | 2 +- .../components/thread/thread-site-header.tsx | 2 +- .../thread/tool-views/BrowserToolView.tsx | 17 -- .../thread/tool-views/CompleteToolView.tsx | 25 --- .../thread/tool-views/GenericToolView.tsx | 27 +-- .../thread/tool-views/KbToolView.tsx | 40 ++-- .../thread/tool-views/UploadFileToolView.tsx | 22 +-- .../thread/tool-views/WebCrawlToolView.tsx | 21 +- .../apify-tool/ApifyApprovalCard.tsx | 5 +- .../thread/tool-views/apify-tool/ToolView.tsx | 22 +-- .../tool-views/canvas-tool/CanvasToolView.tsx | 57 ++---- .../check-profile-connection.tsx | 18 -- .../CheckCommandOutputToolView.tsx | 17 -- .../command-tool/CommandToolView.tsx | 62 ++---- .../command-tool/ListCommandsToolView.tsx | 25 --- .../command-tool/TerminateCommandToolView.tsx | 21 +- .../CompanySearchToolView.tsx | 27 +-- .../configure-agent-integration.tsx | 18 -- .../create-new-agent/create-new-agent.tsx | 18 -- .../designer-tool/DesignerToolView.tsx | 30 +-- .../DocumentParserToolView.tsx | 19 -- .../ExpandMessageToolView.tsx | 27 +-- .../expose-port-tool/ExposePortToolView.tsx | 17 -- .../file-operation/FileOperationToolView.tsx | 12 +- .../file-reader-tool/FileReaderToolView.tsx | 50 +---- .../get-app-details/get-app-details.tsx | 18 -- .../ImageEditGenerateToolView.tsx | 57 ++---- .../list-app-event-triggers.tsx | 18 -- .../PeopleSearchToolView.tsx | 27 +-- .../DeletePresentationToolView.tsx | 20 -- .../DeleteSlideToolView.tsx | 20 -- .../presentation-tools/ExportToolView.tsx | 25 +-- .../FullScreenPresentationViewer.tsx | 6 +- .../ListPresentationTemplatesToolView.tsx | 23 +-- .../ListPresentationsToolView.tsx | 20 -- .../PresentationSlidePreview.tsx | 5 +- .../PresentationSlideSkeleton.tsx | 159 +++++++++++++++ .../presentation-tools/PresentationViewer.tsx | 166 ++++++++++++---- .../RealityDefenderToolView.tsx | 20 -- .../search-mcp-servers/search-mcp-servers.tsx | 1 - .../see-image-tool/SeeImageToolView.tsx | 32 +-- .../tool-views/shared/FileDownloadButton.tsx | 9 +- .../thread/tool-views/shared/LoadingState.tsx | 16 +- .../tool-views/shared/SmartJsonViewer.tsx | 2 +- .../shared/TaskCompletedFeedback.tsx | 2 +- .../sheets-tools/sheets-tool-view.tsx | 13 -- .../spreadsheet/SpreadsheetToolview.tsx | 9 +- .../spreadsheet/SpreadsheetViewer.tsx | 4 +- .../spreadsheet/SyncStatusIndicator.tsx | 5 +- .../tool-views/task-list/TaskListToolView.tsx | 26 +-- .../tool-views/update-agent/update-agent.tsx | 18 -- .../tool-views/utils/presentation-utils.ts | 2 +- .../vapi-call/CallStatusToolView.tsx | 12 -- .../tool-views/vapi-call/EndCallToolView.tsx | 17 -- .../vapi-call/ListCallsToolView.tsx | 22 --- .../tool-views/vapi-call/MakeCallToolView.tsx | 19 +- .../vapi-call/MonitorCallToolView.tsx | 24 +-- .../WaitForCallCompletionToolView.tsx | 17 -- .../tool-views/wait-tool/WaitToolView.tsx | 43 +--- .../web-dev/GetProjectStructureView.tsx | 23 +-- .../web-scrape-tool/WebScrapeToolView.tsx | 21 +- .../web-search-tool/WebSearchLoadingState.tsx | 105 ++++++++++ .../web-search-tool/WebSearchToolView.tsx | 52 +++-- .../tool-views/wrapper/ToolViewWrapper.tsx | 5 +- .../simplified-trigger-detail-panel.tsx | 2 +- .../triggers/trigger-creation-dialog.tsx | 2 +- .../src/hooks/account/use-account-deletion.ts | 2 +- .../hooks/agents/use-agent-export-import.ts | 2 +- .../hooks/agents/use-agent-icon-generation.ts | 2 +- .../src/hooks/agents/use-agent-versions.ts | 2 +- apps/frontend/src/hooks/agents/use-agents.ts | 2 +- .../src/hooks/agents/use-json-import.ts | 2 +- .../src/hooks/apify/use-apify-approvals.ts | 2 +- .../src/hooks/billing/use-account-state.ts | 2 +- .../hooks/billing/use-download-restriction.ts | 2 +- .../hooks/composio/use-composio-mutations.ts | 2 +- .../src/hooks/composio/use-composio.ts | 2 +- .../src/hooks/files/use-file-mutations.ts | 2 +- .../src/hooks/files/use-sandbox-mutations.ts | 2 +- .../use-knowledge-base-queries.ts | 2 +- .../src/hooks/mcp/use-credential-profiles.ts | 2 +- apps/frontend/src/hooks/memory/use-memory.ts | 2 +- .../src/hooks/messages/useAgentStream.ts | 2 +- .../src/hooks/messages/useThreadToolCalls.ts | 10 +- .../utils/assistant-message-renderer.tsx | 7 +- .../src/hooks/referrals/use-referrals.ts | 2 +- .../src/hooks/threads/page/use-thread-data.ts | 2 +- .../threads/use-optimistic-agent-start.ts | 2 +- .../frontend/src/hooks/threads/use-project.ts | 2 +- .../src/hooks/threads/use-thread-mutations.ts | 2 +- .../hooks/triggers/use-oauth-integrations.ts | 2 +- apps/frontend/src/lib/error-handler.ts | 2 +- apps/frontend/src/lib/toast.ts | 45 +++++ .../frontend/src/lib/utils/document-export.ts | 2 +- .../src/lib/utils/google-docs-utils.ts | 2 +- apps/frontend/translations/de.json | 2 +- apps/frontend/translations/en.json | 2 +- apps/frontend/translations/es.json | 2 +- apps/frontend/translations/fr.json | 2 +- apps/frontend/translations/it.json | 2 +- apps/frontend/translations/ja.json | 2 +- apps/frontend/translations/pt.json | 2 +- apps/frontend/translations/zh.json | 2 +- apps/mobile/components/chat/ThreadContent.tsx | 17 +- .../chat/assistant-message-renderer.tsx | 7 +- packages/shared/src/tools/display-names.ts | 18 ++ 216 files changed, 1411 insertions(+), 1576 deletions(-) create mode 100644 apps/frontend/public/kortix-computer-black.svg create mode 100644 apps/frontend/public/kortix-computer-white.svg create mode 100644 apps/frontend/src/components/billing/usage-limits-card.tsx delete mode 100644 apps/frontend/src/components/dashboard/usage-limits-popover.tsx create mode 100644 apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideSkeleton.tsx create mode 100644 apps/frontend/src/components/thread/tool-views/web-search-tool/WebSearchLoadingState.tsx create mode 100644 apps/frontend/src/lib/toast.ts diff --git a/apps/frontend/public/kortix-computer-black.svg b/apps/frontend/public/kortix-computer-black.svg new file mode 100644 index 0000000000..a813023ade --- /dev/null +++ b/apps/frontend/public/kortix-computer-black.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/apps/frontend/public/kortix-computer-white.svg b/apps/frontend/public/kortix-computer-white.svg new file mode 100644 index 0000000000..bdba1bfc55 --- /dev/null +++ b/apps/frontend/public/kortix-computer-white.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx b/apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx index ff11bcc2d9..18cf60b9e6 100644 --- a/apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx +++ b/apps/frontend/src/app/(dashboard)/admin/analytics/page.tsx @@ -11,7 +11,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Pagination } from '@/components/agents/pagination'; import { DataTable, DataTableColumn } from '@/components/ui/data-table'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Users, MessageSquare, diff --git a/apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx b/apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx index 7c5cb2aeda..0674e70570 100644 --- a/apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx +++ b/apps/frontend/src/app/(dashboard)/admin/notifications/page.tsx @@ -21,7 +21,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { toast } from "sonner"; +import { toast } from "@/lib/toast"; import { Badge } from "@/components/ui/badge"; export default function NotificationManagementPage() { diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx index 156e62c390..74f9f938f3 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/page.tsx @@ -16,7 +16,7 @@ import { KnowledgeScreen } from './screens/knowledge-screen'; import { ToolsScreen } from './screens/tools-screen'; import { IntegrationsScreen } from './screens/integrations-screen'; import { useUpdateAgent } from '@/hooks/agents/use-agents'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueryClient } from '@tanstack/react-query'; type ConfigView = 'instructions' | 'knowledge' | 'triggers' | 'tools' | 'integrations'; diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx index 275015b76b..ae0cd731e9 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/instructions-screen.tsx @@ -4,7 +4,7 @@ import React, { useState, useEffect } from 'react'; import { useAgent, useUpdateAgent } from '@/hooks/agents/use-agents'; import { ExpandableMarkdownEditor } from '@/components/ui/expandable-markdown-editor'; import { Label } from '@/components/ui/label'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Skeleton } from '@/components/ui/skeleton'; interface InstructionsScreenProps { diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx index f20d6bddcf..ced4dca723 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/integrations-screen.tsx @@ -4,7 +4,7 @@ import React, { useState, useEffect } from 'react'; import { useAgent } from '@/hooks/agents/use-agents'; import { useUpdateAgentMCPs } from '@/hooks/agents/use-update-agent-mcps'; import { AgentMCPConfiguration } from '@/components/agents/agent-mcp-configuration'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Skeleton } from '@/components/ui/skeleton'; interface IntegrationsScreenProps { diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx index 3a0f8dd39e..ac04a5ffee 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/tools-screen.tsx @@ -3,7 +3,7 @@ import React, { useState, useEffect } from 'react'; import { useAgent, useUpdateAgent } from '@/hooks/agents/use-agents'; import { GranularToolConfiguration } from '@/components/agents/tools/granular-tool-configuration'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Skeleton } from '@/components/ui/skeleton'; interface ToolsScreenProps { diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx index b040661b57..c20127ae17 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/triggers-screen.tsx @@ -21,7 +21,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useAgentTriggers, useCreateTrigger, diff --git a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx index 863f6b1258..c50f071c6b 100644 --- a/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/config/[agentId]/screens/workflows-screen.tsx @@ -3,7 +3,7 @@ import React, { useState, useEffect } from 'react'; import { useAgent, useUpdateAgent } from '@/hooks/agents/use-agents'; import { GranularToolConfiguration } from '@/components/agents/tools/granular-tool-configuration'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Skeleton } from '@/components/ui/skeleton'; interface WorkflowsScreenProps { diff --git a/apps/frontend/src/app/(dashboard)/agents/page.tsx b/apps/frontend/src/app/(dashboard)/agents/page.tsx index ed5cc30760..41a8d64d3d 100644 --- a/apps/frontend/src/app/(dashboard)/agents/page.tsx +++ b/apps/frontend/src/app/(dashboard)/agents/page.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useState, useMemo, useEffect, useCallback } from 'react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { useAgents, useUpdateAgent, useDeleteAgent, useOptimisticAgentUpdate, useAgentDeletionState } from '@/hooks/agents/use-agents'; diff --git a/apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx b/apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx index 137d590f55..9b0291a372 100644 --- a/apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx +++ b/apps/frontend/src/app/(dashboard)/settings/api-keys/page.tsx @@ -4,7 +4,7 @@ import React, { useState, useEffect } from 'react'; import { Key, Plus, Trash2, Copy, Shield, ExternalLink } from 'lucide-react'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Button } from '@/components/ui/button'; import { diff --git a/apps/frontend/src/app/activate-trial/page.tsx b/apps/frontend/src/app/activate-trial/page.tsx index d1d9ee3e9f..9fe438170b 100644 --- a/apps/frontend/src/app/activate-trial/page.tsx +++ b/apps/frontend/src/app/activate-trial/page.tsx @@ -3,7 +3,7 @@ import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { CreditCard, Zap, Shield, ArrowRight, CheckCircle, LogOut, Loader2 } from 'lucide-react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useRouter } from 'next/navigation'; import { useState, useEffect, Suspense, lazy } from 'react'; import { useTrialStatus, useStartTrial, useAccountState } from '@/hooks/billing'; diff --git a/apps/frontend/src/app/auth/page.tsx b/apps/frontend/src/app/auth/page.tsx index cb36fb8d17..5ab126cca4 100644 --- a/apps/frontend/src/app/auth/page.tsx +++ b/apps/frontend/src/app/auth/page.tsx @@ -12,7 +12,7 @@ import { useSearchParams, useRouter } from 'next/navigation'; import { MailCheck, Clock, ExternalLink } from 'lucide-react'; import { useAuth } from '@/components/AuthProvider'; import { useAuthMethodTracking } from '@/stores/auth-tracking'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useTranslations } from 'next-intl'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; import { ReferralCodeDialog } from '@/components/referrals/referral-code-dialog'; diff --git a/apps/frontend/src/app/auth/password/page.tsx b/apps/frontend/src/app/auth/password/page.tsx index 99e2b0f033..06a7b1219d 100644 --- a/apps/frontend/src/app/auth/password/page.tsx +++ b/apps/frontend/src/app/auth/password/page.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/navigation'; import { useSearchParams } from 'next/navigation'; import { useState, useEffect, Suspense } from 'react'; import { AlertCircle, ArrowLeft, Lock } from 'lucide-react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Input } from '@/components/ui/input'; import { SubmitButton } from '@/components/ui/submit-button'; diff --git a/apps/frontend/src/app/templates/[shareId]/page.tsx b/apps/frontend/src/app/templates/[shareId]/page.tsx index cde571fdb4..9bc5cb7155 100644 --- a/apps/frontend/src/app/templates/[shareId]/page.tsx +++ b/apps/frontend/src/app/templates/[shareId]/page.tsx @@ -31,7 +31,7 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { UnifiedMarkdown } from '@/components/markdown'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { cn } from '@/lib/utils'; import Link from 'next/link'; import Image from 'next/image'; diff --git a/apps/frontend/src/components/GithubSignIn.tsx b/apps/frontend/src/components/GithubSignIn.tsx index 168f9b59ea..a1659db321 100644 --- a/apps/frontend/src/components/GithubSignIn.tsx +++ b/apps/frontend/src/components/GithubSignIn.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useCallback } from 'react'; import { useTheme } from 'next-themes'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Icons } from './home/icons'; // Using proper GitHub brand icon from Icons component import { useAuthMethodTracking } from '@/stores/auth-tracking'; diff --git a/apps/frontend/src/components/GoogleSignIn.tsx b/apps/frontend/src/components/GoogleSignIn.tsx index 75389a90a3..3e16729671 100644 --- a/apps/frontend/src/components/GoogleSignIn.tsx +++ b/apps/frontend/src/components/GoogleSignIn.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; import { createClient } from '@/lib/supabase/client'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Icons } from './home/icons'; import { Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; diff --git a/apps/frontend/src/components/admin/admin-user-details-dialog.tsx b/apps/frontend/src/components/admin/admin-user-details-dialog.tsx index c4d17d0e47..8ece71e49c 100644 --- a/apps/frontend/src/components/admin/admin-user-details-dialog.tsx +++ b/apps/frontend/src/components/admin/admin-user-details-dialog.tsx @@ -24,7 +24,7 @@ import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Skeleton } from '@/components/ui/skeleton'; import { Switch } from '@/components/ui/switch'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { User, CreditCard, diff --git a/apps/frontend/src/components/agents/AgentVersionManager.tsx b/apps/frontend/src/components/agents/AgentVersionManager.tsx index dd294685c7..9aeec6104b 100644 --- a/apps/frontend/src/components/agents/AgentVersionManager.tsx +++ b/apps/frontend/src/components/agents/AgentVersionManager.tsx @@ -15,6 +15,7 @@ import { History, Plus } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { formatDistanceToNow } from 'date-fns'; import { useAgentVersions, useActivateAgentVersion } from '@/hooks/agents/use-agent-versions'; import { Agent } from '@/hooks/agents/utils'; @@ -36,7 +37,7 @@ export function AgentVersionManager({ agent, onCreateVersion }: AgentVersionMana
-
+
diff --git a/apps/frontend/src/components/agents/agent-configuration-dialog.tsx b/apps/frontend/src/components/agents/agent-configuration-dialog.tsx index 3e01d22c85..e9bca1a8cd 100644 --- a/apps/frontend/src/components/agents/agent-configuration-dialog.tsx +++ b/apps/frontend/src/components/agents/agent-configuration-dialog.tsx @@ -33,7 +33,6 @@ import { BookOpen, Zap, Download, - Loader2, Check, X, Edit3, @@ -45,7 +44,8 @@ import { Lock, Sparkles, } from 'lucide-react'; -import { toast } from 'sonner'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { cn } from '@/lib/utils'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; import { Alert, AlertDescription } from '@/components/ui/alert'; @@ -596,7 +596,7 @@ export function AgentConfigurationDialog({ disabled={exportMutation.isPending} > {exportMutation.isPending ? ( - + ) : ( )} @@ -606,7 +606,7 @@ export function AgentConfigurationDialog({ {isLoading ? (
- +
) : ( setActiveTab(value as typeof activeTab)} className="flex-1 flex flex-col min-h-0"> @@ -827,7 +827,7 @@ export function AgentConfigurationDialog({ > {isSaving ? ( <> - + Saving... ) : ( diff --git a/apps/frontend/src/components/agents/agent-creation-modal.tsx b/apps/frontend/src/components/agents/agent-creation-modal.tsx index 30a33edb94..779c180c48 100644 --- a/apps/frontend/src/components/agents/agent-creation-modal.tsx +++ b/apps/frontend/src/components/agents/agent-creation-modal.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import { Globe, Wrench, MessageSquare, ChevronLeft } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Dialog, DialogContent, @@ -11,7 +12,7 @@ import { Button } from '@/components/ui/button'; import { useCreateNewAgent } from '@/hooks/agents/use-agents'; import { useKortixTeamTemplates } from '@/hooks/secure-mcp/use-secure-mcp'; import { AgentCountLimitError } from '@/lib/api/errors'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { BaseAgentData } from '@/components/ui/unified-agent-card'; import type { MarketplaceTemplate } from './installation/types'; import { MarketplaceAgentPreviewDialog } from './marketplace-agent-preview-dialog'; @@ -247,7 +248,7 @@ export function AgentCreationModal({ open, onOpenChange, onSuccess }: AgentCreat {option.label} {isLoading && ( -
+ )}

diff --git a/apps/frontend/src/components/agents/agent-selector.tsx b/apps/frontend/src/components/agents/agent-selector.tsx index c0396cdefa..9acdedf505 100644 --- a/apps/frontend/src/components/agents/agent-selector.tsx +++ b/apps/frontend/src/components/agents/agent-selector.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'; -import { Search, Plus, Check, ChevronDown, Loader2 } from 'lucide-react'; +import { Search, Plus, Check, ChevronDown } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -252,7 +253,7 @@ export const AgentSelector: React.FC = ({ > {isFetching ? ( <> - + Loading... ) : ( diff --git a/apps/frontend/src/components/agents/agent-version-switcher.tsx b/apps/frontend/src/components/agents/agent-version-switcher.tsx index 8f17978c8a..0a92f9bfb9 100644 --- a/apps/frontend/src/components/agents/agent-version-switcher.tsx +++ b/apps/frontend/src/components/agents/agent-version-switcher.tsx @@ -2,7 +2,8 @@ import React, { useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; -import { GitBranch, ChevronDown, Clock, RotateCcw, Check, AlertCircle, Loader2 } from 'lucide-react'; +import { GitBranch, ChevronDown, Clock, RotateCcw, Check, AlertCircle } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Button } from '@/components/ui/button'; import { @@ -17,7 +18,7 @@ import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { useAgentVersions, useActivateAgentVersion, useCreateAgentVersion } from '@/hooks/agents/use-agent-versions'; import { formatDistanceToNow } from 'date-fns'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { AgentVersion } from '@/hooks/agents/utils'; import { VersionInlineEditor } from './version-inline-editor'; @@ -112,7 +113,7 @@ export function AgentVersionSwitcher({ if (isLoading) { return (

- +
); } diff --git a/apps/frontend/src/components/agents/agents-grid.tsx b/apps/frontend/src/components/agents/agents-grid.tsx index edcf60c022..93c564ebdd 100644 --- a/apps/frontend/src/components/agents/agents-grid.tsx +++ b/apps/frontend/src/components/agents/agents-grid.tsx @@ -1,12 +1,13 @@ import React, { useState } from 'react'; import { Settings, Trash2, Star, MessageCircle, Wrench, Globe, GlobeLock, Download, Shield, AlertTriangle, GitBranch } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Button } from '@/components/ui/button'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { Dialog, DialogContent, DialogTitle, DialogHeader, DialogDescription } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { useRouter } from 'next/navigation'; import { useCreateTemplate, useUnpublishTemplate } from '@/hooks/secure-mcp/use-secure-mcp'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { UnifiedAgentCard } from '@/components/ui/unified-agent-card'; import { AgentAvatar } from '../thread/content/agent-avatar'; import { AgentConfigurationDialog } from './agent-configuration-dialog'; @@ -164,7 +165,7 @@ const AgentModal: React.FC = ({ > {isUnpublishing ? ( <> -
+ Making Private... ) : ( @@ -184,7 +185,7 @@ const AgentModal: React.FC = ({ > {isPublishing ? ( <> -
+ Publishing... ) : ( @@ -276,7 +277,7 @@ export const AgentsGrid: React.FC = ({ {isDeleting && (
-
+ Deleting...
@@ -319,7 +320,7 @@ export const AgentsGrid: React.FC = ({ onClick={(e) => e.stopPropagation()} > {isDeleting ? ( -
+ ) : ( )} @@ -351,7 +352,7 @@ export const AgentsGrid: React.FC = ({ > {isDeleting ? ( <> -
+ Deleting... ) : ( diff --git a/apps/frontend/src/components/agents/composio/composio-connections-section.tsx b/apps/frontend/src/components/agents/composio/composio-connections-section.tsx index 66e5510184..2432d55d40 100644 --- a/apps/frontend/src/components/agents/composio/composio-connections-section.tsx +++ b/apps/frontend/src/components/agents/composio/composio-connections-section.tsx @@ -50,7 +50,7 @@ import { useComposioCredentialsProfiles, useComposioMcpUrl } from '@/hooks/compo import { useDeleteProfile, useBulkDeleteProfiles, useSetDefaultProfile } from '@/hooks/composio/use-composio-mutations'; import { ComposioRegistry } from './composio-registry'; import { cn } from '@/lib/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueryClient } from '@tanstack/react-query'; import type { ComposioProfileSummary, ComposioToolkitGroup } from '@/hooks/composio/utils'; import { useAccountState } from '@/hooks/billing'; diff --git a/apps/frontend/src/components/agents/composio/composio-connector.tsx b/apps/frontend/src/components/agents/composio/composio-connector.tsx index d45b75d117..fdc58bf07a 100644 --- a/apps/frontend/src/components/agents/composio/composio-connector.tsx +++ b/apps/frontend/src/components/agents/composio/composio-connector.tsx @@ -46,7 +46,7 @@ import type { ComposioProfile, AuthConfigField, } from '@/hooks/composio/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { formatDistanceToNow } from 'date-fns'; import { cn } from '@/lib/utils'; import { AnimatePresence, motion } from 'framer-motion'; diff --git a/apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx b/apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx index 1aca8c8870..ca93960f1f 100644 --- a/apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx +++ b/apps/frontend/src/components/agents/composio/composio-credential-profile-selector.tsx @@ -12,9 +12,9 @@ import { import { CheckCircle2, XCircle, - Loader2, Plus, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useCredentialProfilesForMcp } from '@/hooks/mcp/use-credential-profiles'; interface ComposioCredentialProfileSelectorProps { @@ -47,7 +47,7 @@ export const ComposioCredentialProfileSelector: React.FC
- + Loading profiles...
diff --git a/apps/frontend/src/components/agents/composio/composio-profile-selector.tsx b/apps/frontend/src/components/agents/composio/composio-profile-selector.tsx index 4bcfe53400..88b9484ed8 100644 --- a/apps/frontend/src/components/agents/composio/composio-profile-selector.tsx +++ b/apps/frontend/src/components/agents/composio/composio-profile-selector.tsx @@ -2,9 +2,10 @@ import React, { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Loader2, Plus, Calendar, User } from 'lucide-react'; +import { Plus, Calendar, User } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { formatDistanceToNow } from 'date-fns'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { ComposioToolkit, ComposioProfile } from '@/hooks/composio/utils'; interface ComposioProfileSelectorProps { @@ -117,7 +118,7 @@ export const ComposioProfileSelector: React.FC = ( > {isLoading ? ( <> - + Loading... ) : selectedProfileId === 'new' ? ( diff --git a/apps/frontend/src/components/agents/composio/composio-registry.tsx b/apps/frontend/src/components/agents/composio/composio-registry.tsx index 3c49c23f19..b5a82a0ff1 100644 --- a/apps/frontend/src/components/agents/composio/composio-registry.tsx +++ b/apps/frontend/src/components/agents/composio/composio-registry.tsx @@ -5,7 +5,8 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Card } from '@/components/ui/card'; -import { Search, Zap, X, Settings, ChevronDown, ChevronUp, Loader2, Server, Lock } from 'lucide-react'; +import { Search, Zap, X, Settings, ChevronDown, ChevronUp, Server, Lock } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useComposioCategories, useComposioToolkitsInfinite } from '@/hooks/composio/use-composio'; import { useComposioProfiles } from '@/hooks/composio/use-composio-profiles'; import { useAgent } from '@/hooks/agents/use-agents'; @@ -13,7 +14,7 @@ import { useUpdateAgentMCPs } from '@/hooks/agents/use-update-agent-mcps'; import { ComposioConnector } from './composio-connector'; import { ComposioToolsManager } from './composio-tools-manager'; import type { ComposioToolkit, ComposioProfile } from '@/hooks/composio/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { cn } from '@/lib/utils'; import { useQueryClient } from '@tanstack/react-query'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; @@ -709,7 +710,7 @@ export const ComposioRegistry: React.FC = ({ > {isFetchingNextPage ? ( <> - + Loading more... ) : ( diff --git a/apps/frontend/src/components/agents/composio/composio-tools-manager.tsx b/apps/frontend/src/components/agents/composio/composio-tools-manager.tsx index cddf6586f4..28aa326310 100644 --- a/apps/frontend/src/components/agents/composio/composio-tools-manager.tsx +++ b/apps/frontend/src/components/agents/composio/composio-tools-manager.tsx @@ -4,7 +4,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u import { useComposioProfiles } from '@/hooks/composio/use-composio-profiles'; import { useComposioToolkitIcon } from '@/hooks/composio/use-composio'; import { backendApi } from '@/lib/api-client'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueryClient } from '@tanstack/react-query'; import { cn } from '@/lib/utils'; import { composioApi } from '@/hooks/composio/utils'; diff --git a/apps/frontend/src/components/agents/composio/composio-tools-selector.tsx b/apps/frontend/src/components/agents/composio/composio-tools-selector.tsx index 2dabbcdec1..e4692857ad 100644 --- a/apps/frontend/src/components/agents/composio/composio-tools-selector.tsx +++ b/apps/frontend/src/components/agents/composio/composio-tools-selector.tsx @@ -15,11 +15,12 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { Search, Save, AlertCircle, Loader2, Filter, X, ChevronDown } from 'lucide-react'; +import { Search, Save, AlertCircle, Filter, X, ChevronDown } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { backendApi } from '@/lib/api-client'; import { useComposioTools } from '@/hooks/composio/use-composio'; import { cn } from '@/lib/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { ComposioTool } from '@/hooks/composio/utils'; interface ComposioToolsSelectorProps { @@ -550,7 +551,7 @@ export const ComposioToolsSelector: React.FC = ({ > {isSaving ? ( <> - + Saving... ) : ( diff --git a/apps/frontend/src/components/agents/config/agent-editor-dialog.tsx b/apps/frontend/src/components/agents/config/agent-editor-dialog.tsx index c43864d128..6c1f9387d6 100644 --- a/apps/frontend/src/components/agents/config/agent-editor-dialog.tsx +++ b/apps/frontend/src/components/agents/config/agent-editor-dialog.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState, useEffect, useMemo, useCallback } from 'react'; -import { Wand2, Loader2 } from 'lucide-react'; +import { Wand2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Dialog, DialogContent, @@ -12,7 +13,7 @@ import { import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { AgentAvatar } from '../../thread/content/agent-avatar'; import { IconPicker } from './icon-picker'; import { useGenerateAgentIcon } from '@/hooks/agents/use-agent-icon-generation'; @@ -233,7 +234,7 @@ export function AgentEditorDialog({ className="gap-2" > {generateIconMutation.isPending ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx b/apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx index 5855963296..759728f6d5 100644 --- a/apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx +++ b/apps/frontend/src/components/agents/config/agent-icon-editor-dialog.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState, useCallback, useEffect } from 'react'; -import { Sparkles, Wand2, Loader2 } from 'lucide-react'; +import { Sparkles, Wand2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Dialog, DialogContent, @@ -12,7 +13,7 @@ import { import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { IconPicker } from './icon-picker'; import { AgentAvatar } from '../../thread/content/agent-avatar'; import { Separator } from '@/components/ui/separator'; @@ -371,7 +372,7 @@ Customize Worker Icon className="gap-2" > {generateIconMutation.isPending ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/agents/config/version-alert.tsx b/apps/frontend/src/components/agents/config/version-alert.tsx index c41ef961df..48ba809c1f 100644 --- a/apps/frontend/src/components/agents/config/version-alert.tsx +++ b/apps/frontend/src/components/agents/config/version-alert.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Eye, Check, Loader2, Info } from 'lucide-react'; +import { Eye, Check, Info } from 'lucide-react'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; diff --git a/apps/frontend/src/components/agents/create-version-button.tsx b/apps/frontend/src/components/agents/create-version-button.tsx index 5f33f0ae04..6519e529bc 100644 --- a/apps/frontend/src/components/agents/create-version-button.tsx +++ b/apps/frontend/src/components/agents/create-version-button.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState } from 'react'; -import { Save, Loader2 } from 'lucide-react'; +import { Save } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Button } from '@/components/ui/button'; import { @@ -16,7 +17,7 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { useCreateAgentVersion } from '@/hooks/agents/use-agent-versions'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface CreateVersionButtonProps { agentId: string; @@ -143,7 +144,7 @@ export function CreateVersionButton({ > {createVersionMutation.isPending ? ( <> - + Creating... ) : ( diff --git a/apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx b/apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx index b5428ef5ff..646cacb07e 100644 --- a/apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx +++ b/apps/frontend/src/components/agents/custom-agents-page/publish-dialog.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState } from 'react'; -import { Globe, Loader2, Plus, Trash2, User, Bot, Wrench } from 'lucide-react'; +import { Globe, Plus, Trash2, User, Bot, Wrench } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; @@ -223,7 +224,7 @@ export const PublishDialog = ({ > {templatesActioningId ? ( <> - + Publishing... ) : ( diff --git a/apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx b/apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx index 22aba289e1..433ca607ed 100644 --- a/apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx +++ b/apps/frontend/src/components/agents/installation/streamlined-install-dialog.tsx @@ -11,13 +11,13 @@ import { DialogDescription } from '@/components/ui/dialog'; import { - Loader2, Shield, Download, ArrowRight, CheckCircle, Zap } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { cn } from '@/lib/utils'; import { ProfileConnector } from './streamlined-profile-connector'; import { CustomServerStep } from './custom-server-step'; @@ -25,7 +25,7 @@ import type { MarketplaceTemplate, SetupStep } from './types'; import { AgentAvatar } from '@/components/thread/content/agent-avatar'; import { TriggerConfigStep } from './trigger-config-step'; import { TriggerVariablesStep, type TriggerVariable } from './trigger-variables-step'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface StreamlinedInstallDialogProps { item: MarketplaceTemplate | null; @@ -337,7 +337,7 @@ export const StreamlinedInstallDialog: React.FC = {isLoading ? (
- + Preparing installation...
@@ -496,7 +496,7 @@ export const StreamlinedInstallDialog: React.FC = > {isInstalling ? ( <> - + Installing... ) : ( @@ -514,7 +514,7 @@ export const StreamlinedInstallDialog: React.FC = > {isInstalling ? ( <> - + Installing... ) : ( diff --git a/apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx b/apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx index 339ab52c21..7ec212f8dc 100644 --- a/apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx +++ b/apps/frontend/src/components/agents/installation/streamlined-profile-connector.tsx @@ -6,11 +6,11 @@ import { Separator } from '@/components/ui/separator'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Plus, - Loader2, Shield, Settings } from 'lucide-react'; -import { toast } from 'sonner'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { ComposioCredentialProfileSelector } from '@/components/agents/composio/composio-credential-profile-selector'; import { ComposioConnector } from '@/components/agents/composio/composio-connector'; import { useCreateCredentialProfile, useCredentialProfiles, type CreateCredentialProfileRequest } from '@/hooks/mcp/use-credential-profiles'; @@ -320,7 +320,7 @@ export const ProfileConnector: React.FC = ({ > {isCreatingProfile ? ( <> - + Creating... ) : ( diff --git a/apps/frontend/src/components/agents/installation/trigger-config-step.tsx b/apps/frontend/src/components/agents/installation/trigger-config-step.tsx index 10cd02abe3..dc8af60a5e 100644 --- a/apps/frontend/src/components/agents/installation/trigger-config-step.tsx +++ b/apps/frontend/src/components/agents/installation/trigger-config-step.tsx @@ -1,5 +1,6 @@ import React, { useState, useEffect, useCallback } from 'react'; -import { Loader2, Info } from 'lucide-react'; +import { Info } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Alert, AlertDescription } from '@/components/ui/alert'; @@ -206,7 +207,7 @@ export const TriggerConfigStep: React.FC = ({

Trigger Configuration

{isLoadingFields ? (
- + Loading configuration fields...
) : error ? ( diff --git a/apps/frontend/src/components/agents/json-import-dialog.tsx b/apps/frontend/src/components/agents/json-import-dialog.tsx index 09dc8bc0f4..9ef2c9f925 100644 --- a/apps/frontend/src/components/agents/json-import-dialog.tsx +++ b/apps/frontend/src/components/agents/json-import-dialog.tsx @@ -5,8 +5,9 @@ import { Textarea } from '@/components/ui/textarea'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Alert, AlertDescription } from '@/components/ui/alert'; -import { Loader2, FileJson, AlertCircle, CheckCircle2 } from 'lucide-react'; -import { toast } from 'sonner'; +import { FileJson, AlertCircle, CheckCircle2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { ProfileConnector } from './installation/streamlined-profile-connector'; import { CustomServerStep } from './installation/custom-server-step'; import type { SetupStep } from './installation/types'; @@ -260,7 +261,7 @@ export const JsonImportDialog: React.FC = ({ Cancel
@@ -341,7 +342,7 @@ export const JsonImportDialog: React.FC = ({ > {importJsonMutation.isPending ? ( <> - + Importing... ) : ( @@ -367,7 +368,7 @@ export const JsonImportDialog: React.FC = ({ const renderImportingStep = () => (
- +

Importing Worker

diff --git a/apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx b/apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx index c8ae188598..eef3366f5f 100644 --- a/apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx +++ b/apps/frontend/src/components/agents/marketplace-agent-preview-dialog.tsx @@ -5,9 +5,10 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; -import { Bot, Download, Wrench, Plug, Tag, User, Calendar, Loader2, Share, Cpu, Eye, Zap, MessageSquare, ArrowRight, Sparkles, FileText } from 'lucide-react'; +import { Bot, Download, Wrench, Plug, Tag, User, Calendar, Share, Cpu, Eye, Zap, MessageSquare, ArrowRight, Sparkles, FileText } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { DynamicIcon } from 'lucide-react/dynamic'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { MarketplaceTemplate, UsageExampleMessage } from '@/components/agents/installation/types'; import { useComposioToolkitIcon } from '@/hooks/composio/use-composio'; import { useRouter } from 'next/navigation'; @@ -298,7 +299,7 @@ export const MarketplaceAgentPreviewDialog: React.FC {isInstalling ? ( <> - + Installing... ) : ( diff --git a/apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx b/apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx index 300219d3d7..84fd3aa7f8 100644 --- a/apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx +++ b/apps/frontend/src/components/agents/mcp/custom-mcp-dialog.tsx @@ -3,7 +3,8 @@ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, D import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Alert, AlertDescription } from '@/components/ui/alert'; -import { Loader2, AlertCircle, CheckCircle2, Zap, ChevronRight, Sparkles, Server } from 'lucide-react'; +import { AlertCircle, CheckCircle2, Zap, ChevronRight, Sparkles, Server } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Checkbox } from '@/components/ui/checkbox'; import { cn } from '@/lib/utils'; @@ -420,7 +421,7 @@ export const CustomMCPDialog: React.FC = ({ > {isSaving ? ( <> - + Adding MCP Server... ) : ( @@ -440,7 +441,7 @@ export const CustomMCPDialog: React.FC = ({ > {isValidating ? ( <> - + Connecting to MCP server... ) : ( diff --git a/apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx b/apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx index 40e0fc4636..84cb525bb6 100644 --- a/apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx +++ b/apps/frontend/src/components/agents/mcp/mcp-configuration-new.tsx @@ -8,7 +8,7 @@ import { CustomMCPDialog } from './custom-mcp-dialog'; import { ComposioRegistry } from '../composio/composio-registry'; import { ComposioToolsManager } from '../composio/composio-tools-manager'; import { ToolsManager } from './tools-manager'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueryClient } from '@tanstack/react-query'; import { useAccountState } from '@/hooks/billing'; import { usePricingModalStore } from '@/stores/pricing-modal-store'; diff --git a/apps/frontend/src/components/agents/mcp/tools-manager.tsx b/apps/frontend/src/components/agents/mcp/tools-manager.tsx index 02491d501f..3558a6f127 100644 --- a/apps/frontend/src/components/agents/mcp/tools-manager.tsx +++ b/apps/frontend/src/components/agents/mcp/tools-manager.tsx @@ -15,7 +15,6 @@ import { DialogFooter } from '@/components/ui/dialog'; import { - Loader2, CheckCircle2, XCircle, Zap, @@ -23,6 +22,7 @@ import { RefreshCw, Save } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { cn } from '@/lib/utils'; import { useCustomMCPToolsData } from '@/hooks/agents/use-custom-mcp-tools'; @@ -323,7 +323,7 @@ export const ToolsManager: React.FC = (props) => { > {isUpdating ? ( <> - + Saving... ) : saveMode === 'callback' ? ( diff --git a/apps/frontend/src/components/agents/new-agent-dialog.tsx b/apps/frontend/src/components/agents/new-agent-dialog.tsx index db78e98656..6bcc7c599a 100644 --- a/apps/frontend/src/components/agents/new-agent-dialog.tsx +++ b/apps/frontend/src/components/agents/new-agent-dialog.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState, useRef, useEffect } from 'react'; -import { Loader2, Plus, FileJson, Code } from 'lucide-react'; +import { Plus, FileJson, Code } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { AlertDialog, AlertDialogAction, @@ -15,7 +16,7 @@ import { import { useCreateNewAgent } from '@/hooks/agents/use-agents'; import { JsonImportDialog } from './json-import-dialog'; import { AgentCountLimitError } from '@/lib/api/errors'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { AgentCreationModal } from './agent-creation-modal'; import { isLocalMode, isStagingMode } from '@/lib/config'; @@ -151,7 +152,7 @@ export function NewAgentDialogLegacy({ open, onOpenChange, onSuccess }: NewAgent > {createNewAgentMutation.isPending ? ( <> - + Creating... ) : ( diff --git a/apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx b/apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx index e415dc7e6d..ffcfe5021b 100644 --- a/apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx +++ b/apps/frontend/src/components/agents/tools/granular-tool-configuration.tsx @@ -7,10 +7,11 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { SpotlightCard } from '@/components/ui/spotlight-card'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; -import { Search, ChevronDown, ChevronRight, Settings2, Wrench, Loader2 } from 'lucide-react'; +import { Search, ChevronDown, ChevronRight, Settings2, Wrench } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { icons } from 'lucide-react'; import { cn } from '@/lib/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useToolsMetadata } from '@/hooks/tools/use-tools-metadata'; import { getToolGroup, @@ -258,7 +259,7 @@ export const GranularToolConfiguration = ({ if (isLoadingTools) { return (

- + Loading tools...
); diff --git a/apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx b/apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx index 9c1adab462..d6ba56a9fa 100644 --- a/apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx +++ b/apps/frontend/src/components/agents/triggers/agent-triggers-configuration.tsx @@ -14,7 +14,7 @@ import { useToggleTrigger, useTriggerProviders } from '@/hooks/triggers'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { OneClickIntegrations } from './one-click-integrations'; interface AgentTriggersConfigurationProps { diff --git a/apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx b/apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx index 4c2900cab5..a652d87a2b 100644 --- a/apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx +++ b/apps/frontend/src/components/agents/triggers/event-based-trigger-dialog.tsx @@ -11,12 +11,13 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Separator } from '@/components/ui/separator'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Loader2, Search, ArrowLeft, Info, Zap, ChevronRight, Plus, Sparkles, CheckCircle2, Link2, Activity } from 'lucide-react'; +import { Search, ArrowLeft, Info, Zap, ChevronRight, Plus, Sparkles, CheckCircle2, Link2, Activity } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useComposioAppsWithTriggers, useComposioAppTriggers, useCreateComposioEventTrigger, ComposioTriggerType } from '@/hooks/composio/use-composio-triggers'; import { useUpdateTrigger } from '@/hooks/triggers'; import { useComposioProfiles } from '@/hooks/composio/use-composio-profiles'; import { useComposioToolkitDetails } from '@/hooks/composio/use-composio'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { cn, truncateString } from '@/lib/utils'; import { ComposioConnector } from '@/components/agents/composio/composio-connector'; import { UnifiedMarkdown } from '@/components/markdown'; @@ -683,7 +684,7 @@ export const EventBasedTriggerDialog: React.FC = ( {isEditMode && !selectedTrigger && (loadingTriggers || !selectedApp) ? (
- +

Loading trigger configuration...

{triggersError && (

Error: {String(triggersError)}

@@ -771,7 +772,7 @@ export const EventBasedTriggerDialog: React.FC = ( {loadingProfiles ? (
- + Loading...
@@ -844,7 +845,7 @@ export const EventBasedTriggerDialog: React.FC = ( > {(isEditMode ? updateTrigger.isPending : createTrigger.isPending) ? ( <> - + {isEditMode ? 'Updating...' : 'Creating...'} ) : ( diff --git a/apps/frontend/src/components/agents/triggers/one-click-integrations.tsx b/apps/frontend/src/components/agents/triggers/one-click-integrations.tsx index 70620c55e3..cd052cd113 100644 --- a/apps/frontend/src/components/agents/triggers/one-click-integrations.tsx +++ b/apps/frontend/src/components/agents/triggers/one-click-integrations.tsx @@ -2,7 +2,8 @@ import React, { useEffect, useState } from 'react'; import { Button } from '@/components/ui/button'; -import { Loader2, AlertCircle, Clock, PlugZap, Lock, Zap } from 'lucide-react'; +import { AlertCircle, Clock, PlugZap, Lock, Zap } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { SimplifiedScheduleConfig } from './providers/simplified-schedule-config'; import { TriggerProvider, ScheduleTriggerConfig } from './types'; @@ -16,7 +17,7 @@ import { useCreateTrigger, useDeleteTrigger } from '@/hooks/triggers'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { EventBasedTriggerDialog } from './event-based-trigger-dialog'; import { config, EnvMode, isLocalMode } from '@/lib/config'; import { useAccountState } from '@/hooks/billing'; @@ -228,7 +229,7 @@ export const OneClickIntegrations: React.FC = ({ className="flex items-center" > {isLoading ? ( - + ) : ( config.icon )} diff --git a/apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx b/apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx index 556417e925..82252b57a0 100644 --- a/apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx +++ b/apps/frontend/src/components/agents/triggers/providers/simplified-schedule-config.tsx @@ -19,7 +19,6 @@ import { Sparkles, Activity, Globe, - Loader2, CheckCircle2, Settings, Info diff --git a/apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx b/apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx index 08c8174f87..0133d7840f 100644 --- a/apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx +++ b/apps/frontend/src/components/agents/triggers/trigger-browse-dialog.tsx @@ -22,6 +22,7 @@ import { Activity, ArrowRight } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { TriggerProvider } from './types'; import { useTriggerProviders } from '@/hooks/triggers'; @@ -122,7 +123,7 @@ export const TriggerBrowseDialog: React.FC = ({
{loading ? (
-
+
) : error ? (
diff --git a/apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx b/apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx index e40cad541c..eadc9700d9 100644 --- a/apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx +++ b/apps/frontend/src/components/agents/upcoming-runs-dropdown.tsx @@ -17,6 +17,7 @@ import { TooltipTrigger, } from '@/components/ui/tooltip'; import { Clock, Calendar, ChevronDown, Activity, Zap, AlertCircle } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Badge } from '@/components/ui/badge'; import { useAgentUpcomingRuns, type UpcomingRun } from '@/hooks/agents/use-agent-upcoming-runs'; import { formatDistanceToNow, parseISO } from 'date-fns'; @@ -131,7 +132,7 @@ export const UpcomingRunsDropdown: React.FC = ({ agen {isLoading && (
-
+ Loading...
diff --git a/apps/frontend/src/components/agents/version-inline-editor.tsx b/apps/frontend/src/components/agents/version-inline-editor.tsx index a311964753..dcb183338b 100644 --- a/apps/frontend/src/components/agents/version-inline-editor.tsx +++ b/apps/frontend/src/components/agents/version-inline-editor.tsx @@ -4,7 +4,8 @@ import React, { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; -import { Edit2, Check, X, Loader2 } from 'lucide-react'; +import { Edit2, Check, X } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useUpdateVersionDetails } from '@/hooks/agents/use-agent-versions'; import { cn } from '@/lib/utils'; @@ -117,7 +118,7 @@ export function VersionInlineEditor({ className="h-8 w-8 p-0" > {updateVersionMutation.isPending ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/auth/example-showcase.tsx b/apps/frontend/src/components/auth/example-showcase.tsx index 8ac5c77ab3..7db21be382 100644 --- a/apps/frontend/src/components/auth/example-showcase.tsx +++ b/apps/frontend/src/components/auth/example-showcase.tsx @@ -3,7 +3,8 @@ import { useState, useEffect } from 'react'; import { Card } from '@/components/ui/card'; import Image from 'next/image'; -import { Computer, CornerDownLeft, Paperclip, Mic, Zap, FolderOpen, Globe, CircleDashed, Presentation, BarChart3, FileText, Search, Image as ImageIcon, ChevronRight, File, Database } from 'lucide-react'; +import { Computer, CornerDownLeft, Paperclip, Mic, Zap, FolderOpen, Globe, Presentation, BarChart3, FileText, Search, Image as ImageIcon, ChevronRight, File, Database } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { motion } from 'framer-motion'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; @@ -330,8 +331,12 @@ export function ExampleShowcase() {
- - Kortix + Kortix

{displayText} @@ -353,7 +358,7 @@ export function ExampleShowcase() { {step.title} {isCurrentStep && ( - + )}

diff --git a/apps/frontend/src/components/auth/phone-verification/otp-verification.tsx b/apps/frontend/src/components/auth/phone-verification/otp-verification.tsx index 136142d3f7..b54ef3f0e1 100644 --- a/apps/frontend/src/components/auth/phone-verification/otp-verification.tsx +++ b/apps/frontend/src/components/auth/phone-verification/otp-verification.tsx @@ -14,12 +14,12 @@ import { } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { - Loader2, Shield, RotateCcw, Trash2, MessageSquare, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; interface OtpVerificationProps { phoneNumber?: string; @@ -213,7 +213,7 @@ export function OtpVerification({ > {isLoading ? ( <> - + {t('verifying')} ) : ( @@ -248,7 +248,7 @@ export function OtpVerification({ > {isLoading ? ( <> - + {t('sending')} ) : ( diff --git a/apps/frontend/src/components/auth/phone-verification/phone-input.tsx b/apps/frontend/src/components/auth/phone-verification/phone-input.tsx index 1f36afb52d..daa1b873b7 100644 --- a/apps/frontend/src/components/auth/phone-verification/phone-input.tsx +++ b/apps/frontend/src/components/auth/phone-verification/phone-input.tsx @@ -6,7 +6,8 @@ import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Alert, AlertDescription } from "@/components/ui/alert"; -import { Loader2, Phone } from "lucide-react"; +import { Phone } from "lucide-react"; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { PhoneInput as PhoneInputComponent } from "@/components/ui/phone-input"; function getUserCountryCode(): string { @@ -153,7 +154,7 @@ export function PhoneInput({ onSubmit, isLoading = false, error = null }: PhoneI > {isLoading ? ( <> - + {t('sendingCode')} ) : ( diff --git a/apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx b/apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx index c6fa26cd04..e4b1f80971 100644 --- a/apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx +++ b/apps/frontend/src/components/auth/phone-verification/phone-verification-page.tsx @@ -18,7 +18,8 @@ import { signOut } from '@/app/auth/actions'; import { clearUserLocalStorage } from '@/lib/utils/clear-local-storage'; import { Button } from '@/components/ui/button'; import { Alert, AlertDescription } from '@/components/ui/alert'; -import { LogOut, Loader2, Shield } from 'lucide-react'; +import { LogOut, Shield } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useMutation } from '@tanstack/react-query'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; @@ -261,7 +262,7 @@ export function PhoneVerificationPage({ className="flex items-center gap-2 text-muted-foreground hover:text-foreground" > {signOutMutation.isPending ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/billing/credit-purchase.tsx b/apps/frontend/src/components/billing/credit-purchase.tsx index 815ee3787b..7f54e5cf58 100644 --- a/apps/frontend/src/components/billing/credit-purchase.tsx +++ b/apps/frontend/src/components/billing/credit-purchase.tsx @@ -11,9 +11,10 @@ import { import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; -import { Loader2, AlertCircle } from 'lucide-react'; +import { AlertCircle } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { billingApi } from '@/lib/api/billing'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { formatCredits } from '@/lib/utils/credit-formatter'; import { useUserCurrency } from '@/hooks/use-user-currency'; import { formatPrice, getCurrencySymbol } from '@/lib/utils/currency'; @@ -185,7 +186,7 @@ export function CreditPurchaseModal({ > {isProcessing ? ( <> - + Processing... ) : ( diff --git a/apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx b/apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx index 22888781b4..605c7e27bf 100644 --- a/apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx +++ b/apps/frontend/src/components/billing/downgrade-confirmation-dialog.tsx @@ -12,7 +12,7 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Textarea } from '@/components/ui/textarea'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; import { backendApi } from '@/lib/api-client'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; export type DowngradeReason = | 'tooExpensive' diff --git a/apps/frontend/src/components/billing/pricing/pricing-section.tsx b/apps/frontend/src/components/billing/pricing/pricing-section.tsx index 884c2c4d0d..4240a2c1ca 100644 --- a/apps/frontend/src/components/billing/pricing/pricing-section.tsx +++ b/apps/frontend/src/components/billing/pricing/pricing-section.tsx @@ -21,7 +21,7 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { AccountState } from '@/lib/api/billing'; import { createCheckoutSession, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse } from '@/lib/api/billing'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { isLocalMode } from '@/lib/config'; import { useAccountState, useScheduleDowngrade, accountStateKeys, accountStateSelectors } from '@/hooks/billing'; import { useAuth } from '@/components/AuthProvider'; diff --git a/apps/frontend/src/components/billing/subscription-cancellation-card.tsx b/apps/frontend/src/components/billing/subscription-cancellation-card.tsx index 05b41082fa..c395d40ff6 100644 --- a/apps/frontend/src/components/billing/subscription-cancellation-card.tsx +++ b/apps/frontend/src/components/billing/subscription-cancellation-card.tsx @@ -11,7 +11,8 @@ import { Calendar, Shield } from 'lucide-react'; -import { toast } from 'sonner'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { useReactivateSubscription } from '@/hooks/billing'; import { AlertDialog, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '../ui/alert-dialog'; @@ -112,7 +113,7 @@ export function SubscriptionCancellationCard({ > {reactivateSubscriptionMutation.isPending ? ( <> - + Reactivating... ) : ( diff --git a/apps/frontend/src/components/billing/usage-limits-card.tsx b/apps/frontend/src/components/billing/usage-limits-card.tsx new file mode 100644 index 0000000000..b55de89d7f --- /dev/null +++ b/apps/frontend/src/components/billing/usage-limits-card.tsx @@ -0,0 +1,183 @@ +'use client'; + +import React from 'react'; +import { Progress } from '@/components/ui/progress'; +import { useTranslations } from 'next-intl'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/tooltip'; +import { useAccountState } from '@/hooks/billing'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card'; + +export function UsageLimitsCard() { + const t = useTranslations('dashboard'); + const { data: accountState, isLoading } = useAccountState(); + const limits = accountState?.limits; + const UNLIMITED_THRESHOLD = 100_000; + + const formatMax = (max: number | undefined) => { + const value = max || 0; + return value >= UNLIMITED_THRESHOLD ? 'Unlimited' : value; + }; + + if (isLoading) { + return ( + + + {t('usageLimits')} + + Resource limits for your current plan + + + +
+ {[...Array(6)].map((_, i) => ( +
+
+
+
+
+
+
+ ))} +
+ + + ); + } + + return ( + + + {t('usageLimits')} + + Resource limits for your current plan + + + + +
+
+ + +
+ Chats + + {limits?.threads?.current || 0} / {formatMax(limits?.threads?.max)} + +
+
+ +

Total conversations with your AI Workers

+
+
+ = UNLIMITED_THRESHOLD + ? 0 + : ((limits?.threads?.current || 0) / (limits?.threads?.max || 1)) * 100 + } + /> +
+
+ + +
+ Concurrent Runs + {limits?.concurrent_runs?.running_count || 0} / {limits?.concurrent_runs?.limit || 0} +
+
+ +

AI Workers running at the same time

+
+
+ +
+
+ + +
+ Custom AI Workers + {limits?.ai_worker_count?.current_count || 0} / {limits?.ai_worker_count?.limit || 0} +
+
+ +

Create personalized AI Workers with custom instructions

+
+
+ +
+
+ + +
+ Integrations + {limits?.custom_mcp_count?.current_count || 0} / {limits?.custom_mcp_count?.limit || 0} +
+
+ +

Add external tool integrations and APIs

+
+
+ +
+
+ + +
+ Scheduled Triggers + {limits?.trigger_count?.scheduled?.current_count || 0} / {limits?.trigger_count?.scheduled?.limit || 0} +
+
+ +

Time-based automation (daily, weekly, hourly runs)

+
+
+ +
+
+ + +
+ App Triggers + {limits?.trigger_count?.app?.current_count || 0} / {limits?.trigger_count?.app?.limit || 0} +
+
+ +

Event-based automation (new email, CRM entry, Notion page, etc.)

+
+
+ +
+
+
+
+
+ ); +} + diff --git a/apps/frontend/src/components/dashboard/custom-agents-section.tsx b/apps/frontend/src/components/dashboard/custom-agents-section.tsx index 34e4da3fda..68ae12c510 100644 --- a/apps/frontend/src/components/dashboard/custom-agents-section.tsx +++ b/apps/frontend/src/components/dashboard/custom-agents-section.tsx @@ -10,7 +10,7 @@ import { Skeleton } from '@/components/ui/skeleton'; import { useRouter } from 'next/navigation'; import { MarketplaceAgentPreviewDialog } from '@/components/agents/marketplace-agent-preview-dialog'; import { StreamlinedInstallDialog } from '@/components/agents/installation/streamlined-install-dialog'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import type { MarketplaceTemplate } from '@/components/agents/installation/types'; import { AgentCountLimitError } from '@/lib/api/errors'; import { UnifiedAgentCard } from '@/components/ui/unified-agent-card'; diff --git a/apps/frontend/src/components/dashboard/dashboard-content.tsx b/apps/frontend/src/components/dashboard/dashboard-content.tsx index 2670f2c031..32c99b1bbb 100644 --- a/apps/frontend/src/components/dashboard/dashboard-content.tsx +++ b/apps/frontend/src/components/dashboard/dashboard-content.tsx @@ -18,13 +18,12 @@ import { useAgents } from '@/hooks/agents/use-agents'; import { usePricingModalStore } from '@/stores/pricing-modal-store'; import { useAgentSelection } from '@/stores/agent-selection-store'; import { useThreadQuery } from '@/hooks/threads/use-threads'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useSunaModePersistence } from '@/stores/suna-modes-store'; import { Button } from '../ui/button'; import { X, ChevronRight } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { NotificationDropdown } from '../notifications/notification-dropdown'; -import { UsageLimitsPopover } from './usage-limits-popover'; import { useSidebar } from '@/components/ui/sidebar'; import { useWelcomeBannerStore } from '@/stores/welcome-banner-store'; import { cn } from '@/lib/utils'; @@ -403,7 +402,6 @@ export function DashboardContent() { }> -
diff --git a/apps/frontend/src/components/dashboard/usage-limits-popover.tsx b/apps/frontend/src/components/dashboard/usage-limits-popover.tsx deleted file mode 100644 index acffaae536..0000000000 --- a/apps/frontend/src/components/dashboard/usage-limits-popover.tsx +++ /dev/null @@ -1,155 +0,0 @@ -'use client'; - -import React from 'react'; -import { Button } from '@/components/ui/button'; -import { Info } from 'lucide-react'; -import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; -import { Progress } from '@/components/ui/progress'; -import { useTranslations } from 'next-intl'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@/components/ui/tooltip'; -import { useAccountState } from '@/hooks/billing'; - -export function UsageLimitsPopover() { - const t = useTranslations('dashboard'); - const { data: accountState } = useAccountState(); - const limits = accountState?.limits; - const UNLIMITED_THRESHOLD = 100_000; - - const formatMax = (max: number | undefined) => { - const value = max || 0; - return value >= UNLIMITED_THRESHOLD ? 'Unlimited' : value; - }; - - return ( - - - - - - -
-

{t('usageLimits')}

-
-
- - -
- Chats - - {limits?.threads?.current || 0} / {formatMax(limits?.threads?.max)} - -
-
- -

Total conversations with your AI Workers

-
-
- = UNLIMITED_THRESHOLD - ? 0 - : ((limits?.threads?.current || 0) / (limits?.threads?.max || 1)) * 100 - } - /> -
-
- - -
- Concurrent Runs - {limits?.concurrent_runs?.running_count || 0} / {limits?.concurrent_runs?.limit || 0} -
-
- -

AI Workers running at the same time

-
-
- -
-
- - -
- Custom AI Workers - {limits?.ai_worker_count?.current_count || 0} / {limits?.ai_worker_count?.limit || 0} -
-
- -

Create personalized AI Workers with custom instructions

-
-
- -
-
- - -
- Integrations - {limits?.custom_mcp_count?.current_count || 0} / {limits?.custom_mcp_count?.limit || 0} -
-
- -

Add external tool integrations and APIs

-
-
- -
-
- - -
- Scheduled Triggers - {limits?.trigger_count?.scheduled?.current_count || 0} / {limits?.trigger_count?.scheduled?.limit || 0} -
-
- -

Time-based automation (daily, weekly, hourly runs)

-
-
- -
-
- - -
- App Triggers - {limits?.trigger_count?.app?.current_count || 0} / {limits?.trigger_count?.app?.limit || 0} -
-
- -

Event-based automation (new email, CRM entry, Notion page, etc.)

-
-
- -
-
-
-
-
-
- ); -} - diff --git a/apps/frontend/src/components/env-manager/local-env-manager.tsx b/apps/frontend/src/components/env-manager/local-env-manager.tsx index 6d43f324fb..67982fd58a 100644 --- a/apps/frontend/src/components/env-manager/local-env-manager.tsx +++ b/apps/frontend/src/components/env-manager/local-env-manager.tsx @@ -9,7 +9,7 @@ import { Label } from "../ui/label"; import { useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { backendApi } from "@/lib/api-client"; -import { toast } from "sonner"; +import { toast } from "@/lib/toast"; import { useForm } from "react-hook-form"; interface APIKeyForm { diff --git a/apps/frontend/src/components/file-editors/markdown-toolbar.tsx b/apps/frontend/src/components/file-editors/markdown-toolbar.tsx index 612e802db0..2835087348 100644 --- a/apps/frontend/src/components/file-editors/markdown-toolbar.tsx +++ b/apps/frontend/src/components/file-editors/markdown-toolbar.tsx @@ -6,7 +6,7 @@ import { Separator } from '@/components/ui/separator'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { createClient } from '@/lib/supabase/client'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { DropdownMenu, DropdownMenuContent, diff --git a/apps/frontend/src/components/file-renderers/binary-renderer.tsx b/apps/frontend/src/components/file-renderers/binary-renderer.tsx index 0df08e2447..52284c302d 100644 --- a/apps/frontend/src/components/file-renderers/binary-renderer.tsx +++ b/apps/frontend/src/components/file-renderers/binary-renderer.tsx @@ -3,7 +3,8 @@ import React from 'react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; -import { Download, File, Loader } from 'lucide-react'; +import { Download, File } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useDownloadRestriction } from '@/hooks/billing'; interface BinaryRendererProps { @@ -74,7 +75,7 @@ export function BinaryRenderer({ disabled={isDownloading} > {isDownloading ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/file-renderers/canvas-renderer.tsx b/apps/frontend/src/components/file-renderers/canvas-renderer.tsx index 87d28de9da..53b8659dca 100644 --- a/apps/frontend/src/components/file-renderers/canvas-renderer.tsx +++ b/apps/frontend/src/components/file-renderers/canvas-renderer.tsx @@ -9,7 +9,6 @@ import { ImagePlus, Maximize, Save, - Loader2, AlertCircle, Trash2, Copy, @@ -25,6 +24,7 @@ import { Frame, Palette, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { @@ -52,7 +52,7 @@ import { } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useAuth } from '@/components/AuthProvider'; // OCR detected text region with polygon bounding box @@ -1557,7 +1557,7 @@ function FloatingToolbar({ Cancel
@@ -1598,7 +1598,7 @@ function FloatingToolbar({ onClick={applyCrop} disabled={isCropping} > - {isCropping ? : null} + {isCropping ? : null} Create
@@ -1636,7 +1636,7 @@ function FloatingToolbar({ disabled={isProcessing} > {activeAction === 'upscale' ? ( - + ) : ( HD )} @@ -1657,7 +1657,7 @@ function FloatingToolbar({ disabled={isProcessing} > {activeAction === 'remove_bg' ? ( - + ) : ( @@ -1682,7 +1682,7 @@ function FloatingToolbar({ onClick={startTextEditMode} disabled={isProcessing || textEditMode} > - {isDetectingText ? : } + {isDetectingText ? : } Edit text @@ -1718,7 +1718,7 @@ function FloatingToolbar({ disabled={isProcessing} > {activeAction === 'mark_edit' ? ( - + ) : ( @@ -1753,7 +1753,7 @@ function FloatingToolbar({ > {isProcessing ? ( <> - + Generating... ) : ( @@ -2117,7 +2117,7 @@ function FrameFloatingToolbar({ onClick={onExportFrame} disabled={isExporting} > - {isExporting ? : } + {isExporting ? : } Export @@ -2322,7 +2322,7 @@ function MultiSelectToolbar({ onClick={openMergeDialog} > {isProcessing ? ( - + ) : ( )} @@ -2421,7 +2421,7 @@ function MultiSelectToolbar({ onClick={() => { setShowMergeDialog(false); handleMerge(); }} disabled={!mergePrompt.trim() || isProcessing} > - {isProcessing ? : null} + {isProcessing ? : null} Create
@@ -3384,7 +3384,7 @@ export function CanvasRenderer({ content, filePath, fileName, sandboxId, classNa }; if (!isMounted) { - return
; + return
; } // If no content AND no canvasData yet, show loading state @@ -3392,7 +3392,7 @@ export function CanvasRenderer({ content, filePath, fileName, sandboxId, classNa if (!content && !canvasData) { return (
- +
Loading canvas...
@@ -3430,7 +3430,7 @@ export function CanvasRenderer({ content, filePath, fileName, sandboxId, classNa
Reset View - {isSaving ? 'Saving...' : hasUnsavedChanges ? 'Save changes (⌘S)' : 'No changes'} + {isSaving ? 'Saving...' : hasUnsavedChanges ? 'Save changes (⌘S)' : 'No changes'} Add Image {/* Add Frame with presets */} @@ -3507,7 +3507,7 @@ export function CanvasRenderer({ content, filePath, fileName, sandboxId, classNa > {isGenerating ? ( <> - + Generating... ) : ( diff --git a/apps/frontend/src/components/file-renderers/pdf-renderer.tsx b/apps/frontend/src/components/file-renderers/pdf-renderer.tsx index 3e56bcd255..bdc152915d 100644 --- a/apps/frontend/src/components/file-renderers/pdf-renderer.tsx +++ b/apps/frontend/src/components/file-renderers/pdf-renderer.tsx @@ -7,9 +7,9 @@ import { Button } from '@/components/ui/button'; import { ChevronLeft, ChevronRight, - Loader, AlertTriangle, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; // Import styles for annotations and text layer import 'react-pdf/dist/Page/AnnotationLayer.css'; @@ -149,7 +149,7 @@ export function PdfRenderer({ url, className, compact = false }: PdfRendererProp file={url} loading={
- +
} error={ @@ -201,7 +201,7 @@ export function PdfRenderer({ url, className, compact = false }: PdfRendererProp onLoadError={onDocumentLoadError} loading={
- +

Loading PDF...

} @@ -214,7 +214,7 @@ export function PdfRenderer({ url, className, compact = false }: PdfRendererProp renderAnnotationLayer={true} loading={
- +
} className="shadow-lg rounded-lg overflow-hidden bg-white max-w-full" diff --git a/apps/frontend/src/components/file-renderers/pptx-renderer.tsx b/apps/frontend/src/components/file-renderers/pptx-renderer.tsx index a6af668c0c..1bbc9cb364 100644 --- a/apps/frontend/src/components/file-renderers/pptx-renderer.tsx +++ b/apps/frontend/src/components/file-renderers/pptx-renderer.tsx @@ -4,10 +4,10 @@ import React, { useState, useEffect, useMemo } from 'react'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { - Loader2, Download, AlertTriangle, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import DocViewer, { DocViewerRenderers } from '@cyntler/react-doc-viewer'; import '@cyntler/react-doc-viewer/dist/index.css'; import { constructHtmlPreviewUrl } from '@/lib/utils/url'; @@ -92,7 +92,7 @@ export function PptxRenderer({ if (isLoading) { return (
- +
); } @@ -108,7 +108,7 @@ export function PptxRenderer({

{onDownload && ( )} diff --git a/apps/frontend/src/components/file-renderers/video-renderer.tsx b/apps/frontend/src/components/file-renderers/video-renderer.tsx index 9c738aa223..a766d74eb2 100644 --- a/apps/frontend/src/components/file-renderers/video-renderer.tsx +++ b/apps/frontend/src/components/file-renderers/video-renderer.tsx @@ -14,8 +14,8 @@ import { RotateCcw, Info, Download, - Loader2, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; interface VideoRendererProps { url: string; @@ -191,7 +191,7 @@ export function VideoRenderer({
{isLoading && (
- +
)} {hasError ? ( @@ -255,7 +255,7 @@ export function VideoRenderer({ {/* Loading state */} {isLoading && (
- +
)} diff --git a/apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx b/apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx index e105ff3db9..66f04c405d 100644 --- a/apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx +++ b/apps/frontend/src/components/knowledge-base/edit-summary-modal.tsx @@ -11,7 +11,8 @@ import { import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Badge } from '@/components/ui/badge'; -import { Loader2, FileText, Sparkles, Save, X, Info } from 'lucide-react'; +import { FileText, Sparkles, Save, X, Info } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; interface EditSummaryModalProps { isOpen: boolean; @@ -138,7 +139,7 @@ export function EditSummaryModal({ > {isLoading ? ( <> - + Saving... ) : ( diff --git a/apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx b/apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx index 8fbe6621c7..c943ae1b80 100644 --- a/apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx +++ b/apps/frontend/src/components/knowledge-base/kb-delete-confirm-dialog.tsx @@ -1,7 +1,7 @@ 'use client'; import React from 'react'; -import { Loader2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { AlertDialog, @@ -57,7 +57,7 @@ export function KBDeleteConfirmDialog({ > {isDeleting ? ( <> - + Deleting... ) : ( diff --git a/apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx b/apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx index a20ef4625c..6919de2e3f 100644 --- a/apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx +++ b/apps/frontend/src/components/knowledge-base/kb-file-preview-modal.tsx @@ -10,8 +10,9 @@ import { import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; -import { FileIcon, Edit, Loader2 } from 'lucide-react'; -import { toast } from 'sonner'; +import { FileIcon, Edit } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; interface KBFilePreviewModalProps { isOpen: boolean; @@ -119,7 +120,7 @@ export function KBFilePreviewModal({ isOpen, onClose, file, onEditSummary }: KBF > {isSaving ? ( <> - + Saving... ) : ( diff --git a/apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx b/apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx index 12229c20e8..daf0475690 100644 --- a/apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx +++ b/apps/frontend/src/components/knowledge-base/knowledge-base-manager.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useState, useRef } from 'react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Skeleton } from '@/components/ui/skeleton'; diff --git a/apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx b/apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx index c8c5149b8a..d35a3c7f5b 100644 --- a/apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx +++ b/apps/frontend/src/components/knowledge-base/shared-kb-tree.tsx @@ -14,9 +14,9 @@ import { TrashIcon, Pen, GripVerticalIcon, - Loader2, FileTextIcon } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { DropdownMenu, DropdownMenuContent, @@ -272,7 +272,7 @@ export function SharedTreeItem({

{uploadStatus?.isUploading ? ( <> - + Uploading {uploadStatus.currentFile}... ({uploadStatus.completedFiles || 0}/{uploadStatus.totalFiles || 0}) @@ -348,7 +348,7 @@ export function SharedTreeItem({

{isLoadingEntries ? (
- + Loading files...
) : item.children && item.children.length > 0 ? ( @@ -428,7 +428,7 @@ export function SharedTreeItem({

{itemIsMoving ? ( <> - + Moving... ) : ( diff --git a/apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx b/apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx index 6b39b9c8e5..ed2cdda9c1 100644 --- a/apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx +++ b/apps/frontend/src/components/knowledge-base/unified-kb-entry-modal.tsx @@ -31,13 +31,13 @@ import { X, CheckCircle, AlertCircle, - Loader2, Upload, Check, FileIcon, Folder, } from 'lucide-react'; -import { toast } from 'sonner'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { createClient } from '@/lib/supabase/client'; import { useNameValidation } from '@/lib/validation'; import { cn } from '@/lib/utils'; @@ -474,7 +474,7 @@ export function UnifiedKbEntryModal({ disabled={!folderValidation.isValid || isCreatingFolder} > {isCreatingFolder ? ( - + ) : ( )} @@ -583,7 +583,7 @@ export function UnifiedKbEntryModal({

{formatFileSize(status.file.size)}

- {status.status === 'uploading' && } + {status.status === 'uploading' && } {status.status === 'success' && } {status.status === 'error' && } {status.status === 'queued' && !isUploading && ( @@ -670,7 +670,7 @@ export function UnifiedKbEntryModal({ > {isUploading ? ( <> - + Uploading... ) : ( @@ -688,7 +688,7 @@ export function UnifiedKbEntryModal({ > {isCreatingText ? ( <> - + Creating... ) : ( @@ -706,7 +706,7 @@ export function UnifiedKbEntryModal({ > {isCloning ? ( <> - + Cloning... ) : ( diff --git a/apps/frontend/src/components/notifications/notification-settings.tsx b/apps/frontend/src/components/notifications/notification-settings.tsx index da747fbed2..60e127d13b 100644 --- a/apps/frontend/src/components/notifications/notification-settings.tsx +++ b/apps/frontend/src/components/notifications/notification-settings.tsx @@ -7,7 +7,7 @@ import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { notificationAPI, type NotificationSettings } from '@/lib/api/notifications'; import { isStagingMode } from '@/lib/config'; diff --git a/apps/frontend/src/components/referrals/referral-code-section.tsx b/apps/frontend/src/components/referrals/referral-code-section.tsx index 39941317b5..9f4bd87190 100644 --- a/apps/frontend/src/components/referrals/referral-code-section.tsx +++ b/apps/frontend/src/components/referrals/referral-code-section.tsx @@ -3,7 +3,7 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Copy, Share2, Check } from 'lucide-react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useTranslations } from 'next-intl'; import { Skeleton } from '@/components/ui/skeleton'; import { useState } from 'react'; diff --git a/apps/frontend/src/components/referrals/referral-email-invitation.tsx b/apps/frontend/src/components/referrals/referral-email-invitation.tsx index 80ef519283..bfe8f8684c 100644 --- a/apps/frontend/src/components/referrals/referral-email-invitation.tsx +++ b/apps/frontend/src/components/referrals/referral-email-invitation.tsx @@ -7,7 +7,7 @@ import { Mail, X, Loader2, Check } from 'lucide-react'; import { useSendReferralEmails } from '@/hooks/referrals/use-referrals'; import { useTranslations } from 'next-intl'; import { cn } from '@/lib/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface ReferralEmailProps { className?: string; diff --git a/apps/frontend/src/components/settings/user-settings-modal.tsx b/apps/frontend/src/components/settings/user-settings-modal.tsx index 2ae0390334..f89cd944ae 100644 --- a/apps/frontend/src/components/settings/user-settings-modal.tsx +++ b/apps/frontend/src/components/settings/user-settings-modal.tsx @@ -42,7 +42,7 @@ import { TooltipTrigger, } from '@/components/ui/tooltip'; import { createClient } from '@/lib/supabase/client'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { isLocalMode, isProductionMode } from '@/lib/config'; import { backendApi } from '@/lib/api-client'; import { useQuery, useMutation } from '@tanstack/react-query'; @@ -92,6 +92,7 @@ import { getPlanName, getPlanIcon } from '../billing/plan-utils'; import { TierBadge } from '../billing/tier-badge'; import { siteConfig } from '@/lib/site-config'; import ThreadUsage from '@/components/billing/thread-usage'; +import { UsageLimitsCard } from '@/components/billing/usage-limits-card'; import { formatCredits } from '@/lib/utils/credit-formatter'; import { LanguageSwitcher } from './language-switcher'; import { useTranslations } from 'next-intl'; @@ -1327,6 +1328,7 @@ function CreditsHelpAlert() { function UsageTab() { return (
+
); diff --git a/apps/frontend/src/components/sidebar/nav-agents-view.tsx b/apps/frontend/src/components/sidebar/nav-agents-view.tsx index f7ea134ba2..20be4f3e57 100644 --- a/apps/frontend/src/components/sidebar/nav-agents-view.tsx +++ b/apps/frontend/src/components/sidebar/nav-agents-view.tsx @@ -19,7 +19,7 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { DeleteConfirmationDialog } from "@/components/thread/DeleteConfirmationDialog"; -import { toast } from "sonner"; +import { toast } from "@/lib/toast"; import { useQueryClient } from '@tanstack/react-query'; import { agentKeys } from '@/hooks/agents/keys'; diff --git a/apps/frontend/src/components/sidebar/nav-agents.tsx b/apps/frontend/src/components/sidebar/nav-agents.tsx index 2b602782b3..c0bdb4162e 100644 --- a/apps/frontend/src/components/sidebar/nav-agents.tsx +++ b/apps/frontend/src/components/sidebar/nav-agents.tsx @@ -5,15 +5,15 @@ import { useQueryClient } from '@tanstack/react-query'; import { MoreHorizontal, Trash2, - Loader2, ChevronRight, ChevronLeft, Frown, Plus, ChevronDown } from "lucide-react" +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ThreadIcon } from "./thread-icon" -import { toast } from "sonner" +import { toast } from "@/lib/toast" import { usePathname, useRouter } from "next/navigation" import { Collapsible, @@ -106,7 +106,7 @@ const SingleChatCard: React.FC<{ {/* Icon */}
{isThreadLoading ? ( - + ) : ( {isCreatingChat ? ( - + ) : ( )} @@ -789,7 +789,7 @@ export function NavAgents() { }} > {isCreatingChat ? ( - + ) : ( )} @@ -900,7 +900,7 @@ export function NavAgents() { {isThreadsFetching && ( - + )} {currentPage} / @@ -944,7 +944,7 @@ export function NavAgents() {
- + Deleting... {Math.floor(deleteProgress)}% diff --git a/apps/frontend/src/components/sidebar/nav-tasks.tsx b/apps/frontend/src/components/sidebar/nav-tasks.tsx index ba042cefa1..2ed74ae1e4 100644 --- a/apps/frontend/src/components/sidebar/nav-tasks.tsx +++ b/apps/frontend/src/components/sidebar/nav-tasks.tsx @@ -5,11 +5,11 @@ import { useQueryClient } from '@tanstack/react-query'; import { MoreHorizontal, Trash2, - Loader2, Frown, } from "lucide-react"; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ThreadIcon } from "./thread-icon"; -import { toast } from "sonner"; +import { toast } from "@/lib/toast"; import { usePathname, useRouter } from "next/navigation"; import { cn } from '@/lib/utils'; import { @@ -65,7 +65,7 @@ const TaskItem: React.FC<{ {/* Icon with optional running indicator */}
{isLoading ? ( - + ) : (
{isThreadLoading ? ( - + ) : (
{isThreadLoading ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/sidebar/share-modal.tsx b/apps/frontend/src/components/sidebar/share-modal.tsx index e9fed6870b..41e67a3ffa 100644 --- a/apps/frontend/src/components/sidebar/share-modal.tsx +++ b/apps/frontend/src/components/sidebar/share-modal.tsx @@ -4,7 +4,7 @@ import { useState, useEffect } from "react" import { Popover, PopoverContent, PopoverTrigger, PopoverAnchor } from "@/components/ui/popover" import { Switch } from "@/components/ui/switch" import { Copy, Check, Globe, ExternalLink, Lock } from "lucide-react" -import { toast } from "sonner" +import { toast } from "@/lib/toast" import { useThreadQuery, useUpdateThreadMutation } from "@/hooks/threads/use-threads" import { Skeleton } from "../ui/skeleton" import { cn } from "@/lib/utils" diff --git a/apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx b/apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx index d96377ff61..839b2e75b0 100644 --- a/apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx +++ b/apps/frontend/src/components/thread/DeleteConfirmationDialog.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useEffect } from 'react'; -import { Loader2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { AlertDialog, @@ -63,7 +63,7 @@ export function DeleteConfirmationDialog({ > {isDeleting ? ( <> - + Deleting... ) : ( diff --git a/apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx b/apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx index dfab9ef279..4cbbe7025a 100644 --- a/apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx +++ b/apps/frontend/src/components/thread/HealthCheckedVncIframe.tsx @@ -3,7 +3,8 @@ import React, { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; -import { Loader2, AlertCircle, RefreshCw } from 'lucide-react'; +import { AlertCircle, RefreshCw } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useVncPreloader } from '@/hooks/files'; interface HealthCheckedVncIframeProps { @@ -51,7 +52,7 @@ export function HealthCheckedVncIframe({ sandbox, className }: HealthCheckedVncI
- +

Connecting to browser...

Testing VNC connection @@ -106,7 +107,7 @@ export function HealthCheckedVncIframe({ sandbox, className }: HealthCheckedVncI {isBrowserLoading && (

- +

Initializing browser...

diff --git a/apps/frontend/src/components/thread/ThreadComponent.tsx b/apps/frontend/src/components/thread/ThreadComponent.tsx index bec1881ece..08f94aaa6f 100644 --- a/apps/frontend/src/components/thread/ThreadComponent.tsx +++ b/apps/frontend/src/components/thread/ThreadComponent.tsx @@ -13,7 +13,7 @@ import { ProjectLimitError, BillingError } from '@/lib/api/errors'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { ChatInput, ChatInputHandles } from '@/components/thread/chat-input/chat-input'; import { SidebarContext } from '@/components/ui/sidebar'; import { useAgentStream } from '@/hooks/messages'; diff --git a/apps/frontend/src/components/thread/agent-run-limit-banner.tsx b/apps/frontend/src/components/thread/agent-run-limit-banner.tsx index aaca65443d..0cafb5dd77 100644 --- a/apps/frontend/src/components/thread/agent-run-limit-banner.tsx +++ b/apps/frontend/src/components/thread/agent-run-limit-banner.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useEffect } from 'react'; -import { AlertTriangle, ExternalLink, Square, Loader2, Zap, X } from 'lucide-react'; +import { AlertTriangle, ExternalLink, Square, Zap, X } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -14,7 +15,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip import Link from 'next/link'; import { useStopAgentMutation } from '@/hooks/threads/use-agent-run'; import { AgentRun, getAgentRuns } from '@/lib/api/agents'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueries, useQueryClient } from '@tanstack/react-query'; import { getThread } from '@/hooks/threads/utils'; import { getProject } from '@/lib/api/threads'; @@ -160,7 +161,7 @@ export const AgentRunLimitBanner: React.FC = ({ {/* Running agent info */} {isAnyLoading ? (
- + Loading active worker...
) : firstRunningAgent?.agentRun ? ( @@ -192,7 +193,7 @@ export const AgentRunLimitBanner: React.FC = ({ disabled={stopAgentMutation.isPending} > {stopAgentMutation.isPending ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/thread/agent-run-limit-dialog.tsx b/apps/frontend/src/components/thread/agent-run-limit-dialog.tsx index 6da3c7c36b..e72fa579ef 100644 --- a/apps/frontend/src/components/thread/agent-run-limit-dialog.tsx +++ b/apps/frontend/src/components/thread/agent-run-limit-dialog.tsx @@ -1,7 +1,8 @@ 'use client'; import React, { useState, useMemo } from 'react'; -import { AlertTriangle, ExternalLink, X, Square, Loader2, Zap, Rocket } from 'lucide-react'; +import { AlertTriangle, ExternalLink, X, Square, Zap, Rocket } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; @@ -11,7 +12,7 @@ import { UpgradeDialog } from '@/components/ui/upgrade-dialog'; import Link from 'next/link'; import { useStopAgentMutation } from '@/hooks/threads/use-agent-run'; import { AgentRun, getAgentRuns } from '@/lib/api/agents'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useQueries, useQueryClient } from '@tanstack/react-query'; import { getThread } from '@/hooks/threads/utils'; import { getProject } from '@/lib/api/threads'; @@ -106,7 +107,7 @@ const RunningThreadItem: React.FC = ({ disabled={stopAgentMutation.isPending || threadInfo.isLoading} > {stopAgentMutation.isPending ? ( - + ) : ( )} @@ -291,7 +292,7 @@ export const AgentRunLimitDialog: React.FC = ({ {isLoadingThreads ? (
- + Loading threads...
) : runningThreadIds.length === 0 ? ( diff --git a/apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx b/apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx index 63d796fca0..0a50a8cbca 100644 --- a/apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx +++ b/apps/frontend/src/components/thread/chat-input/file-upload-handler.tsx @@ -2,8 +2,9 @@ import React, { forwardRef, useEffect, memo } from 'react'; import { Button } from '@/components/ui/button'; -import { Paperclip, Loader2 } from 'lucide-react'; -import { toast } from 'sonner'; +import { Paperclip } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; +import { toast } from '@/lib/toast'; import { createClient } from '@/lib/supabase/client'; import { useQueryClient } from '@tanstack/react-query'; import { fileQueryKeys } from '@/hooks/files/use-file-queries'; @@ -560,7 +561,7 @@ export const FileUploadHandler = memo(forwardRef< } > {isUploading ? ( - + ) : ( )} diff --git a/apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx b/apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx index ff1575a7db..4b8f1f008f 100644 --- a/apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx +++ b/apps/frontend/src/components/thread/chat-input/unified-config-menu.tsx @@ -18,7 +18,8 @@ import { } from '@/components/ui/sheet'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; -import { Search, Check, ChevronDown, Plus, Loader2, Plug, Brain, LibraryBig, Zap, Lock, Sparkles, ChevronLeft } from 'lucide-react'; +import { Search, Check, ChevronDown, Plus, Plug, Brain, LibraryBig, Zap, Lock, Sparkles, ChevronLeft } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useAgents } from '@/hooks/agents/use-agents'; import { KortixLogo } from '@/components/sidebar/kortix-logo'; import type { ModelOption } from '@/hooks/agents'; @@ -274,7 +275,7 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen > {isFetching ? ( <> - + Loading... ) : ( @@ -545,6 +546,9 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen ) : null ), [onAgentSelect, selectedAgentId, displayAgent?.agent_id, handleQuickAction]); + // Check if current agent is Kortix (used in multiple places) + const isKortixAgent = !displayAgent?.name || displayAgent?.name === 'Kortix'; + // Mobile Sheet Content const MobileSheetContent = useCallback(() => { if (mobileSection === 'agents') { @@ -607,12 +611,23 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen onClick={() => setMobileSection('agents')} className="w-full flex items-center gap-3 p-3 rounded-2xl border border-border bg-card hover:bg-muted/50 active:bg-muted/70 transition-colors" > -
- {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent, 40)} -
- - {displayAgent?.name || 'Kortix'} - + {isKortixAgent ? ( + Kortix + ) : ( + <> +
+ {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent, 40)} +
+ + {displayAgent?.name} + + + )}
@@ -635,7 +650,7 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen )}
); - }, [mobileSection, searchQuery, onAgentSelect, displayAgent, isLoading, placeholderSunaAgent, renderAgentIcon, selectedAgentId, AgentsList, CreateWorkerButton, ModeToggle, WorkerSettingsButtons]); + }, [mobileSection, searchQuery, onAgentSelect, displayAgent, isLoading, placeholderSunaAgent, renderAgentIcon, selectedAgentId, AgentsList, CreateWorkerButton, ModeToggle, WorkerSettingsButtons, isKortixAgent]); // Trigger button const TriggerButton = ( @@ -648,10 +663,21 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen > {onAgentSelect ? (
- {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent, 24)} - - {displayAgent?.name || 'Kortix'} - + {isKortixAgent ? ( + Kortix + ) : ( + <> + {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent, 24)} + + {displayAgent?.name} + + + )}
) : ( @@ -719,10 +745,21 @@ const LoggedInMenu: React.FC = memo(function LoggedInMen -
- {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent)} -
- {displayAgent?.name || 'Kortix'} + {isKortixAgent ? ( + Kortix + ) : ( + <> +
+ {renderAgentIcon(isLoading && !displayAgent ? placeholderSunaAgent : displayAgent)} +
+ {displayAgent?.name} + + )}
diff --git a/apps/frontend/src/components/thread/chat-input/voice-recorder.tsx b/apps/frontend/src/components/thread/chat-input/voice-recorder.tsx index f8e40ef271..c023d9766d 100644 --- a/apps/frontend/src/components/thread/chat-input/voice-recorder.tsx +++ b/apps/frontend/src/components/thread/chat-input/voice-recorder.tsx @@ -1,5 +1,6 @@ import React, { useState, useRef, useEffect, memo } from 'react'; -import { Mic, Square, Loader2 } from 'lucide-react'; +import { Mic, Square } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { Button } from '@/components/ui/button'; import { Tooltip, @@ -153,7 +154,7 @@ export const VoiceRecorder: React.FC = memo(function VoiceRe case 'recording': return ; case 'processing': - return ; + return ; default: return ; } diff --git a/apps/frontend/src/components/thread/content/ThreadContent.tsx b/apps/frontend/src/components/thread/content/ThreadContent.tsx index a4a4d56f55..23665e12de 100644 --- a/apps/frontend/src/components/thread/content/ThreadContent.tsx +++ b/apps/frontend/src/components/thread/content/ThreadContent.tsx @@ -28,6 +28,7 @@ import { } from "@/hooks/messages/utils"; import { AppIcon } from "../tool-views/shared/AppIcon"; import { useSmoothText } from "@/hooks/messages/useSmoothText"; +import { isHiddenTool } from "@agentpress/shared/tools"; export function renderAttachments( attachments: string[], @@ -535,11 +536,22 @@ const AssistantGroupRow = memo(function AssistantGroupRow({ if (isAskOrComplete) return null; + // Filter out hidden tools (internal/initialization tools) + const visibleToolCalls = toolCalls.filter((tc: any) => { + const toolName = tc.function_name?.replace(/_/g, "-") || ""; + return !isHiddenTool(toolName); + }); + + // If all tools were hidden, don't render anything + if (visibleToolCalls.length === 0 && toolCalls.length > 0) { + return null; + } + return (
- {toolCalls.length > 0 ? ( - toolCalls.map((tc: any, tcIndex: number) => { + {visibleToolCalls.length > 0 ? ( + visibleToolCalls.map((tc: any, tcIndex: number) => { const toolName = tc.function_name?.replace(/_/g, "-") || ""; const toolCallContent = JSON.stringify({ function: { name: toolName }, diff --git a/apps/frontend/src/components/thread/file-browser.tsx b/apps/frontend/src/components/thread/file-browser.tsx index 5e5f5ee9c5..1ccd58af1a 100644 --- a/apps/frontend/src/components/thread/file-browser.tsx +++ b/apps/frontend/src/components/thread/file-browser.tsx @@ -23,7 +23,7 @@ import { getSandboxFileContent, type FileInfo, } from '@/lib/api/sandbox'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useDownloadRestriction } from '@/hooks/billing'; import { useDraggable } from '@dnd-kit/core'; import { cn } from '@/lib/utils'; diff --git a/apps/frontend/src/components/thread/iframe-preview.tsx b/apps/frontend/src/components/thread/iframe-preview.tsx index fb6c25c553..debb645aa9 100644 --- a/apps/frontend/src/components/thread/iframe-preview.tsx +++ b/apps/frontend/src/components/thread/iframe-preview.tsx @@ -1,7 +1,7 @@ 'use client'; import React from 'react'; -import { Loader2 } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { cn } from '@/lib/utils'; interface IframePreviewProps { @@ -23,7 +23,7 @@ export function IframePreview({ {/* Loading overlay */} {isLoading && (
- +
)} diff --git a/apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx b/apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx index 2c8c5b75dc..ac435991f9 100644 --- a/apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/FileBrowserView.tsx @@ -36,7 +36,7 @@ import { type FileInfo, } from '@/lib/api/sandbox'; import { Project } from '@/lib/api/threads'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { createClient } from '@/lib/supabase/client'; import { useAuth } from '@/components/AuthProvider'; import { diff --git a/apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx b/apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx index 0192577af2..4d07168877 100644 --- a/apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/FileViewerView.tsx @@ -25,7 +25,7 @@ import { type MarkdownEditorControls, } from '@/components/file-editors'; import { Project } from '@/lib/api/threads'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useAuth } from '@/components/AuthProvider'; import { useFileContentQuery, diff --git a/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx b/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx index 3bccda0a35..4ef262a7bb 100644 --- a/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/KortixComputer.tsx @@ -2,11 +2,13 @@ import { Project } from '@/lib/api/threads'; import { getUserFriendlyToolName, HIDE_BROWSER_TAB } from '@/components/thread/utils'; +import { isHiddenTool } from '@agentpress/shared/tools'; import React, { memo, useMemo, useCallback, useState, useEffect, useRef } from 'react'; import { createPortal } from 'react-dom'; import { Skeleton } from '@/components/ui/skeleton'; import { ApiMessageType } from '@/components/thread/types'; -import { CircleDashed, Globe } from 'lucide-react'; +import { Globe } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { useIsMobile } from '@/hooks/utils'; import { ToolView } from '../tool-views/wrapper'; import { motion, AnimatePresence } from 'framer-motion'; @@ -243,14 +245,22 @@ export const KortixComputer = memo(function KortixComputer({ setIsMaximized(!isMaximized); }, [isMaximized]); + // Filter out hidden tools (internal/initialization tools) before creating snapshots + const visibleToolCalls = useMemo(() => { + return toolCalls.filter(tc => { + const toolName = tc.toolCall?.function_name?.replace(/_/g, '-').toLowerCase() || ''; + return !isHiddenTool(toolName); + }); + }, [toolCalls]); + const newSnapshots = useMemo(() => { - return toolCalls.map((toolCall, index) => ({ + return visibleToolCalls.map((toolCall, index) => ({ id: `${index}-${toolCall.assistantTimestamp || Date.now()}`, toolCall, index, timestamp: Date.now(), })); - }, [toolCalls, isOpen]); + }, [visibleToolCalls, isOpen]); useEffect(() => { const hadSnapshots = toolCallSnapshots.length > 0; diff --git a/apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx b/apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx index 46bd487cea..acf6ad6717 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/Desktop.tsx @@ -27,7 +27,7 @@ import { getFileIconByName } from './Icons'; import { SystemInfoContent } from './SystemInfoContent'; import { FileInfoContent, FileInfo } from './FileInfoContent'; import dynamic from 'next/dynamic'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; // Lazy load SpreadsheetApp as it imports Syncfusion (~1-2 MB) const SpreadsheetApp = dynamic( diff --git a/apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx b/apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx index 01b44c7d23..bfbaba435c 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/DesktopIcons.tsx @@ -6,7 +6,7 @@ import { cn } from '@/lib/utils'; import { getFileIcon, FolderIcon } from './Icons'; import { FileContextMenu } from './FileContextMenu'; import { ContextMenuTrigger } from '@/components/ui/context-menu'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface DesktopFile { name: string; diff --git a/apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx b/apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx index 8fc6f32732..4ccdac65ee 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/EmptyState.tsx @@ -1,36 +1,105 @@ 'use client'; -import { memo } from 'react'; -import { Computer } from 'lucide-react'; +import { memo, useState, useEffect } from 'react'; +import Image from 'next/image'; interface EmptyStateProps { t: (key: string) => string; } export const EmptyState = memo(function EmptyState({ t }: EmptyStateProps) { + const [dots, setDots] = useState(''); + + useEffect(() => { + const interval = setInterval(() => { + setDots((prev) => (prev.length >= 3 ? '' : prev + '.')); + }, 500); + return () => clearInterval(interval); + }, []); + return ( -
-
+
+ {/* Boot screen container */} +
+ {/* Logo with subtle glow effect */}
-
- -
-
-
-
+ {/* Ambient glow behind logo */} +
+ + {/* Logo - dark mode (white logo) */} + Kortix Computer + + {/* Logo - light mode (black logo) */} + Kortix Computer
-
-

- {t('noActionsYet')} -

-

- {t('workerActionsDescription')} + + {/* Loading indicator section */} +

+ {/* Animated progress bar */} +
+
+
+ + {/* Status text with animated dots */} +

+ {t('workerActionsDescription')} + {dots}

+ + {/* Add keyframe animations via style tag */} +
); }); EmptyState.displayName = 'EmptyState'; - diff --git a/apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx b/apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx index 1440ec083a..90d14eb9aa 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/EnhancedFileBrowser.tsx @@ -16,7 +16,7 @@ import { motion } from 'framer-motion'; import { getFileIconByName } from './Icons'; import { FileContextMenu } from './FileContextMenu'; import { ContextMenuTrigger } from '@/components/ui/context-menu'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface FileItem { name: string; diff --git a/apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx b/apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx index 7d48e3fdb3..763acfdff4 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/FileInfoContent.tsx @@ -4,7 +4,7 @@ import { memo, useState } from 'react'; import { Folder, File, Calendar, MapPin, Copy, Check } from 'lucide-react'; import { cn } from '@/lib/utils'; import { getFileIconByName } from './Icons'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; export interface FileInfo { name: string; diff --git a/apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx b/apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx index 001a8dd292..61956a3f05 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/PanelHeader.tsx @@ -5,10 +5,10 @@ import { CircleDashed, Minimize2, Maximize2, Wifi, Battery, BatteryLow, BatteryM import { Button } from '@/components/ui/button'; import { DrawerTitle } from '@/components/ui/drawer'; import { ViewType } from '@/stores/kortix-computer-store'; -import { KortixLogo } from '@/components/sidebar/kortix-logo'; import { cn } from '@/lib/utils'; import { ViewToggle } from './ViewToggle'; import { ToolbarButtons } from './ToolbarButtons'; +import Image from 'next/image'; function useBatteryStatus() { const [batteryInfo, setBatteryInfo] = useState<{ level: number; charging: boolean } | null>(null); @@ -128,18 +128,27 @@ export const PanelHeader = memo(function PanelHeader({ onToggleSuiteMode, hideViewToggle = false, }: PanelHeaderProps) { - const title = "Kortix Computer"; - if (variant === 'drawer') { return (
-
-
- -
- - {title} - +
+ Kortix Computer + Kortix Computer + Kortix Computer
@@ -172,14 +181,24 @@ export const PanelHeader = memo(function PanelHeader({
onMaximize?.()} - className="flex items-center justify-center gap-1.5 cursor-pointer select-none hover:opacity-80 transition-opacity" + className="flex items-center justify-center cursor-pointer select-none hover:opacity-80 transition-opacity" > -
- -
-

- {title} -

+ Kortix Computer + Kortix Computer
diff --git a/apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx index 183dd65a2d..3ef8cf8d13 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/SSHTerminal.tsx @@ -10,7 +10,7 @@ import { WebLinksAddon } from '@xterm/addon-web-links'; import '@xterm/xterm/css/xterm.css'; import { useAuth } from '@/components/AuthProvider'; import { Loader2, RefreshCw, Copy, Check, TerminalSquare } from 'lucide-react'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { backendApi } from '@/lib/api-client'; import { fileQueryKeys } from '@/hooks/files/use-file-queries'; diff --git a/apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx b/apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx index 1704becf4e..2c76a303ce 100644 --- a/apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx +++ b/apps/frontend/src/components/thread/kortix-computer/components/SpreadsheetApp.tsx @@ -27,7 +27,7 @@ import { SyncStatusIndicator } from '../../tool-views/spreadsheet/SyncStatusIndi import { SpreadsheetLoader } from '../../tool-views/spreadsheet/SpreadsheetLoader'; import { Button } from '@/components/ui/button'; import { useAuth } from '@/components/AuthProvider'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { useDownloadRestriction } from '@/hooks/billing'; import '../../../../../node_modules/@syncfusion/ej2-base/styles/material.css'; diff --git a/apps/frontend/src/components/thread/thread-site-header.tsx b/apps/frontend/src/components/thread/thread-site-header.tsx index 29f705fa01..ead77b1daa 100644 --- a/apps/frontend/src/components/thread/thread-site-header.tsx +++ b/apps/frontend/src/components/thread/thread-site-header.tsx @@ -3,7 +3,7 @@ import { Button } from "@/components/ui/button" import { FolderOpen, Upload, PanelRightOpen, PanelRightClose, Copy, Check } from "lucide-react" import { usePathname } from "next/navigation" -import { toast } from "sonner" +import { toast } from "@/lib/toast" import { Tooltip, TooltipContent, diff --git a/apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx b/apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx index f6b2244d84..e324e9043c 100644 --- a/apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/BrowserToolView.tsx @@ -279,23 +279,6 @@ export function BrowserToolView({
- {!isRunning && ( - - {isSuccess ? ( - - ) : ( - - )} - {isSuccess ? 'Browser action completed' : 'Browser action failed'} - - )} {viewToggle} {(result || parameters) &&
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Completed' : 'Failed'} - - )} - - {isStreaming && ( - - - Completing - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx b/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx index a797d439c7..b662a0b7ae 100644 --- a/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/GenericToolView.tsx @@ -8,7 +8,6 @@ import { Wrench, Copy, Check, - Loader2, } from 'lucide-react'; import { ToolViewProps } from './types'; import { formatTimestamp, getToolTitle } from './utils'; @@ -17,7 +16,7 @@ import { Badge } from '@/components/ui/badge'; import { ScrollArea } from "@/components/ui/scroll-area"; import { Button } from '@/components/ui/button'; import { LoadingState } from './shared/LoadingState'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { AppIcon } from './shared/AppIcon'; import { SmartJsonViewer } from './shared/SmartJsonViewer'; @@ -181,30 +180,6 @@ export function GenericToolView({
- {!isStreaming && ( - - {isSuccess ? ( - - ) : ( - - )} - {isSuccess ? 'Tool executed successfully' : 'Tool execution failed'} - - )} - - {isStreaming && ( - - - Executing - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/KbToolView.tsx b/apps/frontend/src/components/thread/tool-views/KbToolView.tsx index 1fa56202bf..1a05f01ec6 100644 --- a/apps/frontend/src/components/thread/tool-views/KbToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/KbToolView.tsx @@ -21,7 +21,7 @@ import { Badge } from '@/components/ui/badge'; import { ScrollArea } from "@/components/ui/scroll-area"; import { Button } from '@/components/ui/button'; import { LoadingState } from './shared/LoadingState'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; interface KbOperation { type: 'search' | 'sync' | 'list' | 'create' | 'upload' | 'delete' | 'enable' | 'cleanup' | 'init'; @@ -622,33 +622,19 @@ export function KbToolView({
- {!isStreaming && ( -
- - {isSuccess ? 'Success' : 'Failed'} - - {toolResult?.output && ( - + {!isStreaming && toolResult?.output && ( +
+ )}
diff --git a/apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx b/apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx index de3dfc86fc..972d41b59d 100644 --- a/apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/UploadFileToolView.tsx @@ -22,6 +22,7 @@ import { Table, RefreshCw, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from './types'; import { formatTimestamp, getToolTitle } from './utils'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -30,7 +31,7 @@ import { Button } from '@/components/ui/button'; import { ScrollArea } from "@/components/ui/scroll-area"; import { LoadingState } from './shared/LoadingState'; import { cn } from '@/lib/utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { backendApi } from '@/lib/api-client'; interface UploadResult { @@ -245,23 +246,6 @@ export function UploadFileToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Upload successful' : 'Upload failed'} - - )}
@@ -356,7 +340,7 @@ export function UploadFileToolView({ disabled={isRegenerating} className="flex-1" > - + {isRegenerating ? : } {isRegenerating ? 'Regenerating...' : 'Regenerate Link'} )} diff --git a/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx b/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx index 613384de7b..465fdd6920 100644 --- a/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/WebCrawlToolView.tsx @@ -3,13 +3,13 @@ import { Globe, CheckCircle, AlertTriangle, - Loader2, FileText, Copy, Check, ArrowUpRight, BookOpen } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from './types'; import { formatTimestamp, @@ -144,23 +144,6 @@ export function WebCrawlToolView({
- {!isStreaming && ( - - {isSuccess ? ( - - ) : ( - - )} - {isSuccess ? 'Crawling completed' : 'Crawling failed'} - - )}
@@ -169,7 +152,7 @@ export function WebCrawlToolView({
- +

Crawling Webpage diff --git a/apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx b/apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx index 8064eb988c..b33a67d6b5 100644 --- a/apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx +++ b/apps/frontend/src/components/thread/tool-views/apify-tool/ApifyApprovalCard.tsx @@ -2,7 +2,8 @@ import React from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; -import { AlertCircle, CheckCircle2, XCircle, Clock, Loader2 } from 'lucide-react'; +import { AlertCircle, CheckCircle2, XCircle, Clock } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { cn } from '@/lib/utils'; import { ApifyApproval } from '@/hooks/apify/use-apify-approvals'; import { useApproveApifyRequest, useGetApifyApprovalStatus } from '@/hooks/apify/use-apify-approvals'; @@ -119,7 +120,7 @@ export function ApifyApprovalCard({ approval, threadId, onApproved }: ApifyAppro > {approveMutation.isPending ? ( <> - + Approving... ) : ( diff --git a/apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx b/apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx index 8dc9f07317..91053f1ada 100644 --- a/apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/apify-tool/ToolView.tsx @@ -4,7 +4,6 @@ import { Globe, CheckCircle, AlertTriangle, - Loader2, Search, Info, Play, @@ -19,6 +18,7 @@ import { Download, ExternalLink, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from '../types'; import { formatTimestamp } from '../utils'; import { cn } from '@/lib/utils'; @@ -227,24 +227,6 @@ export function ApifyToolView({

- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Success' : 'Failed'} - - )}
@@ -257,7 +239,7 @@ export function ApifyToolView({ `bg-gradient-to-br ${config.color}`, "border-white/20" )}> - +
{viewType === 'run' ? ( diff --git a/apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx b/apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx index 72ba2c2d54..bbd4b251fc 100644 --- a/apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/canvas-tool/CanvasToolView.tsx @@ -44,7 +44,6 @@ import { CheckCircle, AlertTriangle, Layers, - Loader2, Sparkles, Save, Trash2, @@ -410,50 +409,18 @@ export function CanvasToolView({
-
- {!isStreaming && ( - - {actualIsSuccess ? ( - <> - - Success - - ) : ( - <> - - Failed - - )} - - )} - - {isStreaming && ( - - - Processing - - )} - - {/* Open canvas button in header */} - {(canvasPath || canvasName) && !isStreaming && ( - - )} -
+ {/* Open canvas button in header */} + {(canvasPath || canvasName) && !isStreaming && ( + + )}
diff --git a/apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx b/apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx index 08a38ac9a1..f887efbd97 100644 --- a/apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx +++ b/apps/frontend/src/components/thread/tool-views/check-profile-connection/check-profile-connection.tsx @@ -110,24 +110,6 @@ export function CheckProfileConnectionToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Connection verified' : 'Verification failed'} - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx index 8dabaa560d..60d0df282c 100644 --- a/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/command-tool/CheckCommandOutputToolView.tsx @@ -311,23 +311,6 @@ export function CheckCommandOutputToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Output retrieved successfully' : 'Failed to retrieve output'} - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx index 07922e4dcb..1f6c3ddc0b 100644 --- a/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/command-tool/CommandToolView.tsx @@ -170,36 +170,6 @@ export function CommandToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? - 'Success' : - (name === 'check-command-output' ? 'Failed to retrieve output' : 'Command failed') - } - - )} - - {isStreaming && ( - - - - - - Live - - )}
@@ -211,13 +181,13 @@ export function CommandToolView({
{command && (
-
- +
+ Command
-
+
                         {displayPrefix} 
                         {command}
@@ -228,9 +198,9 @@ export function CommandToolView({
                 
                 {streamingOutput && (
                   
-
-
- +
+
+ Output @@ -243,7 +213,7 @@ export function CommandToolView({
-
+
                         {streamingOutput}
                         
@@ -275,13 +245,13 @@ export function CommandToolView({
                 {/* Command section */}
                 {command && (
                   
-
- +
+ Command
-
+
                         {displayPrefix} 
                         {command}
@@ -292,9 +262,9 @@ export function CommandToolView({
 
                 {/* Show status message for non-blocking commands */}
                 {isNonBlockingCommand && displayOutput && (
-                  
+
- + Status @@ -306,21 +276,21 @@ export function CommandToolView({ {/* Output section */} {formattedOutput.length > 0 ? (
-
+
- + Output {exitCode !== null && exitCode !== 0 && ( - + Error )}
-
+
                         {formattedOutput.map((line, idx) => (
                           
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx
index b418c77025..736abc24da 100644
--- a/apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx
+++ b/apps/frontend/src/components/thread/tool-views/command-tool/ListCommandsToolView.tsx
@@ -6,7 +6,6 @@ import {
   CircleDashed,
   Clock,
   TerminalIcon,
-  Loader2,
 } from 'lucide-react';
 import { ToolViewProps } from '../types';
 import { formatTimestamp, getToolTitle } from '../utils';
@@ -110,30 +109,6 @@ export function ListCommandsToolView({
             
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Commands listed successfully' : 'Failed to list commands'} - - )} - - {isStreaming && ( - - - Listing - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx b/apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx index 41518c0c1f..8810a34446 100644 --- a/apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/command-tool/TerminateCommandToolView.tsx @@ -5,12 +5,12 @@ import { AlertTriangle, CircleDashed, Clock, - Loader2, ArrowRight, TerminalIcon, Power, StopCircle } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from '../types'; import { formatTimestamp, getToolTitle } from '../utils'; import { cn } from '@/lib/utils'; @@ -130,23 +130,6 @@ export function TerminateCommandToolView({
- {!isStreaming && ( - - {terminationSuccess ? ( - - ) : ( - - )} - {terminationSuccess ? 'Session terminated' : 'Termination failed'} - - )}
@@ -155,7 +138,7 @@ export function TerminateCommandToolView({
- +

Terminating session diff --git a/apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx index 35a59c640d..5ee4f545e5 100644 --- a/apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/company-search-tool/CompanySearchToolView.tsx @@ -80,29 +80,10 @@ export function CompanySearchToolView({

- {!isStreaming && ( -
- {cost_deducted && ( - - {cost_deducted} - - )} - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Search completed' : 'Search failed'} - -
+ {!isStreaming && cost_deducted && ( + + {cost_deducted} + )}
diff --git a/apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx b/apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx index 91d23b45a0..54013ec9ff 100644 --- a/apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx +++ b/apps/frontend/src/components/thread/tool-views/configure-agent-integration/configure-agent-integration.tsx @@ -96,24 +96,6 @@ export function ConfigureAgentIntegrationToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Integration configured' : 'Configuration failed'} - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx b/apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx index 0e0762f76d..2184ecb9c2 100644 --- a/apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx +++ b/apps/frontend/src/components/thread/tool-views/create-new-agent/create-new-agent.tsx @@ -85,24 +85,6 @@ export function CreateNewAgentToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Worker created' : 'Creation failed'} - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx b/apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx index 6a41a51220..6795a7744f 100644 --- a/apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/designer-tool/DesignerToolView.tsx @@ -3,7 +3,6 @@ import { Palette, CheckCircle, AlertTriangle, - Loader2, Download, ZoomIn, ZoomOut, @@ -16,6 +15,7 @@ import { Lock, Unlock, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from '../types'; import { formatTimestamp } from '../utils'; import { extractDesignerData } from './_utils'; @@ -78,7 +78,7 @@ function DesignElementImage({ if (!element.directUrl && isLoading && !finalUrl) { return (
- +
); } @@ -536,30 +536,6 @@ export function DesignerToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Ready' : 'Failed'} - - )} - - {isStreaming && ( - - - Creating Design - - )}
@@ -650,7 +626,7 @@ export function DesignerToolView({ )} {isStreaming && (
- +

Generating Design

diff --git a/apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx b/apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx index f1015313c8..754fbf6252 100644 --- a/apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/document-parser-tool/DocumentParserToolView.tsx @@ -96,25 +96,6 @@ export function DocumentParserToolView({
- {!isStreaming && ( -
- - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Parse completed' : 'Parse failed'} - -
- )}
diff --git a/apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx b/apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx index cc888d473f..6547a29c88 100644 --- a/apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/expand-message-tool/ExpandMessageToolView.tsx @@ -3,7 +3,6 @@ import { Expand, CheckCircle, AlertTriangle, - Loader2, Clock, MessageSquareText, Copy, @@ -16,7 +15,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { ScrollArea } from "@/components/ui/scroll-area"; import { Button } from '@/components/ui/button'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { UnifiedMarkdown } from '@/components/markdown'; export function ExpandMessageToolView({ @@ -102,30 +101,6 @@ export function ExpandMessageToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Expanded' : 'Failed'} - - )} - - {isStreaming && ( - - - Expanding - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx b/apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx index c896c73637..6ba4db3bb8 100644 --- a/apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/expose-port-tool/ExposePortToolView.tsx @@ -101,23 +101,6 @@ export function ExposePortToolView({ )} - {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Port exposed successfully' : 'Port exposure failed'} - - )}
diff --git a/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx index 2dd191d57f..da3ced7c5d 100644 --- a/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/file-operation/FileOperationToolView.tsx @@ -1,7 +1,6 @@ import React, { useState, useMemo, useRef, useEffect } from 'react'; import { ExternalLink, - Loader2, Code, Eye, File, @@ -13,6 +12,7 @@ import { Minus, Plus, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { formatTimestamp, getToolTitle, @@ -67,7 +67,7 @@ import { } from './_utils'; import { ToolViewProps } from '../types'; import { LoadingState } from '../shared/LoadingState'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { PresentationSlidePreview } from '../presentation-tools/PresentationSlidePreview'; import { usePresentationViewerStore } from '@/stores/presentation-viewer-store'; import { useKortixComputerStore } from '@/stores/kortix-computer-store'; @@ -611,7 +611,7 @@ export function FileOperationToolView({ {presentationName}{slideNumber ? ` - Slide ${slideNumber}` : ''}

- + Writing slide content...
@@ -959,7 +959,7 @@ export function FileOperationToolView({ ) : !fileContent && isStreaming ? (
- +

Waiting for content...

@@ -1011,7 +1011,7 @@ export function FileOperationToolView({ ) : !fileContent && isStreaming ? (
- +

Waiting for content...

@@ -1087,7 +1087,7 @@ export function FileOperationToolView({ {isStreaming && oldStr && newStr && (
- + Streaming changes...
)} diff --git a/apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx b/apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx index 5b93e05cbc..f09735b969 100644 --- a/apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/file-reader-tool/FileReaderToolView.tsx @@ -250,51 +250,11 @@ export function FileReaderToolView({
- {!isStreaming && ( -
- {isSearch && searchData ? ( - - - {searchData.totalHits} results - - ) : isBatch && results.length > 0 ? ( -
- {successCount > 0 && ( - - - {successCount} - - )} - {failCount > 0 && ( - - - {failCount} - - )} -
- ) : !isBatch && ( - - {actualIsSuccess ? ( - <> - - Read - - ) : ( - <> - - Failed - - )} - - )} -
+ {!isStreaming && isSearch && searchData && ( + + + {searchData.totalHits} results + )}
diff --git a/apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx b/apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx index bfba5bfc2a..961cdec364 100644 --- a/apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx +++ b/apps/frontend/src/components/thread/tool-views/get-app-details/get-app-details.tsx @@ -96,24 +96,6 @@ export function GetAppDetailsToolView({
- {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Details loaded' : 'Failed to load'} - - )} diff --git a/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx b/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx index cb581f744d..d2117f655f 100644 --- a/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/image-edit-generate-tool/ImageEditGenerateToolView.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useState, useRef } from 'react'; -import { AlertTriangle, Play, Pause, Wand2, CheckCircle, Loader2, Download, Video as VideoIcon, Image as ImageIcon } from 'lucide-react'; +import { AlertTriangle, Play, Pause, Wand2, CheckCircle, Download, Video as VideoIcon, Image as ImageIcon } from 'lucide-react'; import { ToolViewProps } from '../types'; import { extractImageEditGenerateData } from './_utils'; import { cn } from '@/lib/utils'; @@ -380,49 +380,18 @@ export function ImageEditGenerateToolView({ -
- {!isStreaming && actualIsSuccess && ( - - - Success - - )} - - {!isStreaming && hasActualError && ( - - - Failed - - )} - - {isStreaming && ( - - - Processing - - )} - - {/* Download button */} - {actualIsSuccess && downloadUrl && ( - - )} -
+ {/* Download button */} + {actualIsSuccess && downloadUrl && ( + + )} diff --git a/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx b/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx index c55b636508..77b6738b1a 100644 --- a/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx +++ b/apps/frontend/src/components/thread/tool-views/list-app-event-triggers/list-app-event-triggers.tsx @@ -123,24 +123,6 @@ export function ListAppEventTriggersToolView({ - {!isStreaming && ( - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Triggers loaded' : 'Failed to load'} - - )} diff --git a/apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx b/apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx index d9a1518c72..ceb337ce42 100644 --- a/apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/people-search-tool/PeopleSearchToolView.tsx @@ -92,29 +92,10 @@ export function PeopleSearchToolView({ - {!isStreaming && ( -
- {cost_deducted && ( - - {cost_deducted} - - )} - - {actualIsSuccess ? ( - - ) : ( - - )} - {actualIsSuccess ? 'Search completed' : 'Search failed'} - -
+ {!isStreaming && cost_deducted && ( + + {cost_deducted} + )} diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx index 87bb8730d6..5f9fcbe0d7 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeletePresentationToolView.tsx @@ -139,26 +139,6 @@ export function DeletePresentationToolView({ -
- {!isStreaming && !error && deleteData && ( - - - Deleted - - )} - {!isStreaming && (error || !isSuccess) && ( - - - Failed - - )} -
diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx index bf0443ef71..521fafe03d 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/DeleteSlideToolView.tsx @@ -78,26 +78,6 @@ export function DeleteSlideToolView({ -
- {!isStreaming && !error && deleteData && ( - - - Deleted - - )} - {!isStreaming && (error || !isSuccess) && ( - - - Failed - - )} -
diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx index 6c0dd7f0dd..7cbfa0c345 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/ExportToolView.tsx @@ -5,13 +5,13 @@ import { Download, CheckCircle, AlertTriangle, - Loader2, LucideIcon, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { ToolViewProps } from '../types'; import { formatTimestamp } from '../utils'; import { downloadPresentation, DownloadFormat } from '../utils/presentation-utils'; -import { toast } from 'sonner'; +import { toast } from '@/lib/toast'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; @@ -214,7 +214,7 @@ export function ExportToolView({ >
{isLoading ? ( - + ) : ( )} @@ -247,14 +247,14 @@ export function ExportToolView({
- + Exporting
- + {presentationName || 'Processing...'} @@ -276,21 +276,6 @@ export function ExportToolView({ {presentationName || 'Export Presentation'}
- - {isSuccess ? ( - - ) : ( - - )} - {partialSuccess ? 'Partial' : (isSuccess ? 'Exported' : 'Failed')} - diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx index 0ed1780bad..3fa407e71a 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/FullScreenPresentationViewer.tsx @@ -12,8 +12,8 @@ import { SkipBack, SkipForward, Edit, - Loader2, } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { DropdownMenu, DropdownMenuContent, @@ -471,7 +471,7 @@ export function FullScreenPresentationViewer({ disabled={isDownloadingPDF || isDownloadingPPTX || isDownloadingGoogleSlides} > {(isDownloadingPDF || isDownloadingPPTX || isDownloadingGoogleSlides) ? ( - + ) : ( )} @@ -523,7 +523,7 @@ export function FullScreenPresentationViewer({
{isLoading || !currentSlideData ? (
-
+

{retryAttempt > 0 ? `Retrying... (attempt ${retryAttempt + 1})` : 'Loading presentation...'}

diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx index 1ccbd9b887..c527090f7a 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationTemplatesToolView.tsx @@ -3,7 +3,8 @@ import Image from "next/image" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" -import { Palette, Sparkles, CheckCircle, Loader2, AlertTriangle, ArrowLeft, X } from "lucide-react" +import { Palette, Sparkles, CheckCircle, AlertTriangle, ArrowLeft, X } from "lucide-react" +import { KortixLoader } from "@/components/ui/kortix-loader" import { ScrollArea } from "@/components/ui/scroll-area" import type { ToolViewProps } from "../types" import { getToolTitle, formatTimestamp } from "../utils" @@ -158,24 +159,6 @@ export function ListPresentationTemplatesToolView({
-
- {!isStreaming && ( - - - Success - - )} - - {isStreaming && ( - - - Loading - - )} -
@@ -222,7 +205,7 @@ export function ListPresentationTemplatesToolView({ {!isLoaded && (
- + Loading...
diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx index 0517511c9d..4bc5fc4ba3 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/ListPresentationsToolView.tsx @@ -105,26 +105,6 @@ export function ListPresentationsToolView({ -
- {!isStreaming && !error && presentationsData && ( - - - {presentationsData.presentations.length} found - - )} - {!isStreaming && (error || !isSuccess) && ( - - - Failed - - )} -
diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx index 93f540b869..cecfc401aa 100644 --- a/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlidePreview.tsx @@ -2,7 +2,8 @@ import React, { useState, useEffect, useRef, useCallback } from 'react'; import { PresentationSlideCard } from './PresentationSlideCard'; import { constructHtmlPreviewUrl } from '@/lib/utils/url'; import { Project } from '@/lib/api/threads'; -import { Loader2, RefreshCw, Presentation } from 'lucide-react'; +import { RefreshCw, Presentation } from 'lucide-react'; +import { KortixLoader } from '@/components/ui/kortix-loader'; import { usePresentationViewerStore } from '@/stores/presentation-viewer-store'; import { Button } from '@/components/ui/button'; @@ -116,7 +117,7 @@ export function PresentationSlidePreview({ if (isLoading) { return (
- + Loading presentation... {retryCount > 0 && ( diff --git a/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideSkeleton.tsx b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideSkeleton.tsx new file mode 100644 index 0000000000..edabddf069 --- /dev/null +++ b/apps/frontend/src/components/thread/tool-views/presentation-tools/PresentationSlideSkeleton.tsx @@ -0,0 +1,159 @@ +import React, { useState, useEffect, useMemo } from 'react'; +import { Badge } from '@/components/ui/badge'; +import { cn } from '@/lib/utils'; + +interface PresentationSlideSkeletonProps { + slideNumber: number; + isGenerating?: boolean; + slideTitle?: string; + /** Streaming HTML content to render live as it's being generated */ + streamingContent?: string; + className?: string; +} + +/** + * Empty slide placeholder that can show real-time streaming content. + * No loading states - just empty frames that fill in with actual content. + */ +export function PresentationSlideSkeleton({ + slideNumber, + isGenerating = false, + slideTitle, + streamingContent, + className = '', +}: PresentationSlideSkeletonProps) { + const [containerRef, setContainerRef] = useState(null); + const [scale, setScale] = useState(1); + + // Calculate scale for the iframe to fit the container + useEffect(() => { + if (!containerRef) return; + + const updateScale = () => { + const containerWidth = containerRef.offsetWidth; + const containerHeight = containerRef.offsetHeight; + const scaleX = containerWidth / 1920; + const scaleY = containerHeight / 1080; + setScale(Math.min(scaleX, scaleY)); + }; + + updateScale(); + const resizeObserver = new ResizeObserver(updateScale); + resizeObserver.observe(containerRef); + + return () => resizeObserver.disconnect(); + }, [containerRef]); + + // Build the full HTML document for the streaming content + const streamingHtmlDoc = useMemo(() => { + if (!streamingContent) return null; + + // Wrap the content in a basic HTML structure with presentation styling + return ` + + + + + + + + +${streamingContent} + +`; + }, [streamingContent]); + + const hasContent = !!streamingContent && streamingContent.trim().length > 0; + + return ( +
+ {/* Slide header */} +
+
+ + #{slideNumber} + + {slideTitle ? ( + + {slideTitle} + + ) : ( + + — + + )} +
+ {isGenerating && ( +
+
+
+ )} +
+ + {/* Slide Preview - Empty frame or streaming content */} +
+
+ {hasContent && streamingHtmlDoc ? ( + // Render streaming HTML content in real-time +