From 6796aa518c04312d098fc1295d18030b4e544a38 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 08:45:01 +0800 Subject: [PATCH 01/47] feat(platform): add multi-tenancy and teams support - Add multi-tenancy and teams support - Replace Kuzu/LanceDB with FalkorDB for graph and vector storage - Add prefetch for first RAG search call - Improve trusted headers debug logging format Co-Authored-By: Claude Opus 4.5 --- README.md | 2 + compose.blue.yml | 2 +- compose.green.yml | 2 +- compose.yml | 112 +- package-lock.json | 10028 ++++++---------- scripts/deploy.sh | 2 +- scripts/dev-tools.sh | 485 + .../init-scripts/03-create-rag-database.sql | 62 + services/graph-db/Dockerfile | 35 +- services/graph-db/app/__init__.py | 2 - services/graph-db/app/config.py | 21 - services/graph-db/app/database.py | 130 - services/graph-db/app/main.py | 76 - .../components/document-row-actions.tsx | 96 +- .../documents/components/document-table.tsx | 64 +- .../components/document-team-tags-dialog.tsx | 160 + .../components/document-upload-dialog.tsx | 233 + .../components/documents-action-menu.tsx | 59 +- .../components/import-documents-menu.tsx | 60 +- .../documents/hooks/use-document-upload.ts | 15 +- .../[id]/(knowledge)/documents/page.tsx | 2 + .../components/settings-navigation.tsx | 8 +- .../components/member-delete-dialog.tsx | 2 +- .../components/organization-settings.tsx | 2 +- .../teams/components/team-create-dialog.tsx | 112 + .../teams/components/team-delete-dialog.tsx | 59 + .../teams/components/team-edit-dialog.tsx | 117 + .../teams/components/team-members-dialog.tsx | 213 + .../teams/components/team-row-actions.tsx | 74 + .../settings/teams/components/team-table.tsx | 80 + .../teams/components/teams-settings.tsx | 87 + .../settings/teams/hooks/use-list-teams.ts | 29 + .../dashboard/[id]/settings/teams/page.tsx | 96 + services/platform/convex/_generated/api.d.ts | 349 +- .../integrations/integration_tool.ts | 5 +- .../agent_tools/rag/query_rag_context.ts | 35 +- .../convex/agent_tools/rag/rag_search_tool.ts | 77 +- .../workflows/create_workflow_tool.ts | 5 +- services/platform/convex/auth.ts | 24 + .../convex/betterAuth/_generated/api.ts | 4 + .../convex/betterAuth/_generated/component.ts | 337 +- services/platform/convex/betterAuth/auth.ts | 4 + .../convex/betterAuth/generated_schema.ts | 129 + services/platform/convex/betterAuth/schema.ts | 113 +- services/platform/convex/chat_agent.ts | 4 + services/platform/convex/documents.ts | 49 +- .../platform/convex/lib/create_chat_agent.ts | 18 + .../platform/convex/lib/get_user_teams.ts | 139 + .../platform/convex/lib/rag_prefetch/index.ts | 286 + .../lib/rls/auth/get_trusted_auth_data.ts | 70 + .../convex/lib/rls/helpers/rls_rules.ts | 20 +- .../organization/get_user_organizations.ts | 13 +- services/platform/convex/member.ts | 97 + .../model/chat_agent/chat_with_agent.ts | 13 + .../chat_agent/generate_agent_response.ts | 31 +- .../convex/model/documents/create_document.ts | 2 + .../documents/get_document_by_id_public.ts | 5 +- .../model/documents/get_document_by_path.ts | 5 +- .../convex/model/documents/get_documents.ts | 9 +- .../model/documents/get_documents_cursor.ts | 9 +- .../model/documents/get_user_names_batch.ts | 64 + .../platform/convex/model/documents/index.ts | 1 + .../documents/transform_to_document_item.ts | 137 +- .../platform/convex/model/documents/types.ts | 2 + .../convex/model/documents/update_document.ts | 16 + .../convex/model/documents/validators.ts | 9 + .../upload_and_create_document_logic.ts | 3 + .../create_session_for_trusted_user.ts | 30 +- .../find_or_create_user_from_headers.ts | 36 +- .../trusted_headers_authenticate/index.ts | 1 + .../resolve_team_names.ts | 37 + .../trusted_headers_authenticate.ts | 26 +- services/platform/convex/onedrive.ts | 2 + services/platform/convex/schema.ts | 7 + services/platform/convex/team_members.ts | 165 + .../convex/trusted_headers_authenticate.ts | 10 + .../types/convex_action_ctx.augment.d.ts | 19 + .../actions/onedrive/onedrive_action.ts | 6 + .../actions/rag/helpers/get_document_info.ts | 6 +- .../actions/rag/helpers/upload_file_direct.ts | 14 + .../rag/helpers/upload_text_document.ts | 14 + .../convex/workflow/actions/rag/rag_action.ts | 13 + services/platform/lib/auth-client.ts | 4 + .../lib/auth/trusted-headers-token.ts | 5 +- services/platform/lib/auth/trusted-headers.ts | 87 +- services/platform/messages/en.json | 68 +- services/platform/proxy.ts | 54 +- services/platform/types/documents.ts | 6 + services/rag/Dockerfile | 31 +- services/rag/app/config.py | 13 +- services/rag/app/main.py | 11 + services/rag/app/models.py | 38 + services/rag/app/routers/documents.py | 22 +- services/rag/app/routers/search.py | 4 + services/rag/app/services/cognee/cleanup.py | 152 +- services/rag/app/services/cognee/config.py | 675 +- services/rag/app/services/cognee/service.py | 394 +- services/rag/app/services/cognee/utils.py | 28 +- .../rag/app/services/vision/openai_client.py | 12 +- services/rag/docker-entrypoint.sh | 7 +- services/rag/pyproject.toml | 3 +- services/rag/tests/concurrent_read_test.ts | 315 + 102 files changed, 9633 insertions(+), 7293 deletions(-) create mode 100755 scripts/dev-tools.sh delete mode 100644 services/graph-db/app/__init__.py delete mode 100644 services/graph-db/app/config.py delete mode 100644 services/graph-db/app/database.py delete mode 100644 services/graph-db/app/main.py create mode 100644 services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-create-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-delete-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-edit-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-row-actions.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-table.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/components/teams-settings.tsx create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/hooks/use-list-teams.ts create mode 100644 services/platform/app/(app)/dashboard/[id]/settings/teams/page.tsx create mode 100644 services/platform/convex/betterAuth/auth.ts create mode 100644 services/platform/convex/betterAuth/generated_schema.ts create mode 100644 services/platform/convex/lib/get_user_teams.ts create mode 100644 services/platform/convex/lib/rag_prefetch/index.ts create mode 100644 services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts create mode 100644 services/platform/convex/model/documents/get_user_names_batch.ts create mode 100644 services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts create mode 100644 services/platform/convex/team_members.ts create mode 100644 services/rag/tests/concurrent_read_test.ts diff --git a/README.md b/README.md index 2fed0dbd0..697aac4ac 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ TRUSTED_HEADERS_ENABLED=true TRUSTED_EMAIL_HEADER=X-Auth-Email # optional, default shown TRUSTED_NAME_HEADER=X-Auth-Name # optional, default shown TRUSTED_ROLE_HEADER=X-Auth-Role # optional, default shown +TRUSTED_TEAMS_HEADER=X-Auth-Teams # optional, default shown ``` Your proxy must send these headers with every request: @@ -126,6 +127,7 @@ Your proxy must send these headers with every request: - `X-Auth-Email`: User's email address - `X-Auth-Name`: User's display name - `X-Auth-Role`: One of `admin`, `developer`, `editor`, or `member` +- `X-Auth-Teams` (optional): Comma-separated list of teams in `id:name` format (e.g., `abc123:Engineering, def456:Design`). The external IdP is the single source of truth - team IDs are passed through directly without any internal database lookup. Omit the header to leave teams unchanged, send empty to remove from all teams. ⚠️ **Security**: Only enable this when Tale is behind a trusted proxy that strips these headers from external requests. diff --git a/compose.blue.yml b/compose.blue.yml index ac29ce014..79fd726f0 100644 --- a/compose.blue.yml +++ b/compose.blue.yml @@ -85,7 +85,7 @@ services: environment: - RAG_CHUNK_SIZE=512 - RAG_CHUNK_OVERLAP=50 - # Disable cognee multi-user access control mode (required for kuzu-remote) + # Disable cognee multi-user access control mode - ENABLE_BACKEND_ACCESS_CONTROL=false restart: unless-stopped diff --git a/compose.green.yml b/compose.green.yml index 157a4cff4..ee75a1253 100644 --- a/compose.green.yml +++ b/compose.green.yml @@ -85,7 +85,7 @@ services: environment: - RAG_CHUNK_SIZE=512 - RAG_CHUNK_OVERLAP=50 - # Disable cognee multi-user access control mode (required for kuzu-remote) + # Disable cognee multi-user access control mode - ENABLE_BACKEND_ACCESS_CONTROL=false restart: unless-stopped diff --git a/compose.yml b/compose.yml index 090fe7887..852e599bd 100644 --- a/compose.yml +++ b/compose.yml @@ -90,31 +90,30 @@ services: - internal # ============================================================================ - # Tale Graph DB (Kuzu) + # Tale Crawler (Crawl4AI) # ============================================================================ - # Stateful service - Kuzu requires exclusive file lock, cannot run two instances - graph-db: + # Stateless service - no container_name for blue-green deployment + crawler: # Image from GHCR (used when PULL_POLICY=always) - image: ghcr.io/tale-project/tale/tale-graph-db:${VERSION:-latest} + image: ghcr.io/tale-project/tale/tale-crawler:${VERSION:-latest} # Pull policy: 'build' for local dev, 'always' for production pull_policy: ${PULL_POLICY:-build} - # Build from local Dockerfile (used when PULL_POLICY=build) + # Build configuration (used when PULL_POLICY=build) build: - context: ./services/graph-db - dockerfile: Dockerfile + context: . + dockerfile: services/crawler/Dockerfile args: VERSION: ${VERSION:-dev} - # Container name - stateful service like db - container_name: tale-graph-db - - # No port mapping needed - only accessed by other services (rag) - # internally via http://graph-db:8000 + # Port mapping: host:container (for development) + # Access Crawler API at localhost:8002 + ports: + - '8002:8002' - # Volume mounts - # Persist graph database data - volumes: - - graph-db-data:/data + # Environment file + # Create a .env file in the project root with your configuration + env_file: + - .env # Restart policy # Automatically restart the container if it crashes @@ -122,13 +121,22 @@ services: # Health check - optimized for faster blue-green deployment # Docker will check if the service is healthy - # Note: Using Python since curl is not available in python:3.11-slim healthcheck: - test: ['CMD', 'python', '-c', 'import urllib.request; urllib.request.urlopen("http://localhost:8000/health")'] + test: ['CMD', 'curl', '-f', 'http://localhost:8002/health'] interval: 5s timeout: 3s retries: 2 - start_period: 10s + start_period: 40s + + # Resource limits (optional, adjust based on your needs) + # deploy: + # resources: + # limits: + # cpus: '2' + # memory: 4G + # reservations: + # cpus: '1' + # memory: 2G # Logging configuration logging: @@ -142,53 +150,52 @@ services: - internal # ============================================================================ - # Tale Crawler (Crawl4AI) + # Tale Graph DB (FalkorDB) # ============================================================================ - # Stateless service - no container_name for blue-green deployment - crawler: + # Redis-based graph database optimized for GraphRAG + # - Native multi-tenant support (10K+ graphs per instance) + # - Low latency (~140ms p99) + # - Client-server architecture (no file-level locking issues) + # - Combined graph and vector storage via hybrid adapter + # Replaces embedded Kuzu (archived) and LanceDB + graph-db: # Image from GHCR (used when PULL_POLICY=always) - image: ghcr.io/tale-project/tale/tale-crawler:${VERSION:-latest} + image: ghcr.io/tale-project/tale/tale-graph-db:${VERSION:-latest} # Pull policy: 'build' for local dev, 'always' for production pull_policy: ${PULL_POLICY:-build} # Build configuration (used when PULL_POLICY=build) build: context: . - dockerfile: services/crawler/Dockerfile + dockerfile: services/graph-db/Dockerfile args: VERSION: ${VERSION:-dev} - # Port mapping: host:container (for development) - # Access Crawler API at localhost:8002 + # Port mapping: host:container + # Access FalkorDB at localhost:6379 (Redis protocol) + # Access FalkorDB Browser UI at localhost:6380 (mapped from internal 3000) ports: - - '8002:8002' + - '6379:6379' + - '6380:3000' + + # Volume mounts + # Persist graph and vector data + # FalkorDB stores data in /var/lib/falkordb/data (not /data) + volumes: + - graph-db-data:/var/lib/falkordb/data # Environment file - # Create a .env file in the project root with your configuration env_file: - .env # Restart policy - # Automatically restart the container if it crashes restart: unless-stopped - # Health check - optimized for faster blue-green deployment - # Docker will check if the service is healthy + # Health check healthcheck: - test: ['CMD', 'curl', '-f', 'http://localhost:8002/health'] - interval: 5s - timeout: 3s - retries: 2 - start_period: 40s - - # Resource limits (optional, adjust based on your needs) - # deploy: - # resources: - # limits: - # cpus: '2' - # memory: 4G - # reservations: - # cpus: '1' - # memory: 2G + test: ['CMD', 'redis-cli', 'ping'] + interval: 10s + timeout: 5s + retries: 3 # Logging configuration logging: @@ -239,8 +246,6 @@ services: # Smaller chunks (512) reduce LLM output size for knowledge graph extraction - RAG_CHUNK_SIZE=512 - RAG_CHUNK_OVERLAP=50 - # Disable cognee multi-user access control mode (required for kuzu-remote) - - ENABLE_BACKEND_ACCESS_CONTROL=false # Restart policy # Automatically restart the container if it crashes @@ -256,7 +261,7 @@ services: start_period: 40s # Dependencies - # Wait for database and graph DB to be ready + # Wait for database and graph-db (FalkorDB) to be ready depends_on: - db - graph-db @@ -342,7 +347,6 @@ services: # Wait for backend services to be ready depends_on: - db - - graph-db - rag - crawler - search @@ -539,12 +543,12 @@ volumes: db-backup: driver: local - # Persistent storage for graph database data (Kuzu) - graph-db-data: + # Persistent storage for RAG service data (temp files, document processing) + rag-data: driver: local - # Persistent storage for RAG service data - rag-data: + # Persistent storage for graph-db (FalkorDB graph + vector data) + graph-db-data: driver: local # Persistent storage for Platform Convex local backend diff --git a/package-lock.json b/package-lock.json index 4f4c4bb07..df611ae24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ ], "devDependencies": { "@eslint/eslintrc": "3.3.3", - "@types/node": "24.10.8", + "@types/node": "24.10.1", "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-plugin-unicorn": "62.0.0", @@ -32,7 +32,7 @@ "version": "0.9.31", "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@adobe/css-tools": { @@ -61,8 +61,6 @@ }, "node_modules/@ai-sdk/openai": { "version": "2.0.89", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.89.tgz", - "integrity": "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.1", @@ -77,8 +75,6 @@ }, "node_modules/@ai-sdk/provider": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.1.tgz", - "integrity": "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -89,8 +85,6 @@ }, "node_modules/@ai-sdk/provider-utils": { "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.20.tgz", - "integrity": "sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.1", @@ -106,8 +100,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=10" @@ -120,7 +112,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@csstools/css-calc": "^2.1.4", @@ -134,7 +126,7 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "devOptional": true, + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -144,7 +136,7 @@ "version": "6.7.6", "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz", "integrity": "sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@asamuzakjp/nwsapi": "^2.3.9", @@ -158,7 +150,7 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "devOptional": true, + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -168,13 +160,11 @@ "version": "2.3.9", "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -189,8 +179,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -202,8 +190,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -216,8 +202,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -230,8 +214,6 @@ }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -245,8 +227,6 @@ }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -255,8 +235,6 @@ }, "node_modules/@aws-crypto/util": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -267,8 +245,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -280,8 +256,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -294,8 +268,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -307,47 +279,45 @@ } }, "node_modules/@aws-sdk/client-sesv2": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.967.0.tgz", - "integrity": "sha512-2LAvka5cMFbtvp8q+dwP5hPpw0d0N/I/ozp9iKlVTIVHqPI/4pLfoDwDd0MApEcagm6/supi7HyEkAKq1THfew==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.967.0", - "@aws-sdk/credential-provider-node": "3.967.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/credential-provider-node": "3.966.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", - "@aws-sdk/middleware-user-agent": "3.967.0", + "@aws-sdk/middleware-user-agent": "3.966.0", "@aws-sdk/region-config-resolver": "3.965.0", - "@aws-sdk/signature-v4-multi-region": "3.967.0", + "@aws-sdk/signature-v4-multi-region": "3.966.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", - "@aws-sdk/util-user-agent-node": "3.967.0", + "@aws-sdk/util-user-agent-node": "3.966.0", "@smithy/config-resolver": "^4.4.5", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", - "@smithy/middleware-endpoint": "^4.4.3", - "@smithy/middleware-retry": "^4.4.19", + "@smithy/middleware-endpoint": "^4.4.2", + "@smithy/middleware-retry": "^4.4.18", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.18", - "@smithy/util-defaults-mode-node": "^4.2.21", + "@smithy/util-defaults-mode-browser": "^4.3.17", + "@smithy/util-defaults-mode-node": "^4.2.20", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", @@ -359,45 +329,43 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.967.0.tgz", - "integrity": "sha512-7RgUwHcRMJtWme6kCHGUVT+Rn9GmNH+FHm34N9UgMXzUqQlzFMweE7T5E9O8nv3wIp7xFNB20ADaCw9Xdnox1Q==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", - "@aws-sdk/middleware-user-agent": "3.967.0", + "@aws-sdk/middleware-user-agent": "3.966.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", - "@aws-sdk/util-user-agent-node": "3.967.0", + "@aws-sdk/util-user-agent-node": "3.966.0", "@smithy/config-resolver": "^4.4.5", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", - "@smithy/middleware-endpoint": "^4.4.3", - "@smithy/middleware-retry": "^4.4.19", + "@smithy/middleware-endpoint": "^4.4.2", + "@smithy/middleware-retry": "^4.4.18", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.18", - "@smithy/util-defaults-mode-node": "^4.2.21", + "@smithy/util-defaults-mode-browser": "^4.3.17", + "@smithy/util-defaults-mode-node": "^4.2.20", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", @@ -409,20 +377,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.967.0.tgz", - "integrity": "sha512-sJmuP7GrVmlbO6DpXkuf9Mbn6jGNNvy6PLawvaxVF150c8bpNk3w39rerRls6q1dot1dBFV2D29hBXMY1agNMg==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.965.0", "@aws-sdk/xml-builder": "3.965.0", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", @@ -434,13 +400,11 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.967.0.tgz", - "integrity": "sha512-+XWw0+f/txeMbEVRtTFZhgSw1ymH1ffaVKkdMBSnw48rfSohJElKmitCqdihagRTZpzh7m8qI6tIQ5t3OUqugw==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", @@ -451,19 +415,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.967.0.tgz", - "integrity": "sha512-0/GIAEv5pY5htg6IBMuYccBgzz3oS2DqHjHi396ziTrwlhbrCNX96AbNhQhzAx3LBZUk13sPfeapjyQ7G57Ekg==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" @@ -473,20 +435,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.967.0.tgz", - "integrity": "sha512-U8dMpaM6Qf6+2Qvp1uG6OcWv1RlrZW7tQkpmzEVWH8HZTGrVHIXXju64NMtIOr7yOnNwd0CKcytuD1QG+phCwQ==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", - "@aws-sdk/credential-provider-env": "3.967.0", - "@aws-sdk/credential-provider-http": "3.967.0", - "@aws-sdk/credential-provider-login": "3.967.0", - "@aws-sdk/credential-provider-process": "3.967.0", - "@aws-sdk/credential-provider-sso": "3.967.0", - "@aws-sdk/credential-provider-web-identity": "3.967.0", - "@aws-sdk/nested-clients": "3.967.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/credential-provider-env": "3.966.0", + "@aws-sdk/credential-provider-http": "3.966.0", + "@aws-sdk/credential-provider-login": "3.966.0", + "@aws-sdk/credential-provider-process": "3.966.0", + "@aws-sdk/credential-provider-sso": "3.966.0", + "@aws-sdk/credential-provider-web-identity": "3.966.0", + "@aws-sdk/nested-clients": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -499,14 +459,12 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.967.0.tgz", - "integrity": "sha512-kbvZsZL6CBlfnb71zuJdJmBUFZN5utNrcziZr/DZ2olEOkA9vlmizE8i9BUIbmS7ptjgvRnmcY1A966yfhiblw==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", - "@aws-sdk/nested-clients": "3.967.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/nested-clients": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", @@ -519,18 +477,16 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.967.0.tgz", - "integrity": "sha512-WuNbHs9rfKKSVok4+OBrZf0AHfzDgFYYMxN2G/q6ZfUmY4QmiPyxV5HkNFh1rqDxS9VV6kAZPo0EBmry10idSg==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.967.0", - "@aws-sdk/credential-provider-http": "3.967.0", - "@aws-sdk/credential-provider-ini": "3.967.0", - "@aws-sdk/credential-provider-process": "3.967.0", - "@aws-sdk/credential-provider-sso": "3.967.0", - "@aws-sdk/credential-provider-web-identity": "3.967.0", + "@aws-sdk/credential-provider-env": "3.966.0", + "@aws-sdk/credential-provider-http": "3.966.0", + "@aws-sdk/credential-provider-ini": "3.966.0", + "@aws-sdk/credential-provider-process": "3.966.0", + "@aws-sdk/credential-provider-sso": "3.966.0", + "@aws-sdk/credential-provider-web-identity": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -543,13 +499,11 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.967.0.tgz", - "integrity": "sha512-sNCY5JDV0whsfsZ6c2+6eUwH33H7UhKbqvCPbEYlIIa8wkGjCtCyFI3zZIJHVcMKJJ3117vSUFHEkNA7g+8rtw==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -561,15 +515,13 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.967.0.tgz", - "integrity": "sha512-0K6kITKNytFjk1UYabYUsTThgU6TQkyW6Wmt8S5zd1A/up7NSQGpp58Rpg9GIf4amQDQwb+p9FGG7emmV8FEeA==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.967.0", - "@aws-sdk/core": "3.967.0", - "@aws-sdk/token-providers": "3.967.0", + "@aws-sdk/client-sso": "3.966.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/token-providers": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -581,14 +533,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.967.0.tgz", - "integrity": "sha512-Vkr7S2ec7q/v8i/MzkHcBEdqqfWz3lyb8FDjb+NjslEwdxC3f6XwADRZzWwV1pChfx6SbsvJXKfkcF/pKAelhA==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", - "@aws-sdk/nested-clients": "3.967.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/nested-clients": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -601,8 +551,6 @@ }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.965.0.tgz", - "integrity": "sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -617,8 +565,6 @@ }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.965.0.tgz", - "integrity": "sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -632,8 +578,6 @@ }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.965.0.tgz", - "integrity": "sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -648,20 +592,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.967.0.tgz", - "integrity": "sha512-Kkd6xGwTqbg7Spq1SI3ZX6PPYKdGLxdRGlXGNE3lnEPzNueQZQJKLZFpOY2aVdcAT+ytAY96N5szeeeAsFdUaA==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-arn-parser": "3.966.0", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", @@ -674,16 +616,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.967.0.tgz", - "integrity": "sha512-2qzJzZj5u+cZiG7kz3XJPaTH4ssUY/aet1kwJsUTFKrWeHUf7mZZkDFfkXP5cOffgiOyR5ZkrmJoLKAde9hshg==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" @@ -693,45 +633,43 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.967.0.tgz", - "integrity": "sha512-PYa7V8w0gaNux6Sz/Z7zrHmPloEE+EKpRxQIOG/D0askTr5Yd4oO2KGgcInf65uHK3f0Z9U4CTUGHZvQvABypA==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.967.0", + "@aws-sdk/core": "3.966.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", - "@aws-sdk/middleware-user-agent": "3.967.0", + "@aws-sdk/middleware-user-agent": "3.966.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", - "@aws-sdk/util-user-agent-node": "3.967.0", + "@aws-sdk/util-user-agent-node": "3.966.0", "@smithy/config-resolver": "^4.4.5", - "@smithy/core": "^3.20.2", + "@smithy/core": "^3.20.1", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", - "@smithy/middleware-endpoint": "^4.4.3", - "@smithy/middleware-retry": "^4.4.19", + "@smithy/middleware-endpoint": "^4.4.2", + "@smithy/middleware-retry": "^4.4.18", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.4", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.18", - "@smithy/util-defaults-mode-node": "^4.2.21", + "@smithy/util-defaults-mode-browser": "^4.3.17", + "@smithy/util-defaults-mode-node": "^4.2.20", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", @@ -744,8 +682,6 @@ }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.965.0.tgz", - "integrity": "sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -760,13 +696,11 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.967.0.tgz", - "integrity": "sha512-LfpCEqe/BliiwBtNImz/Txx6MQZkDqjP2bbk+Q4Km6mYhFU9pyPlKo3AYEHfGWn92Smt1nS3S8SzIK0nL6J2Fg==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.967.0", + "@aws-sdk/middleware-sdk-s3": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", @@ -778,14 +712,12 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.967.0.tgz", - "integrity": "sha512-Qnd/nJ0CgeUa7zQczgmdQm0vYUF7pD1G0C+dR1T7huHQHRIsgCWIsCV9wNKzOFluqtcr6YAeuTwvY0+l8XWxnA==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.967.0", - "@aws-sdk/nested-clients": "3.967.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/nested-clients": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -798,8 +730,6 @@ }, "node_modules/@aws-sdk/types": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.965.0.tgz", - "integrity": "sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -812,8 +742,6 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.966.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.966.0.tgz", - "integrity": "sha512-WcCLdKBK2nHhtOPE8du5XjOXaOToxGF3Ge8rgK2jaRpjkzjS0/mO+Jp2H4+25hOne3sP2twBu5BrvD9KoXQ5LQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -825,8 +753,6 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.965.0.tgz", - "integrity": "sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -842,8 +768,6 @@ }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.0.tgz", - "integrity": "sha512-9LJFand4bIoOjOF4x3wx0UZYiFZRo4oUauxQSiEX2dVg+5qeBOJSjp2SeWykIE6+6frCZ5wvWm2fGLK8D32aJw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -855,8 +779,6 @@ }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.965.0.tgz", - "integrity": "sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -867,13 +789,11 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.967.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.967.0.tgz", - "integrity": "sha512-yUz6pCGxyG4+QaDg0dkdIBphjQp8A9rrbZa/+U3RJgRrW47hy64clFQUROzj5Poy1Ur8ICVXEUpBsSqRuYEU2g==", + "version": "3.966.0", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.967.0", + "@aws-sdk/middleware-user-agent": "3.966.0", "@aws-sdk/types": "3.965.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", @@ -893,8 +813,6 @@ }, "node_modules/@aws-sdk/xml-builder": { "version": "3.965.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.965.0.tgz", - "integrity": "sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -908,8 +826,6 @@ }, "node_modules/@aws/lambda-invoke-store": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", - "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -918,8 +834,6 @@ }, "node_modules/@azure-rest/core-client": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.5.1.tgz", - "integrity": "sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -935,8 +849,6 @@ }, "node_modules/@azure/abort-controller": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -947,8 +859,6 @@ }, "node_modules/@azure/core-auth": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -961,8 +871,6 @@ }, "node_modules/@azure/core-client": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -979,8 +887,6 @@ }, "node_modules/@azure/core-http-compat": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz", - "integrity": "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -993,8 +899,6 @@ }, "node_modules/@azure/core-lro": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", - "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -1008,8 +912,6 @@ }, "node_modules/@azure/core-paging": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", - "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -1020,8 +922,6 @@ }, "node_modules/@azure/core-rest-pipeline": { "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", - "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -1038,8 +938,6 @@ }, "node_modules/@azure/core-tracing": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -1050,8 +948,6 @@ }, "node_modules/@azure/core-util": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -1064,8 +960,6 @@ }, "node_modules/@azure/identity": { "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -1084,40 +978,8 @@ "node": ">=20.0.0" } }, - "node_modules/@azure/identity/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@azure/identity/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@azure/keyvault-common": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz", - "integrity": "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -1135,8 +997,6 @@ }, "node_modules/@azure/keyvault-keys": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.10.0.tgz", - "integrity": "sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==", "license": "MIT", "dependencies": { "@azure-rest/core-client": "^2.3.3", @@ -1158,8 +1018,6 @@ }, "node_modules/@azure/logger": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", "license": "MIT", "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", @@ -1171,8 +1029,6 @@ }, "node_modules/@azure/msal-browser": { "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.27.0.tgz", - "integrity": "sha512-bZ8Pta6YAbdd0o0PEaL1/geBsPrLEnyY/RDWqvF1PP9RUH8EMLvUMGoZFYS6jSlUan6KZ9IMTLCnwpWWpQRK/w==", "license": "MIT", "dependencies": { "@azure/msal-common": "15.13.3" @@ -1183,8 +1039,6 @@ }, "node_modules/@azure/msal-common": { "version": "15.13.3", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.3.tgz", - "integrity": "sha512-shSDU7Ioecya+Aob5xliW9IGq1Ui8y4EVSdWGyI1Gbm4Vg61WpP95LuzcY214/wEjSn6w4PZYD4/iVldErHayQ==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -1192,8 +1046,6 @@ }, "node_modules/@azure/msal-node": { "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.4.tgz", - "integrity": "sha512-lvuAwsDpPDE/jSuVQOBMpLbXuVuLsPNRwWCyK3/6bPlBk0fGWegqoZ0qjZclMWyQ2JNvIY3vHY7hoFmFmFQcOw==", "license": "MIT", "dependencies": { "@azure/msal-common": "15.13.3", @@ -1206,8 +1058,6 @@ }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -1215,8 +1065,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1228,10 +1076,13 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/compat-data": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, "license": "MIT", "engines": { @@ -1240,8 +1091,6 @@ }, "node_modules/@babel/core": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1271,8 +1120,6 @@ }, "node_modules/@babel/core/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": { @@ -1281,8 +1128,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { @@ -1298,8 +1143,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1315,8 +1158,6 @@ }, "node_modules/@babel/helper-compilation-targets/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": { @@ -1325,8 +1166,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -1335,8 +1174,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { @@ -1349,8 +1186,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1377,8 +1212,6 @@ }, "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" @@ -1386,8 +1219,6 @@ }, "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" @@ -1395,8 +1226,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -1405,8 +1234,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", "dependencies": { @@ -1419,8 +1246,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.6" @@ -1466,8 +1291,6 @@ }, "node_modules/@babel/runtime": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1475,8 +1298,6 @@ }, "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1490,8 +1311,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1509,8 +1328,6 @@ }, "node_modules/@babel/types": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1522,8 +1339,6 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { @@ -1531,68 +1346,28 @@ } }, "node_modules/@better-auth/core": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.4.9.tgz", - "integrity": "sha512-JT2q4NDkQzN22KclUEoZ7qU6tl9HUTfK1ctg2oWlT87SEagkwJcnrUwS9VznL+u9ziOIfY27P0f7/jSnmvLcoQ==", + "version": "1.3.27", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "zod": "^4.1.12" - }, - "peerDependencies": { - "@better-auth/utils": "0.3.0", - "@better-fetch/fetch": "1.1.21", - "better-call": "1.1.7", - "jose": "^6.1.0", - "kysely": "^0.28.5", - "nanostores": "^1.0.1" + "better-call": "1.0.19", + "zod": "^4.1.5" } }, - "node_modules/@better-auth/passkey": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@better-auth/passkey/-/passkey-1.4.9.tgz", - "integrity": "sha512-fPsV0LYbmPytxrTaltM2RXbJnmSttX9UWr4wkZtJYgCBGeFqN8+8ZzBTZXOymWDJTVQ0kVZrD7c7/HyxXEG1zA==", + "node_modules/@better-auth/core/node_modules/zod": { + "version": "4.3.5", "license": "MIT", - "dependencies": { - "@simplewebauthn/browser": "^13.1.2", - "@simplewebauthn/server": "^13.1.2", - "zod": "^4.1.12" - }, - "peerDependencies": { - "@better-auth/core": "1.4.9", - "@better-auth/utils": "0.3.0", - "@better-fetch/fetch": "1.1.21", - "better-auth": "1.4.9", - "better-call": "1.1.7", - "nanostores": "^1.0.1" - } - }, - "node_modules/@better-auth/telemetry": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.4.9.tgz", - "integrity": "sha512-Tthy1/Gmx+pYlbvRQPBTKfVei8+pJwvH1NZp+5SbhwA6K2EXIaoonx/K6N/AXYs2aKUpyR4/gzqDesDjL7zd6A==", - "dependencies": { - "@better-auth/utils": "0.3.0", - "@better-fetch/fetch": "1.1.21" - }, - "peerDependencies": { - "@better-auth/core": "1.4.9" + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@better-auth/utils": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@better-auth/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==", "license": "MIT" }, "node_modules/@better-fetch/fetch": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/@better-fetch/fetch/-/fetch-1.1.21.tgz", - "integrity": "sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==" + "version": "1.1.18" }, "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", @@ -1603,8 +1378,6 @@ }, "node_modules/@codemirror/commands": { "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", - "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1615,8 +1388,6 @@ }, "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", @@ -1629,8 +1400,6 @@ }, "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", @@ -1639,8 +1408,6 @@ }, "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", @@ -1652,8 +1419,6 @@ }, "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", @@ -1665,8 +1430,6 @@ }, "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", @@ -1682,8 +1445,6 @@ }, "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", @@ -1692,8 +1453,6 @@ }, "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", @@ -1707,8 +1466,6 @@ }, "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", @@ -1720,8 +1477,6 @@ }, "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", @@ -1730,8 +1485,6 @@ }, "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", @@ -1743,8 +1496,6 @@ }, "node_modules/@codemirror/lang-liquid": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.1.tgz", - "integrity": "sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -1759,8 +1510,6 @@ }, "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", @@ -1774,8 +1523,6 @@ }, "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", @@ -1787,8 +1534,6 @@ }, "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", @@ -1800,8 +1545,6 @@ }, "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", @@ -1810,8 +1553,6 @@ }, "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", @@ -1823,8 +1564,6 @@ }, "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", @@ -1837,8 +1576,6 @@ }, "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", @@ -1851,8 +1588,6 @@ }, "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", @@ -1863,8 +1598,6 @@ }, "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", @@ -1877,8 +1610,6 @@ }, "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", @@ -1892,8 +1623,6 @@ }, "node_modules/@codemirror/language": { "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", - "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1906,8 +1635,6 @@ }, "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", @@ -1937,8 +1664,6 @@ }, "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" @@ -1946,8 +1671,6 @@ }, "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", @@ -1956,20 +1679,16 @@ } }, "node_modules/@codemirror/search": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", - "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "version": "6.5.11", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.37.0", + "@codemirror/view": "^6.0.0", "crelt": "^1.0.5" } }, "node_modules/@codemirror/state": { "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.3.tgz", - "integrity": "sha512-MerMzJzlXogk2fxWFU1nKp36bY5orBG59HnPiz0G9nLRebWa0zXuv2siH6PLIHBvv5TH8CkQRqjBs0MlxCZu+A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -1977,8 +1696,6 @@ }, "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", @@ -1988,9 +1705,7 @@ } }, "node_modules/@codemirror/view": { - "version": "6.39.10", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.10.tgz", - "integrity": "sha512-QfT/PXhiiP76PxMnX0RQVPDQrqfRt9wr9QhInNHnEUu4PWoNS8QwwcIDEneXFChJv22y+Yu/Cz5lFMTPz+h16w==", + "version": "6.39.9", "license": "MIT", "dependencies": { "@codemirror/state": "^6.5.0", @@ -2001,8 +1716,6 @@ }, "node_modules/@convex-dev/action-cache": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@convex-dev/action-cache/-/action-cache-0.3.0.tgz", - "integrity": "sha512-B3GsOgwPv81whdu1mHaMKBwbIYHhNXsv3Fr5oMjynIOrRy1laGLUo9zRWDKWJgtKXfVnn8X/uxYD9RyWmPIbPQ==", "license": "Apache-2.0", "peerDependencies": { "convex": "^1.24.8" @@ -2010,8 +1723,6 @@ }, "node_modules/@convex-dev/agent": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@convex-dev/agent/-/agent-0.3.2.tgz", - "integrity": "sha512-TMFReXejAIUE22OOn8PYvoOseAqwVOPm4WZU554GFk0lJ9kcNCGRJP/T1NTZfSBXrSaSUjETMFv2vEfXbG+4Qg==", "license": "Apache-2.0", "optionalDependencies": { "@ungap/structured-clone": "^1.3.0" @@ -2030,378 +1741,151 @@ } }, "node_modules/@convex-dev/better-auth": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/@convex-dev/better-auth/-/better-auth-0.10.10.tgz", - "integrity": "sha512-BpwQ2kph43O7hmtGQAJ+ie3KrjONp83659QDjKDdH+X8yIdGevgehaqS5GHB0iJo7zQTtvs687GnAeLZ4Xx3/w==", + "version": "0.9.7", "license": "Apache-2.0", "dependencies": { - "@better-auth/passkey": "1.4.9", - "@better-fetch/fetch": "^1.1.18", "common-tags": "^1.8.2", "convex-helpers": "^0.1.95", "jose": "^6.1.0", "remeda": "^2.32.0", "semver": "^7.7.3", "type-fest": "^4.39.1", - "zod": "^4.0.0" + "zod": "^3.24.4" }, "peerDependencies": { - "better-auth": "1.4.9", - "convex": "^1.25.0", + "better-auth": "1.3.27", + "convex": ">=1.28.2 <1.35.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, "node_modules/@convex-dev/eslint-plugin": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@convex-dev/eslint-plugin/-/eslint-plugin-1.0.0.tgz", - "integrity": "sha512-ublJRBKcLCioNaf1ylkCHD2KzAqWE2RIQ6DA/UgXAXQW5qg4vZSWY8wy+EK11yJkSSxcGfFXDWaE1+cHaWJvNA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@typescript-eslint/utils": "~8.38.0" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, + "node_modules/@convex-dev/persistent-text-streaming": { + "version": "0.3.0", + "license": "Apache-2.0", "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "convex": "^1.24.8", + "react": "~18.3.1 || ^19.0.0", + "react-dom": "~18.3.1 || ^19.0.0" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node_modules/@convex-dev/rate-limiter": { + "version": "0.3.2", + "license": "Apache-2.0", + "peerDependencies": { + "convex": "^1.24.8", + "react": "^18.2.0 || ^19.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", - "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/@convex-dev/workflow": { + "version": "0.3.2", + "license": "Apache-2.0", + "dependencies": { + "async-channel": "^0.2.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@convex-dev/workpool": "^0.3.0", + "convex": "^1.24.8", + "convex-helpers": "^0.1.99" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "node_modules/@convex-dev/workpool": { + "version": "0.3.0", + "license": "Apache-2.0", + "peerDependencies": { + "convex": "^1.24.8", + "convex-helpers": "^0.1.94" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.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" + "node": ">=18" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@convex-dev/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "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/@convex-dev/eslint-plugin/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/@convex-dev/eslint-plugin/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@convex-dev/eslint-plugin/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/@convex-dev/eslint-plugin/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/@convex-dev/eslint-plugin/node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@convex-dev/persistent-text-streaming": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@convex-dev/persistent-text-streaming/-/persistent-text-streaming-0.3.0.tgz", - "integrity": "sha512-y7CteewFHrBKhVSoLxTMEwWPEmc/3J+BTJ+x+8pvh5DCUlwN80eWmfojpmGOQr7xSc6UC/c7DxlZXQPN7dVlKg==", - "license": "Apache-2.0", - "peerDependencies": { - "convex": "^1.24.8", - "react": "~18.3.1 || ^19.0.0", - "react-dom": "~18.3.1 || ^19.0.0" - } - }, - "node_modules/@convex-dev/rate-limiter": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@convex-dev/rate-limiter/-/rate-limiter-0.3.2.tgz", - "integrity": "sha512-+oBPsBfFbzdxiF/9XaaTQmVnvDlvEfg/c69/v8LxTbw4VLuiflIKlfnPQL8OS0azXQQ11hcPWHmU8ytFmHKDXA==", - "license": "Apache-2.0", - "peerDependencies": { - "convex": "^1.24.8", - "react": "^18.2.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@convex-dev/workflow": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@convex-dev/workflow/-/workflow-0.3.2.tgz", - "integrity": "sha512-Jt/yJyaPFp3FXIoZ49T8eFio0FzNwAryOVtpYGZeQsuts0Y770+Uhste/0Ph2+10Fuqm0pCAxVWhCpvRKUqxXw==", - "license": "Apache-2.0", - "dependencies": { - "async-channel": "^0.2.0" - }, - "peerDependencies": { - "@convex-dev/workpool": "^0.3.0", - "convex": "^1.24.8", - "convex-helpers": "^0.1.99" - } - }, - "node_modules/@convex-dev/workpool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@convex-dev/workpool/-/workpool-0.3.0.tgz", - "integrity": "sha512-nY8Ub0pmfuxZ2rcnNwVeESYPyJqLU4h+afodEdg8Ifnr+vcFUuee/p69vMFmeqC2y4yo9IDPHrdiVZVyjbBE7A==", - "license": "Apache-2.0", - "peerDependencies": { - "convex": "^1.24.8", - "convex-helpers": "^0.1.94" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "devOptional": true, "funding": [ { "type": "github", @@ -2424,7 +1908,7 @@ "version": "1.0.25", "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", @@ -2444,7 +1928,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", @@ -2462,14 +1946,10 @@ }, "node_modules/@date-fns/tz": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", - "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", "license": "MIT" }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", "engines": { @@ -2478,26 +1958,13 @@ }, "node_modules/@dmitryrechkin/json-schema-to-zod": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@dmitryrechkin/json-schema-to-zod/-/json-schema-to-zod-1.0.1.tgz", - "integrity": "sha512-cG9gC4NMu/7JZqmRZy6uIb+l+kxek2GFQ0/qrhw7xeFK2l5B9yF9FVuujoqFPLRGDHNFYqtBWht7hY4KB0ngrA==", "dependencies": { "zod": "^3.23.8" } }, - "node_modules/@dmitryrechkin/json-schema-to-zod/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/@edge-runtime/primitives": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-6.0.0.tgz", - "integrity": "sha512-FqoxaBT+prPBHBwE1WXS1ocnu/VLTQyZ6NMUBAdbP7N2hsFTTxMC/jMu2D/8GAlMQfxeuppcPuCUk/HO3fpIvA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -2505,9 +1972,7 @@ }, "node_modules/@edge-runtime/vm": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-5.0.0.tgz", - "integrity": "sha512-NKBGBSIKUG584qrS1tyxVpX/AKJKQw5HgjYEnPLC0QsTw79JrGn+qUr8CXFb955Iy7GUdiiUv1rJ6JBGvaKb6w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@edge-runtime/primitives": "6.0.0" @@ -2516,44 +1981,14 @@ "node": ">=18" } }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2564,12 +1999,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2580,12 +2016,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2596,12 +2033,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2611,29 +2049,14 @@ "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2644,12 +2067,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2660,12 +2084,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2676,12 +2101,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2692,12 +2118,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2708,12 +2135,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2724,12 +2152,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2740,12 +2169,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2756,12 +2186,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2772,12 +2203,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2788,12 +2220,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2804,12 +2237,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2820,12 +2254,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2836,12 +2271,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2852,12 +2288,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2868,12 +2305,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2883,13 +2321,31 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2900,12 +2356,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2916,12 +2373,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2932,12 +2390,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2949,8 +2408,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2968,8 +2425,6 @@ }, "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": { @@ -2981,8 +2436,6 @@ }, "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": { @@ -2991,8 +2444,6 @@ }, "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": { @@ -3006,8 +2457,6 @@ }, "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": { @@ -3019,8 +2468,6 @@ }, "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": { @@ -3032,8 +2479,6 @@ }, "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": { @@ -3056,8 +2501,6 @@ }, "node_modules/@eslint/js": { "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -3069,8 +2512,6 @@ }, "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": { @@ -3079,8 +2520,6 @@ }, "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": { @@ -3095,7 +2534,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.8.0.tgz", "integrity": "sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -3111,8 +2550,6 @@ }, "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" @@ -3120,33 +2557,14 @@ }, "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.27.16", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", - "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.6", - "@floating-ui/utils": "^0.2.10", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, "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" @@ -3158,14 +2576,10 @@ }, "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", @@ -3176,8 +2590,6 @@ }, "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" @@ -3185,8 +2597,6 @@ }, "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" @@ -3194,8 +2604,6 @@ }, "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", @@ -3205,8 +2613,6 @@ }, "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", @@ -3215,8 +2621,6 @@ }, "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" @@ -3224,8 +2628,6 @@ }, "node_modules/@hapi/address": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", - "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3237,29 +2639,21 @@ }, "node_modules/@hapi/formula": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", - "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@hapi/hoek": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", - "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@hapi/pinpoint": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", - "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@hapi/tlds": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.4.tgz", - "integrity": "sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3268,8 +2662,6 @@ }, "node_modules/@hapi/topo": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", - "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3278,14 +2670,10 @@ }, "node_modules/@hexagon/base64": { "version": "1.1.28", - "resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-1.1.28.tgz", - "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==", "license": "MIT" }, "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" @@ -3296,8 +2684,6 @@ }, "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": { @@ -3306,8 +2692,6 @@ }, "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": { @@ -3320,8 +2704,6 @@ }, "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": { @@ -3334,8 +2716,6 @@ }, "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": { @@ -3348,8 +2728,6 @@ }, "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": { @@ -3358,8 +2736,6 @@ }, "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" ], @@ -3378,32 +2754,8 @@ "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "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/@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" ], @@ -3416,493 +2768,87 @@ "url": "https://opencollective.com/libvips" } }, - "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/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "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/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.5.0.tgz", + "integrity": "sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, - "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/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "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/@jridgewell/remapping": { + "version": "2.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "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/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "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/@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/@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/@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/@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/@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.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/@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/@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/@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/@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/@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.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/@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/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.5.0.tgz", - "integrity": "sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" - }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "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==", - "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/sourcemap-codec": { + "version": "1.5.5", + "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", @@ -3911,26 +2857,18 @@ }, "node_modules/@js-joda/core": { "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.5.tgz", - "integrity": "sha512-3zwefSMwHpu8iVUW8YYz227sIv6UFqO31p1Bf1ZH/Vom7CmNyUsXjDBlnNzcuhmOL1XfxZ3nvND42kR23XlbcQ==", "license": "BSD-3-Clause" }, "node_modules/@levischuck/tiny-cbor": { "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz", - "integrity": "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==", "license": "MIT" }, "node_modules/@lezer/common": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", - "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", "license": "MIT" }, "node_modules/@lezer/cpp": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.5.tgz", - "integrity": "sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -3940,8 +2878,6 @@ }, "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", @@ -3951,8 +2887,6 @@ }, "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", @@ -3962,8 +2896,6 @@ }, "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" @@ -3971,8 +2903,6 @@ }, "node_modules/@lezer/html": { "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", - "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -3982,8 +2912,6 @@ }, "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", @@ -3993,8 +2921,6 @@ }, "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", @@ -4004,8 +2930,6 @@ }, "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", @@ -4015,8 +2939,6 @@ }, "node_modules/@lezer/lr": { "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.7.tgz", - "integrity": "sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -4024,8 +2946,6 @@ }, "node_modules/@lezer/markdown": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.3.tgz", - "integrity": "sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.5.0", @@ -4034,8 +2954,6 @@ }, "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", @@ -4045,8 +2963,6 @@ }, "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", @@ -4056,8 +2972,6 @@ }, "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", @@ -4067,8 +2981,6 @@ }, "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", @@ -4078,8 +2990,6 @@ }, "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", @@ -4089,8 +2999,6 @@ }, "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", @@ -4100,8 +3008,6 @@ }, "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/@mdx-js/react": { @@ -4124,8 +3030,6 @@ }, "node_modules/@microlink/react-json-view": { "version": "1.27.1", - "resolved": "https://registry.npmjs.org/@microlink/react-json-view/-/react-json-view-1.27.1.tgz", - "integrity": "sha512-HUhKcaXB8QQvOWYNBXm8p6x6SPvXzmWjc0gP6GHN+kdpWOwniUdikJe9+GHB4/tuft92idaHXTxhDJZEMW966g==", "license": "MIT", "dependencies": { "react-base16-styling": "~0.9.0", @@ -4142,8 +3046,6 @@ }, "node_modules/@milkdown/components": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/components/-/components-7.17.2.tgz", - "integrity": "sha512-x2ChRpglEZK8R3XrkG8cODYH2Az5xPGlpTui7VvekhoADDV91Z+0aFbvcwh1nwn0eFCgjvq0iwoTnQjQKm+pmw==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.5.1", @@ -4170,10 +3072,24 @@ "@codemirror/view": "^6" } }, + "node_modules/@milkdown/components/node_modules/nanoid": { + "version": "5.1.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, "node_modules/@milkdown/core": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.17.2.tgz", - "integrity": "sha512-w2wt4wAaawH3h1wPXFACMMFlp+eUIzGEEOiSSmc57A+p2KxGbJIZEApFckN0dd9BF+pwSMs0WJrm7y0NkwuSUg==", "license": "MIT", "dependencies": { "@milkdown/ctx": "7.17.2", @@ -4187,8 +3103,6 @@ }, "node_modules/@milkdown/crepe": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/crepe/-/crepe-7.17.2.tgz", - "integrity": "sha512-MxVefGFkUcQRZZ3k4VRNkPB62zPmOa972RiOrZwOIV87MLS9Qy8KzJEM7ZVB1S2qPPJ76dQ4ueS9Cv44BVR+Ig==", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.2.4", @@ -4211,8 +3125,6 @@ }, "node_modules/@milkdown/ctx": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.17.2.tgz", - "integrity": "sha512-tisdi73GKANoBMqtwnl7I3/liifekRBm5bDBE7VHfd8iL5m9nw9pVF2XqtZogtLL78pn0oCdQmITobNfiLdJgg==", "license": "MIT", "dependencies": { "@milkdown/exception": "7.17.2" @@ -4220,14 +3132,10 @@ }, "node_modules/@milkdown/exception": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.17.2.tgz", - "integrity": "sha512-HAeiI8PmzSowEBQ53T4tbHtfSahFAQWdsOJhiDevxYo3Oje3HG+XXJZQcX2YufShfphawjDe0U6YkHQS53amTg==", "license": "MIT" }, "node_modules/@milkdown/kit": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/kit/-/kit-7.17.2.tgz", - "integrity": "sha512-c01qSBnBdMH79qFgkPm6GYfLH0mG2ImiNKEM8LWAQLsC91BkFo4MYRi0j6vTIqJml0PnGgqPsrxXYHFixXZiyQ==", "license": "MIT", "dependencies": { "@milkdown/components": "7.17.2", @@ -4252,8 +3160,6 @@ }, "node_modules/@milkdown/plugin-block": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-block/-/plugin-block-7.17.2.tgz", - "integrity": "sha512-DvpbMqYsLvO62GZYl/5i89zthoirWKoBrnE8w7t6vhRD4V3JSVnrkv1N1kyd9W83hC+DV82A6L6tQDrBWYkHzw==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.5.1", @@ -4267,8 +3173,6 @@ }, "node_modules/@milkdown/plugin-clipboard": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-clipboard/-/plugin-clipboard-7.17.2.tgz", - "integrity": "sha512-4kDhP/WdVO76WOdMFUcUmBR/frA50ZmoKuYvkThsglrTaAEvWoDHs10rCoZEwehKq3FILDVjZU8Zm/pOtV+RJA==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4279,8 +3183,6 @@ }, "node_modules/@milkdown/plugin-cursor": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-cursor/-/plugin-cursor-7.17.2.tgz", - "integrity": "sha512-vtqlm4RRmsR4xlIq2KMlR7X7Z07ibjmjrx0lZR/sor2m5ioUrpJMq8zK8ey0fYMMXHaYQidpufTrizK7WcxnLg==", "license": "MIT", "dependencies": { "@milkdown/ctx": "7.17.2", @@ -4291,8 +3193,6 @@ }, "node_modules/@milkdown/plugin-history": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-history/-/plugin-history-7.17.2.tgz", - "integrity": "sha512-dJiLMzre6VnjgAhf2I/EMPVIj4APe8yDkB62XlX79Bd3Q8F36g4dVkU/rbTjmL1iKMC0SBl78nfEtmgsOdMbKA==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4303,8 +3203,6 @@ }, "node_modules/@milkdown/plugin-indent": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-indent/-/plugin-indent-7.17.2.tgz", - "integrity": "sha512-RvVnrZkkEKHIs2IIsZv2YZrOgHfbgTdCZqnK8xLwUUDb2E8RmL5z993Rr0t8/8oxve5h/bU+uGg1lT2v6cz/Sg==", "license": "MIT", "dependencies": { "@milkdown/ctx": "7.17.2", @@ -4314,8 +3212,6 @@ }, "node_modules/@milkdown/plugin-listener": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-listener/-/plugin-listener-7.17.2.tgz", - "integrity": "sha512-1ViQ+7eK5lPB3K17Y7GSq7kVn6LgLgG1YUKNRjJYrN/kCiYeaqbogxeI1Aeow8mDDtXONTplI3Yq4yIjxBv50A==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4327,8 +3223,6 @@ }, "node_modules/@milkdown/plugin-slash": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-slash/-/plugin-slash-7.17.2.tgz", - "integrity": "sha512-w2NDrkZMyVYeXw81zhOrahGEXNnunDY7CL5e6dTC08YeWl/OKAdmnAfbfILCI0de8ZMj0nmMoK/KHJS53yD9EA==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.5.1", @@ -4341,8 +3235,6 @@ }, "node_modules/@milkdown/plugin-tooltip": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-tooltip/-/plugin-tooltip-7.17.2.tgz", - "integrity": "sha512-MOtvZGrb7NkU8Jmh4ksk4MCfar2Kqbcgh1wwR3hVio1wXAPaeMMereGIIVtsPvMDvwmWbI7oWtvoOyvzJztmgQ==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.5.1", @@ -4355,8 +3247,6 @@ }, "node_modules/@milkdown/plugin-trailing": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-trailing/-/plugin-trailing-7.17.2.tgz", - "integrity": "sha512-TKFoclZfkeJfsgC8+7fk7pobP/h+HrINKNm+2jQ3fTgjAgEuLO9uVYnJ1MLBpWVdjjWabSG7OLoR/Ur57V7ysg==", "license": "MIT", "dependencies": { "@milkdown/ctx": "7.17.2", @@ -4366,8 +3256,6 @@ }, "node_modules/@milkdown/plugin-upload": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/plugin-upload/-/plugin-upload-7.17.2.tgz", - "integrity": "sha512-CkpPVapreqo9BNRqrVoOuJ/eetEONYk9HxOyTq+bbrGTVrvVcxefRlL2S11hk8kxzJiDR1UjmSxcYMPpAHNkiw==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4379,8 +3267,6 @@ }, "node_modules/@milkdown/preset-commonmark": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.17.2.tgz", - "integrity": "sha512-0CE6wfmuvJRN+Y+vszHRwDmkEGcxugiCa2VZ5ZFJtk0eakiwVxQx04KVnbaAQJQ44NIZLyrBD7oL9gTG2HxN8g==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4396,8 +3282,6 @@ }, "node_modules/@milkdown/preset-gfm": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/preset-gfm/-/preset-gfm-7.17.2.tgz", - "integrity": "sha512-g0p9EFeV//2fAYpdXVEZH+KOhs9T89rOmMBXRucJSB2RS6czrnIzuUCJoKNoQ/WjFRjEh6BOYFI/ZcbeJQ5TEA==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4413,8 +3297,6 @@ }, "node_modules/@milkdown/prose": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.17.2.tgz", - "integrity": "sha512-XHUcoTEZsYZOSzKvxOjRQRRDX5wi3y4d6s0zEcaAoTyTpi/pp140Cw4ASXzhOhdHcgOezcfvgOsGtA8DRjl5wQ==", "license": "MIT", "dependencies": { "@milkdown/exception": "7.17.2", @@ -4435,8 +3317,6 @@ }, "node_modules/@milkdown/react": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/react/-/react-7.17.2.tgz", - "integrity": "sha512-vWq7LFk9Y265bLtem9DfO2mLn8nggQ01ifULhBDpZM0Ain1KaIqXaToPMIteaHCmMDh815vmYpWnhsMNrPR/RA==", "license": "MIT", "dependencies": { "@milkdown/crepe": "7.17.2", @@ -4449,8 +3329,6 @@ }, "node_modules/@milkdown/transformer": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.17.2.tgz", - "integrity": "sha512-D7mS4r4cJyvnoGvD7Bo+rlfiKNHAgDd8YgGQLITu83nuaYXicd/ybnARzJCO+w7BixIZFsbwl9B+MdP4qlI+cA==", "license": "MIT", "dependencies": { "@milkdown/exception": "7.17.2", @@ -4461,8 +3339,6 @@ }, "node_modules/@milkdown/utils": { "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.17.2.tgz", - "integrity": "sha512-DmPYFbcFKN8VnahtBQ96DH2ohGX46D5D2UB4PYeNHuZj6mO1rC1AeZP+e7pLFvCq4cV6BiKmIxKy1+WHej9MKA==", "license": "MIT", "dependencies": { "@milkdown/core": "7.17.2", @@ -4473,10 +3349,24 @@ "nanoid": "^5.0.9" } }, + "node_modules/@milkdown/utils/node_modules/nanoid": { + "version": "5.1.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, "node_modules/@napi-rs/canvas": { "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.88.tgz", - "integrity": "sha512-/p08f93LEbsL5mDZFQ3DBxcPv/I4QG9EDYRRq1WNlCOXVfAHBTHMSVMwxlqG/AtnSfUr9+vgfN7MKiyDo0+Weg==", "dev": true, "license": "MIT", "optional": true, @@ -4504,31 +3394,8 @@ "@napi-rs/canvas-win32-x64-msvc": "0.1.88" } }, - "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.88.tgz", - "integrity": "sha512-KEaClPnZuVxJ8smUWjV1wWFkByBO/D+vy4lN+Dm5DFH514oqwukxKGeck9xcKJhaWJGjfruGmYGiwRe//+/zQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, "node_modules/@napi-rs/canvas-darwin-arm64": { "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.88.tgz", - "integrity": "sha512-Xgywz0dDxOKSgx3eZnK85WgGMmGrQEW7ZLA/E7raZdlEE+xXCozobgqz2ZvYigpB6DJFYkqnwHjqCOTSDGlFdg==", "cpu": [ "arm64" ], @@ -4546,211 +3413,8 @@ "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.88.tgz", - "integrity": "sha512-Yz4wSCIQOUgNucgk+8NFtQxQxZV5NO8VKRl9ePKE6XoNyNVC8JDqtvhh3b3TPqKK8W5p2EQpAr1rjjm0mfBxdg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.88.tgz", - "integrity": "sha512-9gQM2SlTo76hYhxHi2XxWTAqpTOb+JtxMPEIr+H5nAhHhyEtNmTSDRtz93SP7mGd2G3Ojf2oF5tP9OdgtgXyKg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.88.tgz", - "integrity": "sha512-7qgaOBMXuVRk9Fzztzr3BchQKXDxGbY+nwsovD3I/Sx81e+sX0ReEDYHTItNb0Je4NHbAl7D0MKyd4SvUc04sg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.88.tgz", - "integrity": "sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.88.tgz", - "integrity": "sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.88.tgz", - "integrity": "sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.88.tgz", - "integrity": "sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-win32-arm64-msvc": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.88.tgz", - "integrity": "sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.88", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.88.tgz", - "integrity": "sha512-ROVqbfS4QyZxYkqmaIBBpbz/BQvAR+05FXM5PAtTYVc0uyY8Y4BHJSMdGAaMf6TdIVRsQsiq+FG/dH9XhvWCFQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@next/bundle-analyzer": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.1.1.tgz", - "integrity": "sha512-aNJy301GGH8k36rDgrYdnyYEdjRQg6csMi1njzqHo+3qyZvOOWMHSv+p7SztNTzP5RU2KRwX0pPwYBtDcE+vVA==", "dev": true, "license": "MIT", "dependencies": { @@ -4759,24 +3423,44 @@ }, "node_modules/@next/env": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.1.tgz", - "integrity": "sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.1.tgz", - "integrity": "sha512-Ovb/6TuLKbE1UiPcg0p39Ke3puyTCIKN9hGbNItmpQsp+WX3qrjO3WaMVSi6JHr9X1NrmthqIguVHodMJbh/dw==", "dev": true, "license": "MIT", "dependencies": { "fast-glob": "3.3.1" } }, + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", + "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/@next/eslint-plugin-next/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@next/swc-darwin-arm64": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.1.tgz", - "integrity": "sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==", "cpu": [ "arm64" ], @@ -4796,7 +3480,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -4812,7 +3495,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4828,7 +3510,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4844,7 +3525,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4860,7 +3540,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4876,7 +3555,6 @@ "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -4892,7 +3570,6 @@ "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -4903,8 +3580,6 @@ }, "node_modules/@noble/ciphers": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", - "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -4915,8 +3590,6 @@ }, "node_modules/@noble/hashes": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -4927,8 +3600,6 @@ }, "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": { @@ -4941,8 +3612,6 @@ }, "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": { @@ -4951,8 +3620,6 @@ }, "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": { @@ -4965,8 +3632,6 @@ }, "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": { @@ -4975,8 +3640,6 @@ }, "node_modules/@ocavue/utils": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ocavue/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-jd8D6fUdkspMUYr2EE8mTj1GgPivXeHMyPeI2S9v7DEJcNN1DN2Wo/7xZ5H7vUycgfpr8ucv63aKh3NKURHc1Q==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ocavue" @@ -4984,299 +3647,53 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.4.tgz", - "integrity": "sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.4", - "@parcel/watcher-darwin-arm64": "2.5.4", - "@parcel/watcher-darwin-x64": "2.5.4", - "@parcel/watcher-freebsd-x64": "2.5.4", - "@parcel/watcher-linux-arm-glibc": "2.5.4", - "@parcel/watcher-linux-arm-musl": "2.5.4", - "@parcel/watcher-linux-arm64-glibc": "2.5.4", - "@parcel/watcher-linux-arm64-musl": "2.5.4", - "@parcel/watcher-linux-x64-glibc": "2.5.4", - "@parcel/watcher-linux-x64-musl": "2.5.4", - "@parcel/watcher-win32-arm64": "2.5.4", - "@parcel/watcher-win32-ia32": "2.5.4", - "@parcel/watcher-win32-x64": "2.5.4" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.4.tgz", - "integrity": "sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.4.tgz", - "integrity": "sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.4.tgz", - "integrity": "sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.4.tgz", - "integrity": "sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.4.tgz", - "integrity": "sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.4.tgz", - "integrity": "sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.4.tgz", - "integrity": "sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.4.tgz", - "integrity": "sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.4.tgz", - "integrity": "sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.4.tgz", - "integrity": "sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.4.tgz", - "integrity": "sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==", - "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.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.4.tgz", - "integrity": "sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==", - "cpu": [ - "ia32" - ], + "node_modules/@parcel/watcher": { + "version": "2.5.4", + "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, "engines": { "node": ">= 10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.4", + "@parcel/watcher-darwin-arm64": "2.5.4", + "@parcel/watcher-darwin-x64": "2.5.4", + "@parcel/watcher-freebsd-x64": "2.5.4", + "@parcel/watcher-linux-arm-glibc": "2.5.4", + "@parcel/watcher-linux-arm-musl": "2.5.4", + "@parcel/watcher-linux-arm64-glibc": "2.5.4", + "@parcel/watcher-linux-arm64-musl": "2.5.4", + "@parcel/watcher-linux-x64-glibc": "2.5.4", + "@parcel/watcher-linux-x64-musl": "2.5.4", + "@parcel/watcher-win32-arm64": "2.5.4", + "@parcel/watcher-win32-ia32": "2.5.4", + "@parcel/watcher-win32-x64": "2.5.4" } }, - "node_modules/@parcel/watcher-win32-x64": { + "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.4.tgz", - "integrity": "sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10.0.0" @@ -5288,8 +3705,6 @@ }, "node_modules/@peculiar/asn1-android": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-android/-/asn1-android-2.6.0.tgz", - "integrity": "sha512-cBRCKtYPF7vJGN76/yG8VbxRcHLPF3HnkoHhKOZeHpoVtbMYfY9ROKtH3DtYUY9m8uI1Mh47PRhHf2hSK3xcSQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5299,8 +3714,6 @@ }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5312,8 +3725,6 @@ }, "node_modules/@peculiar/asn1-csr": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5324,8 +3735,6 @@ }, "node_modules/@peculiar/asn1-ecc": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5336,8 +3745,6 @@ }, "node_modules/@peculiar/asn1-pfx": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -5350,8 +3757,6 @@ }, "node_modules/@peculiar/asn1-pkcs8": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5362,8 +3767,6 @@ }, "node_modules/@peculiar/asn1-pkcs9": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -5378,8 +3781,6 @@ }, "node_modules/@peculiar/asn1-rsa": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5390,8 +3791,6 @@ }, "node_modules/@peculiar/asn1-schema": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", "license": "MIT", "dependencies": { "asn1js": "^3.0.6", @@ -5401,8 +3800,6 @@ }, "node_modules/@peculiar/asn1-x509": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5413,8 +3810,6 @@ }, "node_modules/@peculiar/asn1-x509-attr": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -5425,8 +3820,6 @@ }, "node_modules/@peculiar/x509": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -5447,8 +3840,6 @@ }, "node_modules/@pinojs/redact": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -5464,27 +3855,19 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, "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-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" @@ -5506,8 +3889,6 @@ }, "node_modules/@radix-ui/react-arrow/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" @@ -5529,8 +3910,6 @@ }, "node_modules/@radix-ui/react-arrow/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" @@ -5547,8 +3926,6 @@ }, "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", @@ -5574,8 +3951,6 @@ }, "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", @@ -5604,8 +3979,6 @@ }, "node_modules/@radix-ui/react-checkbox/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": "*", @@ -5619,8 +3992,6 @@ }, "node_modules/@radix-ui/react-checkbox/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" @@ -5642,8 +4013,6 @@ }, "node_modules/@radix-ui/react-checkbox/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" @@ -5660,8 +4029,6 @@ }, "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", @@ -5686,8 +4053,6 @@ }, "node_modules/@radix-ui/react-collection/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": "*", @@ -5701,8 +4066,6 @@ }, "node_modules/@radix-ui/react-collection/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" @@ -5724,8 +4087,6 @@ }, "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" @@ -5742,8 +4103,6 @@ }, "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": "*", @@ -5757,8 +4116,6 @@ }, "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": "*", @@ -5772,8 +4129,6 @@ }, "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", @@ -5808,8 +4163,6 @@ }, "node_modules/@radix-ui/react-dialog/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": "*", @@ -5823,8 +4176,6 @@ }, "node_modules/@radix-ui/react-dialog/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" @@ -5846,8 +4197,6 @@ }, "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" @@ -5864,8 +4213,6 @@ }, "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": "*", @@ -5879,8 +4226,6 @@ }, "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", @@ -5906,8 +4251,6 @@ }, "node_modules/@radix-ui/react-dismissable-layer/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" @@ -5929,8 +4272,6 @@ }, "node_modules/@radix-ui/react-dismissable-layer/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" @@ -5947,8 +4288,6 @@ }, "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", @@ -5976,8 +4315,6 @@ }, "node_modules/@radix-ui/react-dropdown-menu/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": "*", @@ -5991,8 +4328,6 @@ }, "node_modules/@radix-ui/react-dropdown-menu/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" @@ -6014,8 +4349,6 @@ }, "node_modules/@radix-ui/react-dropdown-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" @@ -6032,8 +4365,6 @@ }, "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": "*", @@ -6047,8 +4378,6 @@ }, "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", @@ -6072,8 +4401,6 @@ }, "node_modules/@radix-ui/react-focus-scope/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" @@ -6095,8 +4422,6 @@ }, "node_modules/@radix-ui/react-focus-scope/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" @@ -6113,8 +4438,6 @@ }, "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" @@ -6131,8 +4454,6 @@ }, "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" @@ -6154,8 +4475,6 @@ }, "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", @@ -6194,8 +4513,6 @@ }, "node_modules/@radix-ui/react-menu/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": "*", @@ -6209,8 +4526,6 @@ }, "node_modules/@radix-ui/react-menu/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" @@ -6232,8 +4547,6 @@ }, "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" @@ -6250,8 +4563,6 @@ }, "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", @@ -6286,8 +4597,6 @@ }, "node_modules/@radix-ui/react-navigation-menu/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": "*", @@ -6301,8 +4610,6 @@ }, "node_modules/@radix-ui/react-navigation-menu/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" @@ -6324,8 +4631,6 @@ }, "node_modules/@radix-ui/react-navigation-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" @@ -6342,8 +4647,6 @@ }, "node_modules/@radix-ui/react-navigation-menu/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" @@ -6365,8 +4668,6 @@ }, "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", @@ -6402,8 +4703,6 @@ }, "node_modules/@radix-ui/react-popover/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": "*", @@ -6417,8 +4716,6 @@ }, "node_modules/@radix-ui/react-popover/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" @@ -6440,8 +4737,6 @@ }, "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" @@ -6458,8 +4753,6 @@ }, "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", @@ -6490,8 +4783,6 @@ }, "node_modules/@radix-ui/react-popper/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": "*", @@ -6505,8 +4796,6 @@ }, "node_modules/@radix-ui/react-popper/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" @@ -6528,8 +4817,6 @@ }, "node_modules/@radix-ui/react-popper/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" @@ -6546,8 +4833,6 @@ }, "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", @@ -6570,8 +4855,6 @@ }, "node_modules/@radix-ui/react-portal/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" @@ -6593,8 +4876,6 @@ }, "node_modules/@radix-ui/react-portal/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" @@ -6611,8 +4892,6 @@ }, "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", @@ -6635,8 +4914,6 @@ }, "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" @@ -6658,8 +4935,6 @@ }, "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", @@ -6690,8 +4965,6 @@ }, "node_modules/@radix-ui/react-radio-group/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": "*", @@ -6705,8 +4978,6 @@ }, "node_modules/@radix-ui/react-radio-group/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" @@ -6728,8 +4999,6 @@ }, "node_modules/@radix-ui/react-radio-group/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" @@ -6746,8 +5015,6 @@ }, "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", @@ -6777,8 +5044,6 @@ }, "node_modules/@radix-ui/react-roving-focus/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": "*", @@ -6792,8 +5057,6 @@ }, "node_modules/@radix-ui/react-roving-focus/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" @@ -6815,8 +5078,6 @@ }, "node_modules/@radix-ui/react-roving-focus/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" @@ -6833,8 +5094,6 @@ }, "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", @@ -6876,8 +5135,6 @@ }, "node_modules/@radix-ui/react-select/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": "*", @@ -6891,8 +5148,6 @@ }, "node_modules/@radix-ui/react-select/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" @@ -6914,8 +5169,6 @@ }, "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" @@ -6932,8 +5185,6 @@ }, "node_modules/@radix-ui/react-select/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" @@ -6955,8 +5206,6 @@ }, "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" @@ -6978,8 +5227,6 @@ }, "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" @@ -6996,8 +5243,6 @@ }, "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", @@ -7025,8 +5270,6 @@ }, "node_modules/@radix-ui/react-switch/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": "*", @@ -7040,8 +5283,6 @@ }, "node_modules/@radix-ui/react-switch/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" @@ -7063,8 +5304,6 @@ }, "node_modules/@radix-ui/react-switch/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" @@ -7081,8 +5320,6 @@ }, "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", @@ -7111,8 +5348,6 @@ }, "node_modules/@radix-ui/react-tabs/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": "*", @@ -7126,8 +5361,6 @@ }, "node_modules/@radix-ui/react-tabs/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" @@ -7149,8 +5382,6 @@ }, "node_modules/@radix-ui/react-tabs/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" @@ -7167,8 +5398,6 @@ }, "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", @@ -7201,8 +5430,6 @@ }, "node_modules/@radix-ui/react-toast/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": "*", @@ -7216,8 +5443,6 @@ }, "node_modules/@radix-ui/react-toast/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" @@ -7239,8 +5464,6 @@ }, "node_modules/@radix-ui/react-toast/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" @@ -7257,8 +5480,6 @@ }, "node_modules/@radix-ui/react-toast/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" @@ -7280,8 +5501,6 @@ }, "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", @@ -7314,8 +5533,6 @@ }, "node_modules/@radix-ui/react-tooltip/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": "*", @@ -7329,8 +5546,6 @@ }, "node_modules/@radix-ui/react-tooltip/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" @@ -7352,8 +5567,6 @@ }, "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" @@ -7370,8 +5583,6 @@ }, "node_modules/@radix-ui/react-tooltip/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" @@ -7393,8 +5604,6 @@ }, "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": "*", @@ -7408,8 +5617,6 @@ }, "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", @@ -7427,8 +5634,6 @@ }, "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" @@ -7445,8 +5650,6 @@ }, "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" @@ -7463,8 +5666,6 @@ }, "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" @@ -7481,8 +5682,6 @@ }, "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": "*", @@ -7496,8 +5695,6 @@ }, "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": "*", @@ -7511,8 +5708,6 @@ }, "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" @@ -7529,8 +5724,6 @@ }, "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" @@ -7547,8 +5740,6 @@ }, "node_modules/@radix-ui/react-visually-hidden": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.4.tgz", - "integrity": "sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==", "license": "MIT", "dependencies": { "@radix-ui/react-primitive": "2.1.4" @@ -7570,8 +5761,6 @@ }, "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/@rolldown/pluginutils": { @@ -7604,6 +5793,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.55.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", @@ -7611,6 +5807,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7624,6 +5821,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7632,11 +5830,10 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7650,6 +5847,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7663,6 +5861,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7676,6 +5875,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7689,6 +5889,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7702,6 +5903,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7715,6 +5917,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7728,6 +5931,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7741,6 +5945,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7754,6 +5959,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7767,6 +5973,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7780,6 +5987,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7793,6 +6001,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7806,6 +6015,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7819,6 +6029,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7832,6 +6043,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7845,6 +6057,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7858,6 +6071,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7871,6 +6085,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7884,6 +6099,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7897,6 +6113,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7910,6 +6127,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7923,6 +6141,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7931,21 +6150,15 @@ }, "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/@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/@selderee/plugin-htmlparser2": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -7957,14 +6170,10 @@ }, "node_modules/@simplewebauthn/browser": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.2.2.tgz", - "integrity": "sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==", "license": "MIT" }, "node_modules/@simplewebauthn/server": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.2.2.tgz", - "integrity": "sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==", "license": "MIT", "dependencies": { "@hexagon/base64": "^1.1.27", @@ -7982,8 +6191,6 @@ }, "node_modules/@smithy/abort-controller": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.7.tgz", - "integrity": "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7996,8 +6203,6 @@ }, "node_modules/@smithy/config-resolver": { "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8013,9 +6218,7 @@ } }, "node_modules/@smithy/core": { - "version": "3.20.4", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.4.tgz", - "integrity": "sha512-FrlAm2ZVuoyjCvhOSwOe4SbjqF7hkZmeG1TEphVOdyQDvj3olO74lEUS5VSYfmCJlUHYjGMAardWp5hv9ilXpg==", + "version": "3.20.2", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8025,7 +6228,7 @@ "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", - "@smithy/util-stream": "^4.5.9", + "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -8036,8 +6239,6 @@ }, "node_modules/@smithy/credential-provider-imds": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8053,8 +6254,6 @@ }, "node_modules/@smithy/fetch-http-handler": { "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz", - "integrity": "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8070,8 +6269,6 @@ }, "node_modules/@smithy/hash-node": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8086,8 +6283,6 @@ }, "node_modules/@smithy/invalid-dependency": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8100,8 +6295,6 @@ }, "node_modules/@smithy/is-array-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8113,8 +6306,6 @@ }, "node_modules/@smithy/middleware-content-length": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8127,13 +6318,11 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.5.tgz", - "integrity": "sha512-nweOu7Z3xxAMjlAbHqnIvwNQzcdr5dmb72zxTWOt1sTdrp2a7cJxbsnNCucYqr0WsLws9E33gIZohDalWucBcA==", + "version": "4.4.3", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.4", + "@smithy/core": "^3.20.2", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -8147,16 +6336,14 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.21", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.21.tgz", - "integrity": "sha512-VVYPm4V0OzNnfWeTnO5lTn8rjjLXgKrN0CX0tqnGCt2oecvsk0MZf9CziqiPrHTiMqeiLqrhLtbL8d/m7983zQ==", + "version": "4.4.19", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.6", + "@smithy/smithy-client": "^4.10.4", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", @@ -8169,8 +6356,6 @@ }, "node_modules/@smithy/middleware-serde": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz", - "integrity": "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8184,8 +6369,6 @@ }, "node_modules/@smithy/middleware-stack": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz", - "integrity": "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8197,15 +6380,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "version": "4.3.7", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8214,8 +6395,6 @@ }, "node_modules/@smithy/node-http-handler": { "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz", - "integrity": "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8230,13 +6409,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "version": "4.2.7", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8245,8 +6422,6 @@ }, "node_modules/@smithy/protocol-http": { "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.7.tgz", - "integrity": "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8259,8 +6434,6 @@ }, "node_modules/@smithy/querystring-builder": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz", - "integrity": "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8274,8 +6447,6 @@ }, "node_modules/@smithy/querystring-parser": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz", - "integrity": "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8288,8 +6459,6 @@ }, "node_modules/@smithy/service-error-classification": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8300,13 +6469,11 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "version": "4.4.2", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8315,8 +6482,6 @@ }, "node_modules/@smithy/signature-v4": { "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.7.tgz", - "integrity": "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8334,18 +6499,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.6.tgz", - "integrity": "sha512-VR6eI2xFZwBISlofR9U37pkBwZYsqxjsebc8Q3u5zFIeaVXs9k9v6eunDcm7QnjSjz4fxwQlnAbAU9A/73ANFw==", + "version": "4.10.4", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.4", - "@smithy/middleware-endpoint": "^4.4.5", + "@smithy/core": "^3.20.2", + "@smithy/middleware-endpoint": "^4.4.3", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", - "@smithy/util-stream": "^4.5.9", + "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" }, "engines": { @@ -8353,9 +6516,7 @@ } }, "node_modules/@smithy/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "version": "4.11.0", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8367,8 +6528,6 @@ }, "node_modules/@smithy/url-parser": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.7.tgz", - "integrity": "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8382,8 +6541,6 @@ }, "node_modules/@smithy/util-base64": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8397,8 +6554,6 @@ }, "node_modules/@smithy/util-body-length-browser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8410,8 +6565,6 @@ }, "node_modules/@smithy/util-body-length-node": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8423,8 +6576,6 @@ }, "node_modules/@smithy/util-buffer-from": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8437,8 +6588,6 @@ }, "node_modules/@smithy/util-config-provider": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8449,14 +6598,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.20", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.20.tgz", - "integrity": "sha512-W3JCatcbDHo5TmA9VsxJgBb5R3k1S6LENBO2BfO6DjFPSozlKPOwLZO7BpyLL4K41WSvWVJe0uIwcdK8/LUYTg==", + "version": "4.3.18", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.6", + "@smithy/smithy-client": "^4.10.4", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -8465,9 +6612,7 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.23.tgz", - "integrity": "sha512-ybx8nIkuWC3oshIQMVDyrP0kKPbzoIU4V1vXOSqEKzMySOpucRhHrWSgZv/U0l0PIm4srieyw+7f7EiXDIK6QA==", + "version": "4.2.21", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8475,7 +6620,7 @@ "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.6", + "@smithy/smithy-client": "^4.10.4", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -8485,8 +6630,6 @@ }, "node_modules/@smithy/util-endpoints": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz", - "integrity": "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8500,8 +6643,6 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8513,8 +6654,6 @@ }, "node_modules/@smithy/util-middleware": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.7.tgz", - "integrity": "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8527,8 +6666,6 @@ }, "node_modules/@smithy/util-retry": { "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8541,9 +6678,7 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.9", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.9.tgz", - "integrity": "sha512-CYEr2Og55VR8+17K/vf32nOtIXZIZ80UksLS+Ih81G7GofWqe/5dPhTxdOQc0ySFGN5ZNWpIQIpAWvLYmzuf6w==", + "version": "4.5.8", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8562,8 +6697,6 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8575,8 +6708,6 @@ }, "node_modules/@smithy/util-utf8": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8589,8 +6720,6 @@ }, "node_modules/@smithy/uuid": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8602,14 +6731,10 @@ }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "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/@storybook/addon-a11y": { @@ -8660,6 +6785,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@storybook/addon-backgrounds": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.14.tgz", @@ -8901,6 +7040,101 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@storybook/addon-interactions/node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@storybook/addon-links": { "version": "8.6.15", "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.6.15.tgz", @@ -9120,6 +7354,23 @@ } } }, + "node_modules/@storybook/core/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@storybook/core/node_modules/@storybook/theming": { "version": "8.6.15", "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.15.tgz", @@ -9134,6 +7385,70 @@ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, + "node_modules/@storybook/core/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/@storybook/core/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "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/@storybook/csf-plugin": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.14.tgz", @@ -9190,6 +7505,44 @@ "storybook": "^8.6.14" } }, + "node_modules/@storybook/instrumenter/node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/instrumenter/node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/instrumenter/node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@storybook/manager-api": { "version": "8.6.15", "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.15.tgz", @@ -9308,6 +7661,21 @@ } } }, + "node_modules/@storybook/react-vite/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": { "version": "8.6.15", "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.15.tgz", @@ -9455,175 +7823,188 @@ "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@storybook/theming": { - "version": "8.6.14", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz", - "integrity": "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==", + "node_modules/@storybook/test/node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dev": true, "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/test/node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" }, - "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.8.tgz", - "integrity": "sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/test/node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.8.tgz", - "integrity": "sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/test/node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.8.tgz", - "integrity": "sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/test/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.8.tgz", - "integrity": "sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/test/node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.8.tgz", - "integrity": "sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/test/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.8.tgz", - "integrity": "sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@storybook/test/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.8.tgz", - "integrity": "sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@storybook/test/node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.8.tgz", - "integrity": "sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" + "node_modules/@storybook/theming": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz", + "integrity": "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, - "node_modules/@swc/core-win32-ia32-msvc": { + "node_modules/@swc/core": { "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.8.tgz", - "integrity": "sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "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.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" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/@swc/core-win32-x64-msvc": { + "node_modules/@swc/core-darwin-arm64": { "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.8.tgz", - "integrity": "sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==", "cpu": [ - "x64" + "arm64" ], "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=10" @@ -9631,14 +8012,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.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" @@ -9646,8 +8023,6 @@ }, "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" @@ -9655,8 +8030,6 @@ }, "node_modules/@tailwindcss/node": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -9670,8 +8043,6 @@ }, "node_modules/@tailwindcss/oxide": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", "license": "MIT", "engines": { "node": ">= 10" @@ -9691,843 +8062,908 @@ "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, - "node_modules/@tailwindcss/oxide-android-arm64": { + "node_modules/@tailwindcss/oxide-darwin-arm64": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { + "node_modules/@tailwindcss/postcss": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tale/crawler": { + "resolved": "services/crawler", + "link": true + }, + "node_modules/@tale/db": { + "resolved": "services/db", + "link": true + }, + "node_modules/@tale/graph-db": { + "resolved": "services/graph-db", + "link": true + }, + "node_modules/@tale/platform": { + "resolved": "services/platform", + "link": true + }, + "node_modules/@tale/proxy": { + "resolved": "services/proxy", + "link": true + }, + "node_modules/@tale/rag": { + "resolved": "services/rag", + "link": true + }, + "node_modules/@tale/search": { + "resolved": "services/search", + "link": true + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.16", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.92.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.16", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.91.2", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.92.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.90.14", + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, "engines": { - "node": ">= 10" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], + "node_modules/@tanstack/table-core": { + "version": "8.21.3", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], + "node_modules/@tediousjs/connection-string": { + "version": "0.6.0", + "license": "MIT" + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.1.tgz", + "integrity": "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@babel/types": "^7.28.2" } }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], + "node_modules/@types/base16": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], + "node_modules/@types/d3-color": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" + "@types/d3-selection": "*" } }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@types/d3-color": "*" } }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@types/d3-selection": "*" } }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", - "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "node_modules/@types/d3-zoom": { + "version": "3.0.8", "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "postcss": "^8.4.41", - "tailwindcss": "4.1.18" + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" } }, - "node_modules/@tale/crawler": { - "resolved": "services/crawler", - "link": true - }, - "node_modules/@tale/db": { - "resolved": "services/db", - "link": true - }, - "node_modules/@tale/graph-db": { - "resolved": "services/graph-db", - "link": true - }, - "node_modules/@tale/platform": { - "resolved": "services/platform", - "link": true + "node_modules/@types/dagre": { + "version": "0.7.53", + "dev": true, + "license": "MIT" }, - "node_modules/@tale/proxy": { - "resolved": "services/proxy", - "link": true + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } }, - "node_modules/@tale/rag": { - "resolved": "services/rag", - "link": true + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" }, - "node_modules/@tale/search": { - "resolved": "services/search", - "link": true + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true, + "license": "MIT" }, - "node_modules/@tanstack/query-core": { - "version": "5.90.17", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.17.tgz", - "integrity": "sha512-hDww+RyyYhjhUfoYQ4es6pbgxY7LNiPWxt4l1nJqhByjndxJ7HIjDxTBtfvMr5HwjYavMrd+ids5g4Rfev3lVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } + "node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" }, - "node_modules/@tanstack/query-devtools": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.92.0.tgz", - "integrity": "sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==", + "node_modules/@types/estree-jsx": { + "version": "1.0.5", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "dependencies": { + "@types/estree": "*" } }, - "node_modules/@tanstack/react-query": { - "version": "5.90.17", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.17.tgz", - "integrity": "sha512-PGc2u9KLwohDUSchjW9MZqeDQJfJDON7y4W7REdNBgiFKxQy+Pf7eGjiFWEj5xPqKzAeHYdAb62IWI1a9UJyGQ==", + "node_modules/@types/hast": { + "version": "3.0.4", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.90.17" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" + "@types/unist": "*" } }, - "node_modules/@tanstack/react-query-devtools": { - "version": "5.91.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.2.tgz", - "integrity": "sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-devtools": "5.92.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-query": "^5.90.14", - "react": "^18 || ^19" + "node_modules/@types/he": { + "version": "1.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jexl": { + "version": "2.3.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.8", + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" } }, - "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==", + "node_modules/@types/mailparser": { + "version": "3.4.6", + "dev": true, "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" + "@types/node": "*", + "iconv-lite": "^0.6.3" } }, - "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==", + "node_modules/@types/mdast": { + "version": "4.0.4", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "dependencies": { + "@types/unist": "*" } }, - "node_modules/@tediousjs/connection-string": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.6.0.tgz", - "integrity": "sha512-GxlsW354Vi6QqbUgdPyQVcQjI7cZBdGV5vOYVYuCVDTylx2wl3WHR2HlhcxxHTrMigbelpXsdcZso+66uxPfow==", + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true, "license": "MIT" }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } + "node_modules/@types/ms": { + "version": "2.1.0", + "license": "MIT" }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "node_modules/@types/mssql": { + "version": "9.1.8", "dev": true, "license": "MIT", "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "@types/node": "*", + "tarn": "^3.0.1", + "tedious": "*" } }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "node_modules/@types/mustache": { + "version": "4.2.6", "dev": true, "license": "MIT" }, - "node_modules/@testing-library/react": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.1.tgz", - "integrity": "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==", - "dev": true, + "node_modules/@types/node": { + "version": "24.10.1", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "undici-types": "~7.16.0" } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "node_modules/@types/nodemailer": { + "version": "7.0.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "dependencies": { + "@aws-sdk/client-sesv2": "^3.839.0", + "@types/node": "*" } }, - "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==", + "node_modules/@types/pg": { + "version": "8.16.0", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "node_modules/@types/react": { + "version": "19.2.8", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@types/react-datepicker": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-7.0.0.tgz", + "integrity": "sha512-4tWwOUq589tozyQPBVEqGNng5DaZkomx5IVNuur868yYdgjH6RaL373/HKiVt1IDoNNXYiTGspm1F7kjrarM8Q==", + "deprecated": "This is a stub types definition. react-datepicker provides its own type definitions, so you do not need this installed.", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "react-datepicker": "*" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@types/react-dom": { + "version": "19.2.3", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" + "peerDependencies": { + "@types/react": "^19.2.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@types/react-file-icon": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/react-file-icon/-/react-file-icon-1.0.4.tgz", + "integrity": "sha512-c1mIklUDaxm9odxf8RTiy/EAxsblZliJ86EKIOAyuafP9eK3iudyn4ATv53DX6ZvgGymc7IttVNm97LTGnTiYA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@types/react": "*" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, + "node_modules/@types/readable-stream": { + "version": "4.0.23", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@types/node": "*" } }, - "node_modules/@types/base16": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/base16/-/base16-1.0.5.tgz", - "integrity": "sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A==", + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true, "license": "MIT" }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "devOptional": true, + "node_modules/@types/trusted-types": { + "version": "2.0.7", "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } + "optional": true }, - "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==", + "node_modules/@types/unist": { + "version": "3.0.3", "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==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.53.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "*" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.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.53.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { + "version": "8.53.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/d3-color": "*" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" + }, + "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/@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-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "*" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" + "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/@types/dagre": { - "version": "0.7.53", - "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.53.tgz", - "integrity": "sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.53.0", "dev": true, - "license": "MIT" - }, - "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": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/doctrine": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.53.0", "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": "*" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.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/@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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.53.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "*" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.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/@types/he": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", - "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jexl": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/jexl/-/jexl-2.3.4.tgz", - "integrity": "sha512-3BU5DbkPvwqOeW8kZcB9Bvn5bspTFY3Lo0yBS6ephuI8kVSpCjzbGtRPbWnvdbr67tMvXDxiJRcL3fwbz/6+PQ==", - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.53.0", "dev": true, - "license": "MIT" - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "license": "MIT", "dependencies": { - "@types/lodash": "*" + "@typescript-eslint/types": "8.53.0", + "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/@types/mailparser": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/@types/mailparser/-/mailparser-3.4.6.tgz", - "integrity": "sha512-wVV3cnIKzxTffaPH8iRnddX1zahbYB1ZEoAxyhoBo3TBCBuK6nZ8M8JYO/RhsCuuBVOw/DEN/t/ENbruwlxn6Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "iconv-lite": "^0.6.3" + "balanced-match": "^1.0.0" } }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "*" + "engines": { + "node": ">= 4" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "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" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@types/mssql": { - "version": "9.1.8", - "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-9.1.8.tgz", - "integrity": "sha512-mt9h5jWj+DYE5jxnKaWSV/GqDf9FV52XYVk6T3XZF69noEe+JJV6MKirii48l81+cjmAkSq+qeKX+k61fHkYrQ==", + "node_modules/@typescript-eslint/parser": { + "version": "8.53.0", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "tarn": "^3.0.1", - "tedious": "*" + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3" + }, + "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/@types/mustache": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.6.tgz", - "integrity": "sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "version": "8.53.0", "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.8.tgz", - "integrity": "sha512-r0bBaXu5Swb05doFYO2kTWHMovJnNVbCsII0fhesM8bNRlLhXIuckley4a2DaD+vOdmm5G+zGkQZAPZsF80+YQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" + }, + "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/@types/nodemailer": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.5.tgz", - "integrity": "sha512-7WtR4MFJUNN2UFy0NIowBRJswj5KXjXDhlZY43Hmots5eGu5q/dTeFd/I6GgJA/qj3RqO6dDy4SvfcV3fOVeIA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.0", "dev": true, "license": "MIT", "dependencies": { - "@aws-sdk/client-sesv2": "^3.839.0", - "@types/node": "*" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/pg": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", - "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.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/@types/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", - "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "dev": true, "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/react-datepicker": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-7.0.0.tgz", - "integrity": "sha512-4tWwOUq589tozyQPBVEqGNng5DaZkomx5IVNuur868yYdgjH6RaL373/HKiVt1IDoNNXYiTGspm1F7kjrarM8Q==", - "deprecated": "This is a stub types definition. react-datepicker provides its own type definitions, so you do not need this installed.", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.53.0", "dev": true, "license": "MIT", "dependencies": { - "react-datepicker": "*" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, - "license": "MIT", + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { - "@types/react": "^19.2.0" + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@types/react-file-icon": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/react-file-icon/-/react-file-icon-1.0.4.tgz", - "integrity": "sha512-c1mIklUDaxm9odxf8RTiy/EAxsblZliJ86EKIOAyuafP9eK3iudyn4ATv53DX6ZvgGymc7IttVNm97LTGnTiYA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.53.0", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "*" + "@typescript-eslint/types": "8.53.0", + "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/@types/readable-stream": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", - "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "balanced-match": "^1.0.0" } }, - "node_modules/@types/resolve": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@types/striptags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/striptags/-/striptags-3.1.1.tgz", - "integrity": "sha512-t11pzegWB32MpVjCMXD0LoSxsUQESC7CInDtVoEmnPbLWA5hMRSLBa0U/xCOdj6zFQyHlLn0Qmp76kyp/KyfQw==", - "deprecated": "This is a stub types definition for striptags (https://github.com/ericnorris/striptags). striptags provides its own type definitions, so you don't need @types/striptags installed!", + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "striptags": "*" + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "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 <5.9.0" } }, - "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/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/@typescript-eslint/eslint-plugin": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", - "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/type-utils": "8.53.0", - "@typescript-eslint/utils": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10535,35 +8971,33 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.53.0", - "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==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser": { + "node_modules/@typescript-eslint/type-utils": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", - "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", - "debug": "^4.4.3" + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10577,10 +9011,8 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/project-service": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", - "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "license": "MIT", "dependencies": { @@ -10599,10 +9031,8 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", - "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "license": "MIT", "dependencies": { @@ -10617,10 +9047,8 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", - "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, "license": "MIT", "engines": { @@ -10634,17 +9062,31 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "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/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", - "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "engines": { @@ -10655,40 +9097,96 @@ "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": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", - "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.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/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", - "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.0", - "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "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/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "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/types": { + "version": "8.38.0", + "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.38.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10698,13 +9196,11 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.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": { @@ -10713,8 +9209,6 @@ }, "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": { @@ -10728,16 +9222,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", - "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10748,17 +9240,15 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", - "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/types": "8.38.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -10771,8 +9261,6 @@ }, "node_modules/@typespec/ts-http-runtime": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz", - "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==", "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.0", @@ -10785,42 +9273,10 @@ }, "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" ], @@ -10831,233 +9287,6 @@ "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/@vercel/oidc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", @@ -11110,16 +9339,61 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.17", - "vitest": "4.0.17" + "@vitest/browser": "4.0.17", + "vitest": "4.0.17" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { - "@vitest/browser": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/@vitest/coverage-v8/node_modules/@vitest/pretty-format": { + "node_modules/@vitest/pretty-format": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", @@ -11132,855 +9406,968 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/coverage-v8/node_modules/@vitest/utils": { + "node_modules/@vitest/runner": { "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", "dev": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/@vue/compiler-core": { + "version": "3.5.26", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.26", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "node_modules/@vitest/expect/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.26", + "@vue/compiler-dom": "3.5.26", + "@vue/compiler-ssr": "3.5.26", + "@vue/shared": "3.5.26", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.26", + "@vue/shared": "3.5.26" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.26", + "@vue/runtime-core": "3.5.26", + "@vue/shared": "3.5.26", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.26", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.26", + "@vue/shared": "3.5.26" + }, + "peerDependencies": { + "vue": "3.5.26" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.26", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=10.0.0" } }, - "node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "devOptional": true, + "node_modules/@xyflow/react": { + "version": "12.10.0", "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.17", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" + "@xyflow/system": "0.0.74", + "classcat": "^5.0.3", + "zustand": "^4.4.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.74", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/@zone-eu/mailsplit": { + "version": "5.4.8", + "license": "(MIT OR EUPL-1.1+)", + "dependencies": { + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" } }, - "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "devOptional": true, + "node_modules/agent-base": { + "version": "7.1.4", "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">= 14" } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "devOptional": true, - "license": "MIT", + "node_modules/ai": { + "version": "5.0.121", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.121.tgz", + "integrity": "sha512-3iYPdARKGLryC/7OA9RgBUaym1gynvWS7UPy8NwoRNCKP52lshldtHB5xcEfVviw7liWH2zJlW9yEzsDglcIEQ==", + "license": "Apache-2.0", "dependencies": { - "@types/estree": "^1.0.0" + "@ai-sdk/gateway": "2.0.27", + "@ai-sdk/provider": "2.0.1", + "@ai-sdk/provider-utils": "3.0.20", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "node_modules/ajv": { + "version": "6.12.6", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "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": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "devOptional": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.17", - "pathe": "^2.0.3" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "devOptional": true, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "tslib": "^2.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=10" } }, - "node_modules/@vitest/runner/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, - "node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "devOptional": true, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "devOptional": true, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "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://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "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://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "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://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/utils/node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", "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": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz", - "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.26", - "entities": "^7.0.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", - "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", - "license": "BSD-2-Clause", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=0.12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz", - "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.26", - "@vue/shared": "3.5.26" + "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/@vue/compiler-sfc": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", - "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.26", - "@vue/compiler-dom": "3.5.26", - "@vue/compiler-ssr": "3.5.26", - "@vue/shared": "3.5.26", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" + "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/@vue/compiler-ssr": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz", - "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==", - "license": "MIT", + "node_modules/asn1js": { + "version": "3.0.7", + "license": "BSD-3-Clause", "dependencies": { - "@vue/compiler-dom": "3.5.26", - "@vue/shared": "3.5.26" + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz", - "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.26" + "engines": { + "node": ">=12" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz", - "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==", + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.26", - "@vue/shared": "3.5.26" + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz", - "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==", + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.10", + "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.26", - "@vue/runtime-core": "3.5.26", - "@vue/shared": "3.5.26", - "csstype": "^3.2.3" + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz", - "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==", + "node_modules/async-channel": { + "version": "0.2.0", + "license": "ISC" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.26", - "@vue/shared": "3.5.26" - }, - "peerDependencies": { - "vue": "3.5.26" + "engines": { + "node": ">= 0.4" } }, - "node_modules/@vue/shared": { - "version": "3.5.26", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz", - "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==", + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, "license": "MIT" }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "node_modules/atomic-sleep": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.0.0" } }, - "node_modules/@xyflow/react": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.0.tgz", - "integrity": "sha512-eOtz3whDMWrB4KWVatIBrKuxECHqip6PfA8fTpaS2RUGVpiEAe+nqDKsLqkViVWxDGreq0lWX71Xth/SPAzXiw==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { - "@xyflow/system": "0.0.74", - "classcat": "^5.0.3", - "zustand": "^4.4.0" + "possible-typed-array-names": "^1.0.0" }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@xyflow/system": { - "version": "0.0.74", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.74.tgz", - "integrity": "sha512-7v7B/PkiVrkdZzSbL+inGAo6tkR/WQHHG0/jhSvLQToCsfa8YubOGmBYd1s08tpKpihdHDZFwzQZeR69QSBb4Q==", + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-interpolate": "^3.0.4", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-interpolate": "^3.0.1", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@zone-eu/mailsplit": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/@zone-eu/mailsplit/-/mailsplit-5.4.8.tgz", - "integrity": "sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==", - "license": "(MIT OR EUPL-1.1+)", - "dependencies": { - "libbase64": "1.3.0", - "libmime": "5.3.7", - "libqp": "2.1.1" + "node_modules/axe-core": { + "version": "4.11.1", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/axios": { + "version": "1.13.2", + "dev": true, "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/axobject-query": { + "version": "4.1.0", "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" } }, - "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==", - "dev": true, + "node_modules/bail": { + "version": "2.0.2", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "node_modules/balanced-match": { + "version": "1.0.2", "dev": true, + "license": "MIT" + }, + "node_modules/base16": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.6.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==", + "node_modules/base64-js": { + "version": "1.5.1", + "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.14", "license": "Apache-2.0", - "engines": { - "node": ">=0.8" + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/better-auth": { + "version": "1.3.27", "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ai": { - "version": "5.0.121", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.121.tgz", - "integrity": "sha512-3iYPdARKGLryC/7OA9RgBUaym1gynvWS7UPy8NwoRNCKP52lshldtHB5xcEfVviw7liWH2zJlW9yEzsDglcIEQ==", - "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "2.0.27", - "@ai-sdk/provider": "2.0.1", - "@ai-sdk/provider-utils": "3.0.20", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" + "@better-auth/core": "1.3.27", + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.18", + "@noble/ciphers": "^2.0.0", + "@noble/hashes": "^2.0.0", + "@simplewebauthn/browser": "^13.1.2", + "@simplewebauthn/server": "^13.1.2", + "better-call": "1.0.19", + "defu": "^6.1.4", + "jose": "^6.1.0", + "kysely": "^0.28.5", + "nanostores": "^1.0.1", + "zod": "^4.1.5" }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "peerDependenciesMeta": { + "@lynx-js/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "solid-js": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } } }, - "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, + "node_modules/better-auth/node_modules/zod": { + "version": "4.3.5", "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/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/colinhacks" } }, - "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", + "node_modules/better-call": { + "version": "1.0.19", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@better-auth/utils": "^0.3.0", + "@better-fetch/fetch": "^1.1.4", + "rou3": "^0.5.1", + "set-cookie-parser": "^2.7.1", + "uncrypto": "^0.1.3" } }, - "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==", + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, - "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" + "open": "^8.0.4" }, "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "node": ">=12.0.0" } }, - "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==", + "node_modules/better-opn/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "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": ">=8" } }, - "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==", + "node_modules/better-opn/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "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" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/better-opn/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "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" + "is-docker": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "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==", + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "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" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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==", "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" + "require-from-string": "^2.0.2" } }, - "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, + "node_modules/bl": { + "version": "6.1.6", "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" + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" } }, - "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, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.7.0", "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" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "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, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "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/bl/node_modules/string_decoder": { + "version": "1.3.0", "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" + "safe-buffer": "~5.2.0" } }, - "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } + "node_modules/bluebird": { + "version": "3.4.7", + "license": "MIT" }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "devOptional": true, + "node_modules/bowser": { + "version": "2.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "node_modules/braces": { + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "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/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true }, - "node_modules/ast-v8-to-istanbul": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", - "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", + "node_modules/browserslist": { + "version": "4.28.1", "dev": true, + "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": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "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/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/buffer": { + "version": "6.0.3", + "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": { - "@types/estree": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/async-channel/-/async-channel-0.2.0.tgz", - "integrity": "sha512-BJyjI/sfKlyijaBt2hbOSxT28xGNtLR0QLzAKO1Hlnv5BULY7sAoYoTPW3lfr1ZIC7y+FxabxO9T8GXpyoofGg==", - "license": "ISC" + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" }, - "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==", + "node_modules/builtin-modules": { + "version": "5.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "node_modules/bundle-name": { + "version": "4.1.0", "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/call-bind": { + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "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" @@ -11989,925 +10376,828 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "node_modules/call-bound": { + "version": "1.0.4", "dev": true, "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", + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { "node": ">= 0.4" - } - }, - "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" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/callsites": { + "version": "3.1.0", "dev": true, - "license": "MIT" - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", - "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": ">=6" } }, - "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==", + "node_modules/caniuse-lite": { + "version": "1.0.30001764", "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.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", - "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/better-auth": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.4.9.tgz", - "integrity": "sha512-usSdjuyTzZwIvM8fjF8YGhPncxV3MAg3dHUO9uPUnf0yklXUSYISiH1+imk6/Z+UBqsscyyPRnbIyjyK97p7YA==", - "license": "MIT", - "dependencies": { - "@better-auth/core": "1.4.9", - "@better-auth/telemetry": "1.4.9", - "@better-auth/utils": "0.3.0", - "@better-fetch/fetch": "1.1.21", - "@noble/ciphers": "^2.0.0", - "@noble/hashes": "^2.0.0", - "better-call": "1.1.7", - "defu": "^6.1.4", - "jose": "^6.1.0", - "kysely": "^0.28.5", - "nanostores": "^1.0.1", - "zod": "^4.1.12" - }, - "peerDependencies": { - "@lynx-js/react": "*", - "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", - "@sveltejs/kit": "^2.0.0", - "@tanstack/react-start": "^1.0.0", - "better-sqlite3": "^12.0.0", - "drizzle-kit": ">=0.31.4", - "drizzle-orm": ">=0.41.0", - "mongodb": "^6.0.0 || ^7.0.0", - "mysql2": "^3.0.0", - "next": "^14.0.0 || ^15.0.0 || ^16.0.0", - "pg": "^8.0.0", - "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", - "solid-js": "^1.0.0", - "svelte": "^4.0.0 || ^5.0.0", - "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", - "vue": "^3.0.0" - }, - "peerDependenciesMeta": { - "@lynx-js/react": { - "optional": true - }, - "@prisma/client": { - "optional": true - }, - "@sveltejs/kit": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "drizzle-kit": { - "optional": true - }, - "drizzle-orm": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "next": { - "optional": true - }, - "pg": { - "optional": true - }, - "prisma": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "solid-js": { - "optional": true - }, - "svelte": { - "optional": true + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "vitest": { - "optional": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - "vue": { - "optional": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } + ], + "license": "CC-BY-4.0" }, - "node_modules/better-call": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/better-call/-/better-call-1.1.7.tgz", - "integrity": "sha512-6gaJe1bBIEgVebQu/7q9saahVzvBsGaByEnE8aDVncZEDiJO7sdNB28ot9I6iXSbR25egGmmZ6aIURXyQHRraQ==", + "node_modules/ccount": { + "version": "2.0.1", "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "license": "Apache-2.0", "dependencies": { - "@better-auth/utils": "^0.3.0", - "@better-fetch/fetch": "^1.1.4", - "rou3": "^0.7.10", - "set-cookie-parser": "^2.7.1" - }, - "peerDependencies": { - "zod": "^4.0.0" + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "engines": { + "node": ">=0.8" } }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { - "open": "^8.0.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", - "devOptional": true, + "node_modules/change-case": { + "version": "5.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/character-entities": { + "version": "2.0.2", "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bl": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", - "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", + "node_modules/character-entities-html4": { + "version": "2.1.0", "license": "MIT", - "dependencies": { - "@types/readable-stream": "^4.0.0", - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bl/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==", + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, "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": ">= 16" } }, - "node_modules/bl/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==", + "node_modules/ci-info": { + "version": "4.3.1", + "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" + "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT" - }, - "node_modules/bl/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" + "engines": { + "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "license": "MIT" + "node_modules/class-variance-authority": { + "version": "0.7.1", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } }, - "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", - "dev": true, + "node_modules/classcat": { + "version": "5.0.5", "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==", + "node_modules/clean-regexp": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/browser-assert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "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" - } - ], + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror": { + "version": "6.0.2", "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" - }, + "@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/codepage": { + "version": "1.15.0", + "license": "Apache-2.0", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.8" } }, - "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" - } - ], + "node_modules/color": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", - "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", - "dev": true, + "node_modules/color-string": { + "version": "1.9.1", "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", "license": "MIT", "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "color-name": "1.1.3" } }, - "node_modules/call-bind": { + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/combined-stream": { "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" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 0.4" - }, + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", - "dev": true, + "node_modules/commander": { + "version": "8.3.0", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, "engines": { - "node": ">= 0.4" + "node": ">= 12" } }, - "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, + "node_modules/common-tags": { + "version": "1.8.2", "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": ">=4.0.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/concat-map": { + "version": "0.0.1", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/convex": { + "version": "1.29.3", + "license": "Apache-2.0", + "dependencies": { + "esbuild": "0.25.4", + "prettier": "^3.0.0" + }, + "bin": { + "convex": "bin/main.js" + }, "engines": { - "node": ">=6" + "node": ">=18.0.0", + "npm": ">=7.0.0" + }, + "peerDependencies": { + "@auth0/auth0-react": "^2.0.1", + "@clerk/clerk-react": "^4.12.8 || ^5.0.0", + "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@auth0/auth0-react": { + "optional": true + }, + "@clerk/clerk-react": { + "optional": true + }, + "react": { + "optional": true + } } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node_modules/convex-helpers": { + "version": "0.1.105", + "license": "Apache-2.0", + "bin": { + "convex-helpers": "bin.cjs" + }, + "peerDependencies": { + "@standard-schema/spec": "^1.0.0", + "convex": "^1.24.0", + "hono": "^4.0.5", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "typescript": "^5.5", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@standard-schema/spec": { + "optional": true }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "hono": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "react": { + "optional": true + }, + "typescript": { + "optional": true + }, + "zod": { + "optional": true } - ], - "license": "CC-BY-4.0" + } }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "node_modules/convex-test": { + "version": "0.0.40", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "convex": "^1.16.4" + } + }, + "node_modules/convex/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "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" - }, + "node_modules/convex/node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, + "node_modules/convex/node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/convex/node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" } }, - "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, + "node_modules/convex/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/convex/node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/convex/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/convex/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/convex/node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", - "dev": true, + "node_modules/convex/node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 16" + "node": ">=18" } }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } + "node_modules/convex/node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "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/convex/node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", - "license": "MIT" - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, + "node_modules/convex/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "node_modules/convex/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "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/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/convex/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "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==", + "node_modules/convex/node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], "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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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", + "node_modules/convex/node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "node_modules/convex/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "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, + "node_modules/convex/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=7.0.0" + "node": ">=18" } }, - "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-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==", + "node_modules/convex/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/convex/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "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==", - "dev": true, + "node_modules/convex/node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "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==", + "node_modules/convex/node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/convex/node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12" + "node": ">=18" } }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "node_modules/convex/node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4.0.0" + "node": ">=18" } }, - "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/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convex": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/convex/-/convex-1.29.3.tgz", - "integrity": "sha512-tg5TXzMjpNk9m50YRtdp6US+t7ckxE4E+7DNKUCjJ2MupQs2RBSPF/z5SNN4GUmQLSfg0eMILDySzdAvjTrhnw==", - "license": "Apache-2.0", - "dependencies": { - "esbuild": "0.25.4", - "prettier": "^3.0.0" - }, + "node_modules/convex/node_modules/esbuild": { + "version": "0.25.4", + "hasInstallScript": true, + "license": "MIT", "bin": { - "convex": "bin/main.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18.0.0", - "npm": ">=7.0.0" - }, - "peerDependencies": { - "@auth0/auth0-react": "^2.0.1", - "@clerk/clerk-react": "^4.12.8 || ^5.0.0", - "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@auth0/auth0-react": { - "optional": true - }, - "@clerk/clerk-react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/convex-helpers": { - "version": "0.1.105", - "resolved": "https://registry.npmjs.org/convex-helpers/-/convex-helpers-0.1.105.tgz", - "integrity": "sha512-B6EUQsBpLFcXpa1g/9Zsc7EaFHdaeMlPLCa/snSD+4hRBFMWKJjT589dZ/0Z40taBOQWC2tb81ciTNr4ctJb2w==", - "license": "Apache-2.0", - "bin": { - "convex-helpers": "bin.cjs" - }, - "peerDependencies": { - "@standard-schema/spec": "^1.0.0", - "convex": "^1.24.0", - "hono": "^4.0.5", - "react": "^17.0.2 || ^18.0.0 || ^19.0.0", - "typescript": "^5.5", - "zod": "^3.25.0 || ^4.0.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "@standard-schema/spec": { - "optional": true - }, - "hono": { - "optional": true - }, - "react": { - "optional": true - }, - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/convex-test": { - "version": "0.0.40", - "resolved": "https://registry.npmjs.org/convex-test/-/convex-test-0.0.40.tgz", - "integrity": "sha512-BOM4aoXFI6JxA5eb7TIKI/q7c880Jq5OHbbEbmUDmsN82LAxzomYveQDNFlj3a+cN4K7TB3KjpyzNzEjlOPvNg==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "convex": "^1.16.4" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/core-js-compat": { "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", - "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12920,14 +11210,10 @@ }, "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/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" @@ -12938,14 +11224,10 @@ }, "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/cron-parser": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-5.4.0.tgz", - "integrity": "sha512-HxYB8vTvnQFx4dLsZpGRa0uHp6X3qIzS3ZJgJ9v6l/5TJMgeWQbLkR5yiJ5hOxGbc9+jCADDnydIe15ReLZnJA==", "license": "MIT", "dependencies": { "luxon": "^3.7.1" @@ -12956,8 +11238,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -12973,7 +11253,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.12.2", @@ -12994,7 +11274,7 @@ "version": "5.3.7", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@asamuzakjp/css-color": "^4.1.1", @@ -13010,7 +11290,7 @@ "version": "11.2.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "devOptional": true, + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -13018,14 +11298,10 @@ }, "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/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" @@ -13033,8 +11309,6 @@ }, "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" @@ -13042,8 +11316,6 @@ }, "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", @@ -13055,8 +11327,6 @@ }, "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" @@ -13064,8 +11334,6 @@ }, "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" @@ -13076,8 +11344,6 @@ }, "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" @@ -13085,8 +11351,6 @@ }, "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" @@ -13094,8 +11358,6 @@ }, "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", @@ -13113,8 +11375,6 @@ }, "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", @@ -13129,8 +11389,6 @@ }, "node_modules/dagre": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", "license": "MIT", "dependencies": { "graphlib": "^2.1.8", @@ -13139,8 +11397,6 @@ }, "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" }, @@ -13148,7 +11404,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", @@ -13160,8 +11416,6 @@ }, "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": { @@ -13178,8 +11432,6 @@ }, "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": { @@ -13196,8 +11448,6 @@ }, "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": { @@ -13212,39 +11462,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, "node_modules/date-fns-jalali": { "version": "4.1.0-0", - "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-4.1.0-0.tgz", - "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", "license": "MIT" }, "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/debounce": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", "dev": true, "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" @@ -13260,14 +11492,10 @@ }, "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/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" @@ -13289,15 +11517,11 @@ }, "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/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13305,8 +11529,6 @@ }, "node_modules/default-browser": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -13321,8 +11543,6 @@ }, "node_modules/default-browser-id": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "license": "MIT", "engines": { "node": ">=18" @@ -13333,8 +11553,6 @@ }, "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": { @@ -13350,19 +11568,17 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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": { @@ -13379,14 +11595,10 @@ }, "node_modules/defu": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { @@ -13395,8 +11607,6 @@ }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "license": "Apache-2.0", "engines": { "node": ">=0.10" @@ -13404,8 +11614,6 @@ }, "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" @@ -13413,8 +11621,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" @@ -13422,14 +11628,10 @@ }, "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" @@ -13441,14 +11643,10 @@ }, "node_modules/dingbat-to-unicode": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz", - "integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==", "license": "BSD-2-Clause" }, "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": { @@ -13467,8 +11665,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -13481,8 +11677,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -13493,8 +11687,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -13508,8 +11700,6 @@ }, "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" @@ -13517,8 +11707,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -13531,8 +11719,6 @@ }, "node_modules/duck": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/duck/-/duck-0.1.12.tgz", - "integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==", "license": "BSD", "dependencies": { "underscore": "^1.13.1" @@ -13540,8 +11726,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -13555,8 +11739,6 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, @@ -13569,8 +11751,6 @@ }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -13578,22 +11758,16 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, "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/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": { @@ -13602,8 +11776,6 @@ }, "node_modules/encoding-japanese": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.2.0.tgz", - "integrity": "sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==", "license": "MIT", "engines": { "node": ">=8.10.0" @@ -13611,8 +11783,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -13624,8 +11794,6 @@ }, "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" @@ -13636,8 +11804,6 @@ }, "node_modules/es-abstract": { "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -13705,8 +11871,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -13715,8 +11879,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -13725,8 +11887,6 @@ }, "node_modules/es-iterator-helpers": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { @@ -13753,15 +11913,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "devOptional": true, + "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -13773,8 +11929,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -13789,8 +11943,6 @@ }, "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": { @@ -13802,8 +11954,6 @@ }, "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": { @@ -13818,46 +11968,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, "node_modules/esbuild-register": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", @@ -13873,8 +11983,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -13883,8 +11991,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==", "dev": true, "license": "MIT", "engines": { @@ -13896,8 +12002,6 @@ }, "node_modules/eslint": { "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -13956,8 +12060,6 @@ }, "node_modules/eslint-config-next": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.1.tgz", - "integrity": "sha512-55nTpVWm3qeuxoQKLOjQVciKZJUphKrNM0fCcQHAIOGl6VFXgaqeMfv0aKJhs7QtcnlAPhNVqsqRfRjeKBPIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -13983,8 +12085,6 @@ }, "node_modules/eslint-config-next/node_modules/globals": { "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -13996,8 +12096,6 @@ }, "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": { @@ -14008,8 +12106,6 @@ }, "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": { @@ -14018,8 +12114,6 @@ }, "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": { @@ -14053,8 +12147,6 @@ }, "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": { @@ -14071,8 +12163,6 @@ }, "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": { @@ -14081,8 +12171,6 @@ }, "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": { @@ -14115,54 +12203,22 @@ }, "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/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/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-import/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/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": { @@ -14189,20 +12245,8 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-jsx-a11y/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/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": { @@ -14234,8 +12278,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", "dependencies": { @@ -14254,8 +12296,6 @@ }, "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": { @@ -14272,8 +12312,6 @@ }, "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": { @@ -14282,8 +12320,6 @@ }, "node_modules/eslint-plugin-unicorn": { "version": "62.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz", - "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==", "dev": true, "license": "MIT", "dependencies": { @@ -14318,8 +12354,6 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -14331,8 +12365,6 @@ }, "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": { @@ -14348,8 +12380,6 @@ }, "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": { @@ -14361,8 +12391,6 @@ }, "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": { @@ -14393,8 +12421,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14406,8 +12432,6 @@ }, "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": { @@ -14419,8 +12443,6 @@ }, "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": { @@ -14429,8 +12451,6 @@ }, "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", @@ -14438,15 +12458,15 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "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": { @@ -14455,8 +12475,6 @@ }, "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" @@ -14464,8 +12482,6 @@ }, "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" @@ -14473,8 +12489,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -14482,9 +12496,7 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.0.0" @@ -14492,21 +12504,15 @@ }, "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/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==", "dev": true, "license": "MIT" }, "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==", + "version": "3.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -14514,7 +12520,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -14522,8 +12528,6 @@ }, "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": { @@ -14535,22 +12539,16 @@ }, "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-xml-parser": { "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", "dev": true, "funding": [ { @@ -14568,8 +12566,6 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -14578,9 +12574,7 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -14596,8 +12590,6 @@ }, "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": { @@ -14609,8 +12601,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -14622,8 +12612,6 @@ }, "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": { @@ -14639,8 +12627,6 @@ }, "node_modules/find-up-simple": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", "engines": { @@ -14652,8 +12638,6 @@ }, "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": { @@ -14666,15 +12650,11 @@ }, "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==", "dev": true, "funding": [ { @@ -14694,8 +12674,6 @@ }, "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": { @@ -14727,8 +12705,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -14744,8 +12720,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" @@ -14780,9 +12754,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14794,8 +12766,6 @@ }, "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==", "dev": true, "license": "MIT", "funding": { @@ -14804,8 +12774,6 @@ }, "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": { @@ -14825,8 +12793,6 @@ }, "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": { @@ -14835,8 +12801,6 @@ }, "node_modules/fuse.js": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", "license": "Apache-2.0", "engines": { "node": ">=10" @@ -14844,8 +12808,6 @@ }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "license": "MIT", "dependencies": { "is-property": "^1.0.2" @@ -14853,8 +12815,6 @@ }, "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": { @@ -14863,8 +12823,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -14873,8 +12831,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -14898,8 +12854,6 @@ }, "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" @@ -14907,8 +12861,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==", "dev": true, "license": "MIT", "dependencies": { @@ -14921,8 +12873,6 @@ }, "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": { @@ -14939,8 +12889,6 @@ }, "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": { @@ -14973,8 +12921,6 @@ }, "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": { @@ -15012,8 +12958,6 @@ }, "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": { @@ -15025,8 +12969,6 @@ }, "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": { @@ -15042,15 +12984,11 @@ }, "node_modules/globrex": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true, "license": "MIT" }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -15062,14 +13000,10 @@ }, "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/graphlib": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", "license": "MIT", "dependencies": { "lodash": "^4.17.15" @@ -15077,8 +13011,6 @@ }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -15093,8 +13025,6 @@ }, "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": { @@ -15106,8 +13036,6 @@ }, "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": { @@ -15116,8 +13044,6 @@ }, "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": { @@ -15129,8 +13055,6 @@ }, "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": { @@ -15145,8 +13069,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -15158,8 +13080,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -15174,8 +13094,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15187,8 +13105,6 @@ }, "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", @@ -15207,8 +13123,6 @@ }, "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" @@ -15220,8 +13134,6 @@ }, "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", @@ -15243,34 +13155,8 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-raw/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/hast-util-raw/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/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", @@ -15296,8 +13182,6 @@ }, "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", @@ -15315,8 +13199,6 @@ }, "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" @@ -15328,8 +13210,6 @@ }, "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", @@ -15345,8 +13225,6 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "license": "MIT", "bin": { "he": "bin/he" @@ -15354,15 +13232,11 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { @@ -15373,7 +13247,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@exodus/bytes": "^1.6.0" @@ -15384,15 +13258,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/html-to-text": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", "license": "MIT", "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", @@ -15407,8 +13277,6 @@ }, "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", @@ -15417,8 +13285,6 @@ }, "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", @@ -15427,8 +13293,6 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -15446,8 +13310,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -15459,8 +13321,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -15472,8 +13332,6 @@ }, "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" @@ -15484,8 +13342,6 @@ }, "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", @@ -15504,8 +13360,6 @@ }, "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": { @@ -15531,8 +13385,6 @@ }, "node_modules/imapflow/node_modules/iconv-lite": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -15547,14 +13399,10 @@ }, "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/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15570,8 +13418,6 @@ }, "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": { @@ -15580,8 +13426,6 @@ }, "node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { @@ -15593,20 +13437,14 @@ }, "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/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/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": { @@ -15620,8 +13458,6 @@ }, "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", @@ -15632,8 +13468,6 @@ }, "node_modules/ip-address": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "license": "MIT", "engines": { "node": ">= 12" @@ -15641,8 +13475,6 @@ }, "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", @@ -15651,8 +13483,6 @@ }, "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", @@ -15682,8 +13512,6 @@ }, "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": { @@ -15700,14 +13528,10 @@ }, "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/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": { @@ -15726,8 +13550,6 @@ }, "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": { @@ -15742,8 +13564,6 @@ }, "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": { @@ -15759,8 +13579,6 @@ }, "node_modules/is-builtin-module": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", - "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { @@ -15775,8 +13593,6 @@ }, "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": { @@ -15785,8 +13601,6 @@ }, "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": { @@ -15798,8 +13612,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -15814,8 +13626,6 @@ }, "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": { @@ -15832,8 +13642,6 @@ }, "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": { @@ -15849,8 +13657,6 @@ }, "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", @@ -15858,16 +13664,13 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, + "version": "3.0.0", "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15875,8 +13678,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15884,8 +13685,6 @@ }, "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": { @@ -15910,8 +13709,6 @@ }, "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": { @@ -15930,8 +13727,6 @@ }, "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==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -15942,8 +13737,6 @@ }, "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", @@ -15952,8 +13745,6 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -15968,25 +13759,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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": { @@ -15998,8 +13772,6 @@ }, "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": { @@ -16011,8 +13783,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -16021,8 +13791,6 @@ }, "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": { @@ -16038,8 +13806,6 @@ }, "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" @@ -16050,8 +13816,6 @@ }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "license": "MIT", "engines": { @@ -16062,19 +13826,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "license": "MIT" }, "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": { @@ -16092,8 +13852,6 @@ }, "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": { @@ -16105,8 +13863,6 @@ }, "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": { @@ -16121,8 +13877,6 @@ }, "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": { @@ -16138,8 +13892,6 @@ }, "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": { @@ -16156,8 +13908,6 @@ }, "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": { @@ -16172,8 +13922,6 @@ }, "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": { @@ -16185,8 +13933,6 @@ }, "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": { @@ -16201,8 +13947,6 @@ }, "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": { @@ -16217,35 +13961,29 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, + "version": "3.1.0", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -16254,8 +13992,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16269,8 +14005,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16283,8 +14017,6 @@ }, "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": { @@ -16317,8 +14049,6 @@ }, "node_modules/jexl": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jexl/-/jexl-2.3.0.tgz", - "integrity": "sha512-ecqln4kTWNkMwbFvTukOMDq1jy1GcPzvshhMp/s4pxU86xdLDq7HbDRa87DfMfbSAOS8V6EwvCdfs0S+w/iycA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.2" @@ -16326,8 +14056,6 @@ }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -16335,8 +14063,6 @@ }, "node_modules/joi": { "version": "18.0.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.2.tgz", - "integrity": "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16354,8 +14080,6 @@ }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -16363,20 +14087,15 @@ }, "node_modules/js-md4": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", - "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", "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==", + "version": "9.0.1", + "dev": true, "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": { @@ -16400,7 +14119,7 @@ "version": "27.4.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@acemir/cssom": "^0.9.28", @@ -16436,10 +14155,56 @@ } } }, + "node_modules/jsdom/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "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/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -16451,35 +14216,25 @@ }, "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-schema": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, "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/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==", "dev": true, "license": "MIT", "bin": { @@ -16491,8 +14246,6 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", "license": "MIT", "dependencies": { "jws": "^4.0.1", @@ -16513,8 +14266,6 @@ }, "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": { @@ -16529,8 +14280,6 @@ }, "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", @@ -16541,8 +14290,6 @@ }, "node_modules/jwa": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -16552,8 +14299,6 @@ }, "node_modules/jws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { "jwa": "^2.0.1", @@ -16562,8 +14307,6 @@ }, "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" @@ -16578,8 +14321,6 @@ }, "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": { @@ -16588,8 +14329,6 @@ }, "node_modules/kysely": { "version": "0.28.9", - "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.28.9.tgz", - "integrity": "sha512-3BeXMoiOhpOwu62CiVpO6lxfq4eS6KMYfQdMsN/2kUCRNuF2YiEr7u0HLHaQU+O4Xu8YXE3bHVkwaQ85i72EuA==", "license": "MIT", "engines": { "node": ">=20.0.0" @@ -16597,15 +14336,11 @@ }, "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": { @@ -16617,8 +14352,6 @@ }, "node_modules/leac": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", "license": "MIT", "funding": { "url": "https://ko-fi.com/killymxi" @@ -16626,8 +14359,6 @@ }, "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": { @@ -16640,14 +14371,10 @@ }, "node_modules/libbase64": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.3.0.tgz", - "integrity": "sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==", "license": "MIT" }, "node_modules/libmime": { "version": "5.3.7", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.3.7.tgz", - "integrity": "sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==", "license": "MIT", "dependencies": { "encoding-japanese": "2.2.0", @@ -16658,14 +14385,10 @@ }, "node_modules/libqp": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.1.1.tgz", - "integrity": "sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==", "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" @@ -16673,8 +14396,6 @@ }, "node_modules/lightningcss": { "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -16722,8 +14443,6 @@ }, "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" ], @@ -16922,8 +14641,6 @@ }, "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" @@ -16931,8 +14648,6 @@ }, "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": { @@ -16947,81 +14662,55 @@ }, "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.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", "license": "MIT" }, "node_modules/lodash.curry": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "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==", "dev": true, "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, "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", @@ -17030,8 +14719,6 @@ }, "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" @@ -17040,10 +14727,12 @@ "loose-envify": "cli.js" } }, + "node_modules/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, "node_modules/lop": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/lop/-/lop-0.4.2.tgz", - "integrity": "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==", "license": "BSD-2-Clause", "dependencies": { "duck": "^0.1.12", @@ -17060,8 +14749,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -17070,8 +14757,6 @@ }, "node_modules/lru.min": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz", - "integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==", "license": "MIT", "engines": { "bun": ">=1.0.0", @@ -17085,8 +14770,6 @@ }, "node_modules/lucide-react": { "version": "0.562.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", - "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -17094,8 +14777,6 @@ }, "node_modules/luxon": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "engines": { "node": ">=12" @@ -17113,8 +14794,6 @@ }, "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==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -17122,8 +14801,6 @@ }, "node_modules/magicast": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", "dependencies": { @@ -17134,8 +14811,6 @@ }, "node_modules/mailparser": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.9.1.tgz", - "integrity": "sha512-6vHZcco3fWsDMkf4Vz9iAfxvwrKNGbHx0dV1RKVphQ/zaNY34Buc7D37LSa09jeSeybWzYcTPjhiZFxzVRJedA==", "license": "MIT", "dependencies": { "@zone-eu/mailsplit": "5.4.8", @@ -17152,8 +14827,6 @@ }, "node_modules/mailparser/node_modules/iconv-lite": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -17168,8 +14841,6 @@ }, "node_modules/mailparser/node_modules/nodemailer": { "version": "7.0.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.11.tgz", - "integrity": "sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -17177,8 +14848,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -17193,8 +14862,6 @@ }, "node_modules/mammoth": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.11.0.tgz", - "integrity": "sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==", "license": "BSD-2-Clause", "dependencies": { "@xmldom/xmldom": "^0.8.6", @@ -17217,8 +14884,6 @@ }, "node_modules/mammoth/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -17226,8 +14891,6 @@ }, "node_modules/mammoth/node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/map-or-similar": { @@ -17239,8 +14902,6 @@ }, "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", @@ -17249,8 +14910,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -17259,8 +14918,6 @@ }, "node_modules/mdast-util-definitions": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", - "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -17274,8 +14931,6 @@ }, "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", @@ -17290,8 +14945,6 @@ }, "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" @@ -17302,8 +14955,6 @@ }, "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", @@ -17326,8 +14977,6 @@ }, "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", @@ -17345,8 +14994,6 @@ }, "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", @@ -17362,8 +15009,6 @@ }, "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", @@ -17379,8 +15024,6 @@ }, "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", @@ -17394,8 +15037,6 @@ }, "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", @@ -17411,8 +15052,6 @@ }, "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", @@ -17427,8 +15066,6 @@ }, "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", @@ -17446,8 +15083,6 @@ }, "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", @@ -17464,8 +15099,6 @@ }, "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", @@ -17488,8 +15121,6 @@ }, "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", @@ -17506,8 +15137,6 @@ }, "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", @@ -17520,8 +15149,6 @@ }, "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", @@ -17541,8 +15168,6 @@ }, "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", @@ -17562,8 +15187,6 @@ }, "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" @@ -17577,7 +15200,7 @@ "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "devOptional": true, + "dev": true, "license": "CC0-1.0" }, "node_modules/memoizerific": { @@ -17592,8 +15215,6 @@ }, "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": { @@ -17602,8 +15223,6 @@ }, "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", @@ -17637,8 +15256,6 @@ }, "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", @@ -17671,8 +15288,6 @@ }, "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", @@ -17691,8 +15306,6 @@ }, "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", @@ -17707,8 +15320,6 @@ }, "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", @@ -17727,8 +15338,6 @@ }, "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", @@ -17745,8 +15354,6 @@ }, "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", @@ -17762,8 +15369,6 @@ }, "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" @@ -17775,8 +15380,6 @@ }, "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", @@ -17792,8 +15395,6 @@ }, "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", @@ -17811,8 +15412,6 @@ }, "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", @@ -17832,8 +15431,6 @@ }, "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", @@ -17854,8 +15451,6 @@ }, "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", @@ -17874,8 +15469,6 @@ }, "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", @@ -17896,8 +15489,6 @@ }, "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", @@ -17918,8 +15509,6 @@ }, "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", @@ -17938,8 +15527,6 @@ }, "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", @@ -17957,8 +15544,6 @@ }, "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", @@ -17978,8 +15563,6 @@ }, "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", @@ -17998,8 +15581,6 @@ }, "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", @@ -18017,8 +15598,6 @@ }, "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", @@ -18039,8 +15618,6 @@ }, "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", @@ -18055,8 +15632,6 @@ }, "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", @@ -18071,8 +15646,6 @@ }, "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", @@ -18090,8 +15663,6 @@ }, "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", @@ -18109,8 +15680,6 @@ }, "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", @@ -18130,8 +15699,6 @@ }, "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", @@ -18152,8 +15719,6 @@ }, "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", @@ -18168,8 +15733,6 @@ }, "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", @@ -18184,8 +15747,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -18198,8 +15759,6 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -18211,8 +15770,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==", "dev": true, "license": "MIT", "engines": { @@ -18221,8 +15778,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==", "dev": true, "license": "MIT", "dependencies": { @@ -18244,8 +15799,6 @@ }, "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": { @@ -18257,8 +15810,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -18286,14 +15837,10 @@ }, "node_modules/motion-utils": { "version": "12.24.10", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.24.10.tgz", - "integrity": "sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==", "license": "MIT" }, "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", "engines": { @@ -18302,14 +15849,10 @@ }, "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/mssql": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-12.2.0.tgz", - "integrity": "sha512-lwwLHAqcWOz8okjboQpIEp5OghUFGJhuuQZS3+WF1ZXbaEaCEGKOfiQET3w/5Xz0tyZfDNCQVCm9wp5GwXut6g==", "license": "MIT", "dependencies": { "@tediousjs/connection-string": "^0.6.0", @@ -18327,8 +15870,6 @@ }, "node_modules/mssql/node_modules/commander": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "license": "MIT", "engines": { "node": ">=16" @@ -18336,8 +15877,6 @@ }, "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" @@ -18345,8 +15884,6 @@ }, "node_modules/mysql2": { "version": "3.16.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.16.0.tgz", - "integrity": "sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA==", "license": "MIT", "dependencies": { "aws-ssl-profiles": "^1.1.1", @@ -18365,8 +15902,6 @@ }, "node_modules/mysql2/node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -18381,8 +15916,6 @@ }, "node_modules/named-placeholders": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", "license": "MIT", "dependencies": { "lru.min": "^1.1.0" @@ -18392,9 +15925,7 @@ } }, "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "version": "3.3.11", "funding": [ { "type": "github", @@ -18403,16 +15934,14 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^18 || >=20" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/nanostores": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-1.1.0.tgz", - "integrity": "sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==", "funding": [ { "type": "github", @@ -18426,8 +15955,6 @@ }, "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": { @@ -18442,21 +15969,15 @@ }, "node_modules/native-duplexpair": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", "license": "MIT" }, "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/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" @@ -18464,8 +15985,6 @@ }, "node_modules/next": { "version": "16.1.1", - "resolved": "https://registry.npmjs.org/next/-/next-16.1.1.tgz", - "integrity": "sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==", "license": "MIT", "dependencies": { "@next/env": "16.1.1", @@ -18517,8 +16036,6 @@ }, "node_modules/next-intl": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.7.0.tgz", - "integrity": "sha512-gvROzcNr/HM0jTzQlKWQxUNk8jrZ0bREz+bht3wNbv+uzlZ5Kn3J+m+viosub18QJ72S08UJnVK50PXWcUvwpQ==", "funding": [ { "type": "individual", @@ -18548,80 +16065,18 @@ }, "node_modules/next-intl-swc-plugin-extractor": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/next-intl-swc-plugin-extractor/-/next-intl-swc-plugin-extractor-4.7.0.tgz", - "integrity": "sha512-iAqflu2FWdQMWhwB0B2z52X7LmEpvnMNJXqVERZQ7bK5p9iqQLu70ur6Ka6NfiXLxfb+AeAkUX5qIciQOg+87A==", "license": "MIT" }, - "node_modules/next-intl/node_modules/@swc/core": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.8.tgz", - "integrity": "sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==", - "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.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" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, "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/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/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", @@ -18648,21 +16103,15 @@ }, "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-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==", "dev": true, "license": "MIT" }, "node_modules/nodemailer": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.12.tgz", - "integrity": "sha512-H+rnK5bX2Pi/6ms3sN4/jRQvYSMltV6vqup/0SFOrxYYY/qoNvhXPlYq3e+Pm9RFJRwrMGbMIwi81M4dxpomhA==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -18670,8 +16119,6 @@ }, "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" @@ -18679,8 +16126,6 @@ }, "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": { @@ -18692,8 +16137,6 @@ }, "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": { @@ -18702,8 +16145,6 @@ }, "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": { @@ -18723,8 +16164,6 @@ }, "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": { @@ -18739,8 +16178,6 @@ }, "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": { @@ -18758,8 +16195,6 @@ }, "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": { @@ -18773,8 +16208,6 @@ }, "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": { @@ -18792,9 +16225,7 @@ }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "devOptional": true, + "dev": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -18803,26 +16234,22 @@ }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, + "version": "10.2.0", "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18830,8 +16257,6 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, "license": "(WTFPL OR MIT)", "bin": { @@ -18840,14 +16265,10 @@ }, "node_modules/option": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz", - "integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==", "license": "BSD-2-Clause" }, "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": { @@ -18864,14 +16285,10 @@ }, "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": { @@ -18888,8 +16305,6 @@ }, "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": { @@ -18904,8 +16319,6 @@ }, "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": { @@ -18927,14 +16340,10 @@ }, "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/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==", "dev": true, "license": "MIT", "dependencies": { @@ -18946,8 +16355,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", @@ -18965,15 +16372,10 @@ }, "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/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "devOptional": true, + "version": "7.3.0", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -18984,9 +16386,6 @@ }, "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==", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -18997,8 +16396,6 @@ }, "node_modules/parseley": { "version": "0.12.1", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", "license": "MIT", "dependencies": { "leac": "^0.6.0", @@ -19010,8 +16407,6 @@ }, "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": { @@ -19020,8 +16415,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19029,8 +16422,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -19039,8 +16430,6 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -19072,7 +16461,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/pathval": { @@ -19087,8 +16476,6 @@ }, "node_modules/pdfjs-dist": { "version": "5.4.530", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.530.tgz", - "integrity": "sha512-r1hWsSIGGmyYUAHR26zSXkxYWLXLMd6AwqcaFYG9YUZ0GBf5GvcjJSeo512tabM4GYFhxhl5pMCmPr7Q72Rq2Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -19100,8 +16487,6 @@ }, "node_modules/peberminta": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", "license": "MIT", "funding": { "url": "https://ko-fi.com/killymxi" @@ -19109,8 +16494,6 @@ }, "node_modules/pg": { "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", "dependencies": { "pg-connection-string": "^2.9.1", @@ -19136,21 +16519,15 @@ }, "node_modules/pg-cloudflare": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "license": "ISC", "engines": { "node": ">=4.0.0" @@ -19158,8 +16535,6 @@ }, "node_modules/pg-pool": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" @@ -19167,14 +16542,10 @@ }, "node_modules/pg-protocol": { "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "license": "MIT", "dependencies": { "pg-int8": "1.0.1", @@ -19189,8 +16560,6 @@ }, "node_modules/pgpass": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "license": "MIT", "dependencies": { "split2": "^4.1.0" @@ -19198,14 +16567,10 @@ }, "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": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -19216,8 +16581,6 @@ }, "node_modules/pino": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.1.0.tgz", - "integrity": "sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", @@ -19238,23 +16601,17 @@ }, "node_modules/pino-abstract-transport": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "license": "MIT", "dependencies": { "split2": "^4.0.0" } }, "node_modules/pino-std-serializers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "version": "7.0.0", "license": "MIT" }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { @@ -19263,8 +16620,6 @@ }, "node_modules/po-parser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/po-parser/-/po-parser-2.1.1.tgz", - "integrity": "sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==", "license": "MIT" }, "node_modules/polished": { @@ -19282,8 +16637,6 @@ }, "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": { @@ -19292,8 +16645,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -19318,28 +16669,8 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss/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/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "license": "MIT", "engines": { "node": ">=4" @@ -19347,8 +16678,6 @@ }, "node_modules/postgres-bytea": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19356,8 +16685,6 @@ }, "node_modules/postgres-date": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19365,8 +16692,6 @@ }, "node_modules/postgres-interval": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "license": "MIT", "dependencies": { "xtend": "^4.0.0" @@ -19377,8 +16702,6 @@ }, "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": { @@ -19387,8 +16710,6 @@ }, "node_modules/prettier": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -19428,10 +16749,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, "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" @@ -19439,14 +16765,10 @@ }, "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/process-warning": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -19461,8 +16783,6 @@ }, "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", @@ -19470,16 +16790,8 @@ "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", @@ -19488,8 +16800,6 @@ }, "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" @@ -19497,8 +16807,6 @@ }, "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", @@ -19508,8 +16816,6 @@ }, "node_modules/prosemirror-drop-indicator": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/prosemirror-drop-indicator/-/prosemirror-drop-indicator-0.1.3.tgz", - "integrity": "sha512-fJV6G2tHIVXZLUuc60fS9ly1/GuGOlAZUm67S1El+kGFUYh27Hyv6hcGx3rrJ+Q/JZL5jnyAibIZYYWpPqE45g==", "license": "MIT", "dependencies": { "@ocavue/utils": "^1.0.0", @@ -19523,8 +16829,6 @@ }, "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", @@ -19534,8 +16838,6 @@ }, "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", @@ -19546,8 +16848,6 @@ }, "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", @@ -19558,8 +16858,6 @@ }, "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", @@ -19568,8 +16866,6 @@ }, "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", @@ -19578,8 +16874,6 @@ }, "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" @@ -19587,8 +16881,6 @@ }, "node_modules/prosemirror-safari-ime-span": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/prosemirror-safari-ime-span/-/prosemirror-safari-ime-span-1.0.2.tgz", - "integrity": "sha512-QJqD8s1zE/CuK56kDsUhndh5hiHh/gFnAuPOA9ytva2s85/ZEt2tNWeALTJN48DtWghSKOmiBsvVn2OlnJ5H2w==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.4.3", @@ -19600,8 +16892,6 @@ }, "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", @@ -19611,8 +16901,6 @@ }, "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", @@ -19622,8 +16910,6 @@ }, "node_modules/prosemirror-tables": { "version": "1.8.5", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", - "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.2.3", @@ -19635,8 +16921,6 @@ }, "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" @@ -19644,8 +16928,6 @@ }, "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", @@ -19655,8 +16937,6 @@ }, "node_modules/prosemirror-virtual-cursor": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/prosemirror-virtual-cursor/-/prosemirror-virtual-cursor-0.4.2.tgz", - "integrity": "sha512-pUMKnIuOhhnMcgIJUjhIQTVJruBEGxfMBVQSrK0g2qhGPDm1i12KdsVaFw15dYk+29tZcxjMeR7P5VDKwmbwJg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ocavue" @@ -19680,16 +16960,12 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -19697,8 +16973,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" @@ -19706,8 +16980,6 @@ }, "node_modules/pvtsutils": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "license": "MIT", "dependencies": { "tslib": "^2.8.1" @@ -19715,8 +16987,6 @@ }, "node_modules/pvutils": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -19724,8 +16994,6 @@ }, "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": [ { @@ -19745,14 +17013,10 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "node_modules/react": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19760,8 +17024,6 @@ }, "node_modules/react-base16-styling": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", - "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", @@ -19775,8 +17037,6 @@ }, "node_modules/react-datepicker": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-9.1.0.tgz", - "integrity": "sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.15", @@ -19794,10 +17054,33 @@ } } }, + "node_modules/react-datepicker/node_modules/@floating-ui/react": { + "version": "0.27.16", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/react-datepicker/node_modules/date-fns": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/react-datepicker/node_modules/tabbable": { + "version": "6.4.0", + "license": "MIT" + }, "node_modules/react-day-picker": { "version": "9.13.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-9.13.0.tgz", - "integrity": "sha512-euzj5Hlq+lOHqI53NiuNhCP8HWgsPf/bBAVijR50hNaY1XwjKjShAnIe8jm8RD2W9IJUvihDIZ+KrmqfFzNhFQ==", "license": "MIT", "dependencies": { "@date-fns/tz": "^1.4.1", @@ -19815,6 +17098,14 @@ "react": ">=16.8.0" } }, + "node_modules/react-day-picker/node_modules/date-fns": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/react-docgen": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz", @@ -19862,8 +17153,6 @@ }, "node_modules/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -19887,9 +17176,7 @@ } }, "node_modules/react-hook-form": { - "version": "7.71.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", - "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", + "version": "7.71.0", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -19903,22 +17190,15 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, + "version": "16.13.1", "license": "MIT" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", "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", @@ -19954,8 +17234,6 @@ }, "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", @@ -19979,8 +17257,6 @@ }, "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", @@ -20001,8 +17277,6 @@ }, "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", @@ -20023,8 +17297,6 @@ }, "node_modules/react-textarea-autosize": { "version": "8.5.9", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", - "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -20040,8 +17312,6 @@ }, "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", @@ -20055,8 +17325,6 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -20118,14 +17386,10 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.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": { @@ -20147,8 +17411,6 @@ }, "node_modules/regexp-tree": { "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, "license": "MIT", "bin": { @@ -20157,8 +17419,6 @@ }, "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": { @@ -20178,8 +17438,6 @@ }, "node_modules/regjsparser": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -20191,8 +17449,6 @@ }, "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", @@ -20206,8 +17462,6 @@ }, "node_modules/remark": { "version": "15.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", - "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -20222,8 +17476,6 @@ }, "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", @@ -20240,8 +17492,6 @@ }, "node_modules/remark-inline-links": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/remark-inline-links/-/remark-inline-links-7.0.0.tgz", - "integrity": "sha512-4uj1pPM+F495ySZhTIB6ay2oSkTsKgmYaKk/q5HIdhX2fuyLEegpjWa0VdJRJ01sgOqAFo7MBKdDUejIYBMVMQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -20255,8 +17505,6 @@ }, "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", @@ -20271,8 +17519,6 @@ }, "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", @@ -20287,8 +17533,6 @@ }, "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", @@ -20304,8 +17548,6 @@ }, "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", @@ -20318,9 +17560,7 @@ } }, "node_modules/remeda": { - "version": "2.33.2", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.2.tgz", - "integrity": "sha512-YIYR4GqG5PYn2OGxi7aUnKkdKQRE4cQ2IQw1cJFn5Ne8sqC5Jusb3nuYKONWnnSz3+4CrOWqJkWfSrUfFfoZWw==", + "version": "2.33.1", "license": "MIT", "funding": { "url": "https://github.com/sponsors/remeda" @@ -20330,7 +17570,7 @@ "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==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -20338,8 +17578,6 @@ }, "node_modules/resolve": { "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20359,8 +17597,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -20369,8 +17605,6 @@ }, "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": { @@ -20379,8 +17613,6 @@ }, "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": { @@ -20390,9 +17622,7 @@ }, "node_modules/rollup": { "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -20435,20 +17665,14 @@ }, "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/rou3": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.7.12.tgz", - "integrity": "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==", + "version": "0.5.1", "license": "MIT" }, "node_modules/run-applescript": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "license": "MIT", "engines": { "node": ">=18" @@ -20459,8 +17683,6 @@ }, "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": [ { @@ -20483,8 +17705,6 @@ }, "node_modules/rxjs": { "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20493,8 +17713,6 @@ }, "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": { @@ -20513,21 +17731,15 @@ }, "node_modules/safe-array-concat/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/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/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": { @@ -20543,15 +17755,11 @@ }, "node_modules/safe-push-apply/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/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": { @@ -20568,8 +17776,6 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -20577,15 +17783,13 @@ }, "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/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" @@ -20596,14 +17800,10 @@ }, "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/selderee": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", "license": "MIT", "dependencies": { "parseley": "^0.12.0" @@ -20614,8 +17814,6 @@ }, "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" @@ -20625,20 +17823,14 @@ } }, "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + "version": "0.0.5" }, "node_modules/set-cookie-parser": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "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": { @@ -20655,8 +17847,6 @@ }, "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": { @@ -20671,8 +17861,6 @@ }, "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": { @@ -20686,14 +17874,10 @@ }, "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/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, @@ -20737,8 +17921,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -20750,8 +17932,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -20760,8 +17940,6 @@ }, "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": { @@ -20780,8 +17958,6 @@ }, "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": { @@ -20797,8 +17973,6 @@ }, "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": { @@ -20816,8 +17990,6 @@ }, "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": { @@ -20836,9 +18008,7 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/signal-exit": { @@ -20856,8 +18026,6 @@ }, "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" @@ -20865,8 +18033,6 @@ }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20880,8 +18046,6 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -20890,8 +18054,6 @@ }, "node_modules/socks": { "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "license": "MIT", "dependencies": { "ip-address": "^10.0.1", @@ -20904,8 +18066,6 @@ }, "node_modules/sonic-boom": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -20923,8 +18083,6 @@ }, "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" @@ -20932,8 +18090,6 @@ }, "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", @@ -20942,8 +18098,6 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", "engines": { "node": ">= 10.x" @@ -20951,14 +18105,10 @@ }, "node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "license": "BSD-3-Clause" }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -20966,8 +18116,6 @@ }, "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" @@ -20978,29 +18126,21 @@ }, "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/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "devOptional": true, + "dev": true, "license": "MIT" }, "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": { @@ -21040,8 +18180,6 @@ }, "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" @@ -21103,8 +18241,6 @@ }, "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": { @@ -21118,8 +18254,6 @@ }, "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": { @@ -21146,8 +18280,6 @@ }, "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": { @@ -21157,8 +18289,6 @@ }, "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": { @@ -21179,8 +18309,6 @@ }, "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": { @@ -21198,8 +18326,6 @@ }, "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": { @@ -21216,8 +18342,6 @@ }, "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", @@ -21273,8 +18397,6 @@ }, "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": { @@ -21283,8 +18405,6 @@ }, "node_modules/strip-indent": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", - "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", "engines": { @@ -21296,8 +18416,6 @@ }, "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": { @@ -21309,14 +18427,10 @@ }, "node_modules/striptags": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", - "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", "license": "MIT" }, "node_modules/strnum": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", "dev": true, "funding": [ { @@ -21328,14 +18442,10 @@ }, "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" @@ -21343,8 +18453,6 @@ }, "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" @@ -21352,8 +18460,6 @@ }, "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" @@ -21375,8 +18481,6 @@ }, "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": { @@ -21388,8 +18492,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -21403,19 +18505,11 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, "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", @@ -21424,14 +18518,10 @@ }, "node_modules/tailwindcss": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" @@ -21443,8 +18533,6 @@ }, "node_modules/tarn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -21452,8 +18540,6 @@ }, "node_modules/tedious": { "version": "19.2.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-19.2.0.tgz", - "integrity": "sha512-2dDjX0KP54riDvJPiiIozv0WRS/giJb3/JG2lWpa2dgM0Gha7mLAxbTR3ltPkGzfoS6M3oDnhYnWuzeaZibHuQ==", "license": "MIT", "dependencies": { "@azure/core-auth": "^1.7.2", @@ -21473,8 +18559,6 @@ }, "node_modules/tedious/node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -21489,8 +18573,6 @@ }, "node_modules/thread-stream": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "license": "MIT", "dependencies": { "real-require": "^0.2.0" @@ -21505,16 +18587,12 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "devOptional": true, + "dev": true, "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==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -21522,9 +18600,7 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -21539,9 +18615,7 @@ }, "node_modules/tinyrainbow": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -21559,8 +18633,6 @@ }, "node_modules/tlds": { "version": "1.261.0", - "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", - "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", "license": "MIT", "bin": { "tlds": "bin.js" @@ -21570,7 +18642,7 @@ "version": "7.0.19", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.19" @@ -21583,13 +18655,11 @@ "version": "7.0.19", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", - "devOptional": true, + "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -21601,8 +18671,6 @@ }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", "engines": { @@ -21613,7 +18681,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -21626,7 +18694,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -21637,8 +18705,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -21647,8 +18713,6 @@ }, "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", @@ -21657,8 +18721,6 @@ }, "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", @@ -21667,8 +18729,6 @@ }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -21690,8 +18750,6 @@ }, "node_modules/tsconfck": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", "bin": { @@ -21710,30 +18768,33 @@ } }, "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "version": "3.15.0", "dev": true, "license": "MIT", "dependencies": { - "json5": "^2.2.2", + "@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", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" }, - "engines": { - "node": ">=6" + "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/tsyringe": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", "dependencies": { "tslib": "^1.9.3" @@ -21744,8 +18805,6 @@ }, "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/turbo": { @@ -21782,8 +18841,6 @@ }, "node_modules/turbo-darwin-arm64": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.7.4.tgz", - "integrity": "sha512-P7sjqXtOL/+nYWPvcDGWhi8wf8M8mZHHB8XEzw2VX7VJrS8IGHyJHGD1AYfDvhAEcr7pnk3gGifz3/xyhI655w==", "cpu": [ "arm64" ], @@ -21852,8 +18909,6 @@ }, "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==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/Wombosvideo" @@ -21861,8 +18916,6 @@ }, "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": { @@ -21874,8 +18927,6 @@ }, "node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" @@ -21886,8 +18937,6 @@ }, "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": { @@ -21901,91 +18950,212 @@ }, "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" - }, + "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", + "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", + "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", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.53.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.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/node_modules/@typescript-eslint/project-service": { + "version": "8.53.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" + }, + "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/node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.0", + "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/node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.53.0", "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" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "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==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.53.0", "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" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "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==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=14.17" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/typescript-eslint": { + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { "version": "8.53.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz", - "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.0", - "@typescript-eslint/parser": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/utils": "8.53.0" + "@typescript-eslint/types": "8.53.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -21993,22 +19163,36 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "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/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": { @@ -22024,22 +19208,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncrypto": { + "version": "0.1.3", + "license": "MIT" + }, "node_modules/underscore": { "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", "license": "MIT" }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "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", @@ -22057,8 +19239,6 @@ }, "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" @@ -22070,8 +19250,6 @@ }, "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" @@ -22083,8 +19261,6 @@ }, "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", @@ -22097,8 +19273,6 @@ }, "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" @@ -22110,8 +19284,6 @@ }, "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", @@ -22125,8 +19297,6 @@ }, "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", @@ -22153,8 +19323,6 @@ }, "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", @@ -22188,8 +19356,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -22219,8 +19385,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -22229,8 +19393,6 @@ }, "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" @@ -22250,8 +19412,6 @@ }, "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" @@ -22264,8 +19424,6 @@ }, "node_modules/use-intl": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.7.0.tgz", - "integrity": "sha512-jyd8nSErVRRsSlUa+SDobKHo9IiWs5fjcPl9VBUnzUyEQpVM5mwJCgw8eUiylhvBpLQzUGox1KN0XlRivSID9A==", "license": "MIT", "dependencies": { "@formatjs/fast-memoize": "^2.2.0", @@ -22278,8 +19436,6 @@ }, "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" @@ -22292,8 +19448,6 @@ }, "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" @@ -22309,8 +19463,6 @@ }, "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", @@ -22331,8 +19483,6 @@ }, "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" @@ -22354,28 +19504,10 @@ }, "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/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/uuidv7": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.1.0.tgz", - "integrity": "sha512-2VNnOC0+XQlwogChUDzy6pe8GQEys9QFZBGOh54l6qVfwoCUwwRvk7rDTgaIsRgsF5GFa5oiNg8LqXE3jofBBg==", "license": "Apache-2.0", "bin": { "uuidv7": "cli.js" @@ -22383,8 +19515,6 @@ }, "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", @@ -22397,8 +19527,6 @@ }, "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", @@ -22411,8 +19539,6 @@ }, "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", @@ -22427,7 +19553,7 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", @@ -22500,8 +19626,6 @@ }, "node_modules/vite-tsconfig-paths": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.0.4.tgz", - "integrity": "sha512-iIsEJ+ek5KqRTK17pmxtgIxXtqr3qDdE6OxrP9mVeGhVDNXRJTKN/l9oMbujTQNzMLe6XZ8qmpztfbkPu2TiFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22519,11 +19643,70 @@ } } }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/vitest": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@vitest/expect": "4.0.17", @@ -22649,75 +19832,8 @@ "node": ">=14.0.0" } }, - "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.17", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/vue": { "version": "3.5.26", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", - "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.5.26", @@ -22737,15 +19853,13 @@ }, "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/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" @@ -22756,8 +19870,6 @@ }, "node_modules/wait-on": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.3.tgz", - "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==", "dev": true, "license": "MIT", "dependencies": { @@ -22776,8 +19888,6 @@ }, "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", @@ -22788,7 +19898,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=20" @@ -22796,8 +19906,6 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22824,36 +19932,12 @@ }, "node_modules/webpack-bundle-analyzer/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==", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "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 - } - } - }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", @@ -22865,7 +19949,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -22875,7 +19959,7 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "tr46": "^6.0.0", @@ -22887,8 +19971,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -22903,8 +19985,6 @@ }, "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": { @@ -22923,8 +20003,6 @@ }, "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": { @@ -22951,15 +20029,11 @@ }, "node_modules/which-builtin-type/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/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": { @@ -22977,8 +20051,6 @@ }, "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": { @@ -22999,9 +20071,7 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "siginfo": "^2.0.0", @@ -23016,8 +20086,6 @@ }, "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" @@ -23025,8 +20093,6 @@ }, "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" @@ -23034,8 +20100,6 @@ }, "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": { @@ -23128,17 +20192,15 @@ } }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "devOptional": true, + "version": "7.5.10", + "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -23151,8 +20213,6 @@ }, "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "license": "MIT", "dependencies": { "is-wsl": "^3.1.0" @@ -23164,25 +20224,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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", @@ -23204,7 +20247,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18" @@ -23212,8 +20255,6 @@ }, "node_modules/xmlbuilder": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", "license": "MIT", "engines": { "node": ">=4.0" @@ -23223,13 +20264,11 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", "engines": { "node": ">=0.4" @@ -23237,15 +20276,11 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "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": { @@ -23256,9 +20291,7 @@ } }, "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "version": "3.25.76", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -23266,8 +20299,6 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", "engines": { @@ -23279,8 +20310,6 @@ }, "node_modules/zustand": { "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", "license": "MIT", "dependencies": { "use-sync-external-store": "^1.2.2" @@ -23307,8 +20336,6 @@ }, "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", @@ -23335,7 +20362,7 @@ "@ai-sdk/provider-utils": "3.0.20", "@convex-dev/action-cache": "0.3.0", "@convex-dev/agent": "^0.3.2", - "@convex-dev/better-auth": "0.10.10", + "@convex-dev/better-auth": "0.9.7", "@convex-dev/persistent-text-streaming": "0.3.0", "@convex-dev/rate-limiter": "0.3.2", "@convex-dev/workflow": "0.3.2", @@ -23362,13 +20389,13 @@ "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-visually-hidden": "1.2.4", "@tailwindcss/postcss": "4.1.18", - "@tanstack/react-query": "5.90.17", + "@tanstack/react-query": "5.90.16", "@tanstack/react-query-devtools": "5.91.2", "@tanstack/react-table": "8.21.3", "@xyflow/react": "12.10.0", "ai": "5.0.121", "base64-arraybuffer": "1.0.2", - "better-auth": "1.4.9", + "better-auth": "1.3.27", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "convex": "1.29.3", @@ -23401,7 +20428,7 @@ "react-day-picker": "9.13.0", "react-dom": "19.2.3", "react-file-icon": "1.6.0", - "react-hook-form": "7.71.1", + "react-hook-form": "7.71.0", "react-markdown": "10.1.0", "rehype-raw": "7.0.0", "remark-gfm": "4.0.1", @@ -23444,7 +20471,6 @@ "@types/react-datepicker": "7.0.0", "@types/react-dom": "19.2.3", "@types/react-file-icon": "1.0.4", - "@types/striptags": "3.1.1", "@vitejs/plugin-react": "5.1.2", "convex-test": "0.0.40", "encoding": "0.1.13", @@ -23458,6 +20484,16 @@ "wait-on": "9.0.3" } }, + "services/platform/node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "services/proxy": { "name": "@tale/proxy", "version": "0.1.0" diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 1e2dada3f..2903db538 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -67,7 +67,7 @@ ALL_IMAGES="tale-platform tale-rag tale-crawler tale-db tale-graph-db tale-proxy # Services NOT included (shared between blue/green, single instance only): # - db: TimescaleDB - single instance required for data consistency # - proxy: Caddy - single entry point for traffic routing -# - graph-db: Kuzu - requires exclusive file lock, cannot run two instances +# - graph-db: Neo4j - single instance required for data consistency # # The actual service names in compose files are suffixed with color: # e.g., platform-blue, platform-green, rag-blue, rag-green, etc. diff --git a/scripts/dev-tools.sh b/scripts/dev-tools.sh new file mode 100755 index 000000000..693adc99e --- /dev/null +++ b/scripts/dev-tools.sh @@ -0,0 +1,485 @@ +#!/bin/bash +# ============================================================================ +# Tale Platform - Development Tools Manager +# ============================================================================ +# +# Manages development-only visualization tools for RAG service data: +# - Kuzu Explorer: Graph database visualization (nodes and relationships) +# - Lance Data Viewer: Vector database visualization (embeddings) +# +# These tools run in read-only mode and do not affect the RAG service. +# Uses standalone docker run commands - does not modify compose.yml. +# +# IMPORTANT: In multi-tenant mode (ENABLE_BACKEND_ACCESS_CONTROL=true), each +# user/dataset has its own Kuzu database file stored at: +# .cognee_system/databases/{user_id}/{dataset_id}.pkl +# +# When starting, if multiple databases exist, an interactive menu will let you +# choose which one to view in Kuzu Explorer. +# +# USAGE: +# ./scripts/dev-tools.sh # Show status and URLs +# ./scripts/dev-tools.sh start # Start visualization tools +# ./scripts/dev-tools.sh stop # Stop visualization tools +# ./scripts/dev-tools.sh logs # View logs from tools +# ./scripts/dev-tools.sh list-kuzu # List available Kuzu databases +# +# ============================================================================ + +set -euo pipefail + +# ============================================================================ +# Configuration +# ============================================================================ + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +# Container names +KUZU_CONTAINER="tale-kuzu-explorer" +LANCE_CONTAINER="tale-lance-viewer" + +# Ports +KUZU_PORT=8787 +LANCE_PORT=8788 + +# Docker images +KUZU_IMAGE="kuzudb/explorer:0.11.3" +LANCE_IMAGE="ghcr.io/gordonmurray/lance-data-viewer:lancedb-0.24.3" + +# Volume name (must match compose.yml) +RAG_DATA_VOLUME="tale_rag-data" + +# Docker network (must match compose.yml) +DOCKER_NETWORK="tale_internal" + +# PostgreSQL connection for name resolution (must match compose.yml) +PG_CONTAINER="tale-db" +PG_DATABASE="tale_rag" +PG_USER="tale" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' + +# ============================================================================ +# Helper Functions +# ============================================================================ + +log_info() { + echo -e "${CYAN}[INFO]${NC} $1" >&2 +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" >&2 +} + +log_success() { + echo -e "${GREEN}[OK]${NC} $1" >&2 +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" >&2 +} + +is_container_running() { + docker ps --filter "name=$1" --format '{{.Names}}' 2>/dev/null | grep -q "^$1$" +} + +check_volume_exists() { + docker volume inspect "${RAG_DATA_VOLUME}" &>/dev/null +} + +check_network_exists() { + docker network inspect "${DOCKER_NETWORK}" &>/dev/null +} + +is_rag_running() { + docker ps --filter "name=tale-rag" --format '{{.Names}}' 2>/dev/null | grep -q "tale-rag" +} + +is_pg_available() { + docker exec "${PG_CONTAINER}" pg_isready -U "${PG_USER}" -d "${PG_DATABASE}" &>/dev/null +} + +get_dataset_name() { + local dataset_id="$1" + if ! is_pg_available; then + echo "" + return + fi + docker exec "${PG_CONTAINER}" psql -U "${PG_USER}" -d "${PG_DATABASE}" -t -A \ + -c "SELECT name FROM datasets WHERE id = '${dataset_id}';" 2>/dev/null | tr -d '[:space:]' +} + +get_user_email() { + local user_id="$1" + if ! is_pg_available; then + echo "" + return + fi + docker exec "${PG_CONTAINER}" psql -U "${PG_USER}" -d "${PG_DATABASE}" -t -A \ + -c "SELECT email FROM users WHERE id = '${user_id}';" 2>/dev/null | tr -d '[:space:]' +} + +find_kuzu_databases() { + # Find all .pkl files that are Kuzu databases in the multi-tenant structure + docker run --rm -v "${RAG_DATA_VOLUME}:/data:ro" alpine:latest \ + find /data/.cognee_system/databases -name "*.pkl" -type f 2>/dev/null || true +} + +get_latest_kuzu_database() { + # Get the most recently modified Kuzu database file + docker run --rm -v "${RAG_DATA_VOLUME}:/data:ro" alpine:latest \ + sh -c 'find /data/.cognee_system/databases -name "*.pkl" -type f -exec ls -t {} + 2>/dev/null | head -1' || true +} + +select_kuzu_database() { + # Get all databases into an array + local databases_raw + databases_raw=$(find_kuzu_databases) + + if [ -z "$databases_raw" ]; then + echo "" + return + fi + + # Convert to array + local databases=() + while IFS= read -r line; do + [ -n "$line" ] && databases+=("$line") + done <<< "$databases_raw" + + local count=${#databases[@]} + + # If only one database, return it directly + if [ "$count" -eq 1 ]; then + echo "${databases[0]}" + return + fi + + # Multiple databases - show interactive menu + echo "" >&2 + echo -e "${CYAN}Multiple Kuzu databases found. Select one:${NC}" >&2 + echo "" >&2 + + local i=1 + for db_path in "${databases[@]}"; do + # Extract user_id and dataset_id from path + # Path format: /data/.cognee_system/databases/{user_id}/{dataset_id}.pkl + local user_id dataset_id + user_id=$(echo "$db_path" | sed -E 's|.*/databases/([^/]+)/.*|\1|') + dataset_id=$(basename "$db_path" .pkl) + + # Get friendly names from PostgreSQL (fallback to UUID if unavailable) + local dataset_name user_email + dataset_name=$(get_dataset_name "$dataset_id") + user_email=$(get_user_email "$user_id") + + local display_dataset="${dataset_name:-${dataset_id:0:12}...}" + local display_user="${user_email:-${user_id:0:12}...}" + + # Get file info + local info + info=$(docker run --rm -v "${RAG_DATA_VOLUME}:/data:ro" alpine:latest \ + stat -c "%s bytes, %y" "$db_path" 2>/dev/null | cut -d'.' -f1 || echo "unknown") + + echo -e " ${GREEN}[$i]${NC} ${display_dataset}" >&2 + echo " User: ${display_user}" >&2 + echo " $info" >&2 + ((i++)) + done + + echo "" >&2 + echo -n "Enter selection [1-$count]: " >&2 + read -r selection + + # Validate selection + if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt "$count" ]; then + log_error "Invalid selection. Using most recent database." >&2 + echo "${databases[0]}" + return + fi + + echo "${databases[$((selection-1))]}" +} + +# ============================================================================ +# Commands +# ============================================================================ + +cmd_help() { + echo "" + echo "Tale Platform - Development Tools Manager" + echo "" + echo "Visualization tools for RAG service data (Kuzu graph + LanceDB vectors)" + echo "" + echo "USAGE:" + echo " ./scripts/dev-tools.sh [COMMAND]" + echo "" + echo "COMMANDS:" + echo " start Start visualization tools (Lance only if RAG is running)" + echo " stop Stop visualization tools" + echo " status Show status and access URLs (default)" + echo " logs View logs from visualization tools" + echo " list-kuzu List available Kuzu database files" + echo " -h, --help Show this help message" + echo "" + echo "TOOLS:" + echo " Kuzu Explorer http://localhost:${KUZU_PORT} Graph database (nodes/relationships)" + echo " Lance Data Viewer http://localhost:${LANCE_PORT} Vector database (embeddings)" + echo "" + echo "NOTES:" + echo " - Lance Data Viewer works while RAG service is running" + echo " - In multi-tenant mode, each user/dataset has its own Kuzu database (.pkl files)" + echo " - If multiple databases exist, 'start' shows an interactive menu to select one" + echo " - Kuzu uses exclusive file locks: databases actively used by RAG cannot be opened" + echo " - Use 'list-kuzu' to preview available databases before starting" + echo "" +} + +cmd_start() { + log_info "Starting development visualization tools..." + + # Check prerequisites + if ! check_volume_exists; then + log_error "RAG data volume '${RAG_DATA_VOLUME}' not found" + log_info "Start the RAG service first with: docker compose up -d rag" + exit 1 + fi + + if ! check_network_exists; then + log_warn "Docker network '${DOCKER_NETWORK}' not found, creating..." + docker network create "${DOCKER_NETWORK}" 2>/dev/null || true + fi + + # Stop existing containers if running + docker rm -f "${KUZU_CONTAINER}" "${LANCE_CONTAINER}" 2>/dev/null || true + + # Note: In multi-tenant mode, each dataset has its own Kuzu database file. + # Multiple READ_ONLY connections to different databases work concurrently. + # Only if RAG is actively writing to the SAME database would there be a conflict. + + # Let user select which Kuzu database to view (interactive menu if multiple) + local kuzu_db_path + kuzu_db_path=$(select_kuzu_database) + + if [ -z "$kuzu_db_path" ]; then + log_warn "No Kuzu database files found. Index some documents first." + log_warn "Skipping Kuzu Explorer..." + else + # Extract directory and filename for Kuzu Explorer + # kuzu_db_path is like: /data/.cognee_system/databases/{user_id}/{dataset_id}.pkl + # We need to mount the directory containing the .pkl file and set KUZU_FILE to just the filename + local kuzu_db_dir + local kuzu_db_filename + kuzu_db_dir=$(dirname "${kuzu_db_path}") + kuzu_db_filename=$(basename "${kuzu_db_path}") + + # Convert /data/... path to volume subpath for Docker bind mount + # tale_rag-data volume is mounted at /app/data in the RAG container + local volume_subpath="${kuzu_db_dir#/data/}" + + log_info "Starting Kuzu Explorer with database: ${kuzu_db_path}" + log_info " Directory: ${volume_subpath}" + log_info " Filename: ${kuzu_db_filename}" + + # Mount the specific database directory to /database in the container + # KUZU_FILE should be just the filename since /database is the database directory + docker run -d \ + --name "${KUZU_CONTAINER}" \ + --network "${DOCKER_NETWORK}" \ + -p "${KUZU_PORT}:8000" \ + -v "${RAG_DATA_VOLUME}:/_volume:ro" \ + -e MODE=READ_ONLY \ + -e KUZU_DIR="/_volume/${volume_subpath}" \ + -e KUZU_FILE="${kuzu_db_filename}" \ + -e KUZU_BUFFER_POOL_SIZE=268435456 \ + --restart unless-stopped \ + "${KUZU_IMAGE}" >/dev/null 2>&1 || log_warn "Kuzu Explorer failed to start" + fi + + # Start Lance Data Viewer (works even when RAG is running) + log_info "Starting Lance Data Viewer..." + docker run -d \ + --name "${LANCE_CONTAINER}" \ + --network "${DOCKER_NETWORK}" \ + -p "${LANCE_PORT}:8080" \ + -v "${RAG_DATA_VOLUME}:/data:ro" \ + --restart unless-stopped \ + "${LANCE_IMAGE}" >/dev/null + + # Wait a moment for containers to start + sleep 2 + + echo "" + log_success "Development tools started" + echo "" + echo "Access URLs:" + if is_container_running "${KUZU_CONTAINER}"; then + echo " Kuzu Explorer (Graph DB): http://localhost:${KUZU_PORT}" + else + echo " Kuzu Explorer (Graph DB): NOT STARTED (no database found)" + fi + echo " Lance Data Viewer (Vector DB): http://localhost:${LANCE_PORT}" + echo "" +} + +cmd_stop() { + log_info "Stopping development visualization tools..." + + docker stop "${KUZU_CONTAINER}" "${LANCE_CONTAINER}" 2>/dev/null || true + docker rm "${KUZU_CONTAINER}" "${LANCE_CONTAINER}" 2>/dev/null || true + + log_success "Development tools stopped" +} + +cmd_status() { + echo "" + echo "Development Tools Status" + echo "========================" + echo "" + + local kuzu_status="${RED}stopped${NC}" + local lance_status="${RED}stopped${NC}" + + if is_container_running "${KUZU_CONTAINER}"; then + kuzu_status="${GREEN}running${NC}" + fi + + if is_container_running "${LANCE_CONTAINER}"; then + lance_status="${GREEN}running${NC}" + fi + + echo -e "Kuzu Explorer: ${kuzu_status} http://localhost:${KUZU_PORT}" + echo -e "Lance Data Viewer: ${lance_status} http://localhost:${LANCE_PORT}" + echo "" + + if ! is_container_running "${KUZU_CONTAINER}" && ! is_container_running "${LANCE_CONTAINER}"; then + log_info "Start tools with: ./scripts/dev-tools.sh start" + fi + echo "" +} + +cmd_logs() { + local containers=() + + if is_container_running "${KUZU_CONTAINER}"; then + containers+=("${KUZU_CONTAINER}") + fi + + if is_container_running "${LANCE_CONTAINER}"; then + containers+=("${LANCE_CONTAINER}") + fi + + if [ ${#containers[@]} -eq 0 ]; then + log_error "No development tools are running" + log_info "Start tools with: ./scripts/dev-tools.sh start" + exit 1 + fi + + log_info "Showing logs for: ${containers[*]}" + echo "" + + for container in "${containers[@]}"; do + echo -e "${CYAN}=== ${container} ===${NC}" + docker logs --tail 50 "${container}" 2>&1 + echo "" + done +} + +cmd_list_kuzu() { + echo "" + echo "Available Kuzu Databases" + echo "========================" + echo "" + + if ! check_volume_exists; then + log_error "RAG data volume '${RAG_DATA_VOLUME}' not found" + exit 1 + fi + + local databases + databases=$(find_kuzu_databases) + + if [ -z "$databases" ]; then + log_warn "No Kuzu database files found" + log_info "Index some documents first with the RAG service" + exit 0 + fi + + echo "Multi-tenant mode: Each user/dataset has its own database" + echo "" + + local i=1 + echo "$databases" | while read -r db_path; do + # Extract user_id and dataset_id from path + local user_id dataset_id + user_id=$(echo "$db_path" | sed -E 's|.*/databases/([^/]+)/.*|\1|') + dataset_id=$(basename "$db_path" .pkl) + + # Get friendly names from PostgreSQL (fallback to UUID if unavailable) + local dataset_name user_email + dataset_name=$(get_dataset_name "$dataset_id") + user_email=$(get_user_email "$user_id") + + local display_dataset="${dataset_name:-${dataset_id}}" + local display_user="${user_email:-${user_id}}" + + # Get file size and modification time + local info + info=$(docker run --rm -v "${RAG_DATA_VOLUME}:/data:ro" alpine:latest \ + stat -c "%s bytes, modified %y" "$db_path" 2>/dev/null || echo "unknown") + + echo -e " ${GREEN}[$i]${NC} ${display_dataset}" + echo " User: ${display_user}" + echo " Path: ${db_path}" + echo " ${info}" + echo "" + ((i++)) + done + + log_info "Run: ./scripts/dev-tools.sh start" + if is_rag_running; then + log_info "Note: RAG service is running. If viewing a database currently in use," + log_info " you may see stale data until RAG commits its changes." + fi + echo "" +} + +# ============================================================================ +# Main +# ============================================================================ + +main() { + case "${1:-status}" in + -h|--help) + cmd_help + ;; + start) + cmd_start + ;; + stop) + cmd_stop + ;; + status) + cmd_status + ;; + logs) + cmd_logs + ;; + list-kuzu) + cmd_list_kuzu + ;; + *) + log_error "Unknown command: $1" + cmd_help + exit 1 + ;; + esac +} + +main "$@" diff --git a/services/db/init-scripts/03-create-rag-database.sql b/services/db/init-scripts/03-create-rag-database.sql index 65b55b4a7..b5bc4a1e4 100644 --- a/services/db/init-scripts/03-create-rag-database.sql +++ b/services/db/init-scripts/03-create-rag-database.sql @@ -19,5 +19,67 @@ GRANT ALL PRIVILEGES ON DATABASE tale_rag TO tale; CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "vector"; +-- ============================================================================ +-- HNSW Index Management for PGVector +-- ============================================================================ +-- Cognee creates vector tables dynamically (one per collection/dataset). +-- This function creates HNSW indexes on vector columns for fast similarity search. +-- Without indexes, queries on 200k+ vectors can take 5-15 seconds. +-- With HNSW indexes, queries complete in <500ms. +-- ============================================================================ + +-- Function to create HNSW indexes on all vector columns that don't have one +CREATE OR REPLACE FUNCTION create_vector_hnsw_indexes() +RETURNS void AS $$ +DECLARE + rec RECORD; + index_name TEXT; + index_exists BOOLEAN; +BEGIN + -- Find all columns with vector type in public schema + FOR rec IN + SELECT + c.table_name, + c.column_name, + c.udt_name + FROM information_schema.columns c + JOIN information_schema.tables t + ON c.table_name = t.table_name + AND c.table_schema = t.table_schema + WHERE c.table_schema = 'public' + AND c.udt_name = 'vector' + AND t.table_type = 'BASE TABLE' + LOOP + -- Generate index name + index_name := rec.table_name || '_' || rec.column_name || '_hnsw_idx'; + + -- Check if index already exists + SELECT EXISTS ( + SELECT 1 FROM pg_indexes + WHERE schemaname = 'public' + AND indexname = index_name + ) INTO index_exists; + + -- Create index if it doesn't exist + IF NOT index_exists THEN + RAISE NOTICE 'Creating HNSW index: % on %.%', + index_name, rec.table_name, rec.column_name; + + -- Use cosine distance operator (most common for embeddings) + -- m=16, ef_construction=64 are good defaults for quality/speed balance + EXECUTE format( + 'CREATE INDEX %I ON %I USING hnsw (%I vector_cosine_ops) WITH (m = 16, ef_construction = 64)', + index_name, + rec.table_name, + rec.column_name + ); + + RAISE NOTICE 'Created HNSW index: %', index_name; + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + -- Log completion \echo 'RAG database created successfully: tale_rag' +\echo 'HNSW index function created: SELECT create_vector_hnsw_indexes();' diff --git a/services/graph-db/Dockerfile b/services/graph-db/Dockerfile index 1f98f2756..152d0d6c5 100644 --- a/services/graph-db/Dockerfile +++ b/services/graph-db/Dockerfile @@ -1,32 +1,27 @@ # Version argument - injected by CI from git tag, defaults to 'dev' for local builds ARG VERSION=dev -FROM python:3.11-slim +# Use official FalkorDB image +# FalkorDB is a Redis-based graph database optimized for GraphRAG +# - Native multi-tenant support (10K+ graphs per instance) +# - Low latency (~140ms p99) +# - Client-server architecture (no file-level locking issues) +# - Combined graph and vector storage via hybrid adapter +FROM falkordb/falkordb:edge # Re-declare VERSION arg (ARGs don't persist after FROM) ARG VERSION=dev -WORKDIR /app - -# Install uv for faster package management -COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv - -# Copy pyproject.toml and install dependencies -COPY pyproject.toml . -RUN uv pip install --system . - -# Copy application code -COPY app/ ./app/ - -# Create data directory -RUN mkdir -p /data - # Set version environment variable ENV TALE_VERSION=${VERSION} -# Expose port -EXPOSE 8000 +# FalkorDB configuration is done via environment variables in compose.yml +# Default Redis configuration is sufficient for most use cases -# Run the application -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] +# Expose ports: +# - 6379: Redis protocol (RAG service connection) +# - 3000: FalkorDB Browser UI (mapped to 6380 externally in compose.yml) +EXPOSE 6379 3000 +# Use the default FalkorDB entrypoint and command +# Data is persisted in /var/lib/falkordb/data volume (configured in compose.yml) diff --git a/services/graph-db/app/__init__.py b/services/graph-db/app/__init__.py deleted file mode 100644 index 6a5f9f924..000000000 --- a/services/graph-db/app/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Graph DB Service - diff --git a/services/graph-db/app/config.py b/services/graph-db/app/config.py deleted file mode 100644 index 5d1f052dc..000000000 --- a/services/graph-db/app/config.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Configuration for the Graph DB service.""" - -from pydantic_settings import BaseSettings - - -class Settings(BaseSettings): - """Application settings.""" - - # Server settings - host: str = "0.0.0.0" - port: int = 8000 - - # Database settings - database_path: str = "/data/kuzu_db" - - class Config: - env_prefix = "GRAPH_DB_" - - -settings = Settings() - diff --git a/services/graph-db/app/database.py b/services/graph-db/app/database.py deleted file mode 100644 index e63774736..000000000 --- a/services/graph-db/app/database.py +++ /dev/null @@ -1,130 +0,0 @@ -"""Kuzu database connection and operations.""" - -import json -from datetime import date, datetime, time, timedelta -from typing import Any - -import kuzu -from loguru import logger - -from .config import settings - - -class DateTimeEncoder(json.JSONEncoder): - """Custom JSON encoder that handles datetime objects.""" - - def default(self, obj: Any) -> Any: - if isinstance(obj, datetime): - return obj.isoformat() - if isinstance(obj, date): - return obj.isoformat() - if isinstance(obj, time): - return obj.isoformat() - if isinstance(obj, timedelta): - return obj.total_seconds() - return super().default(obj) - - -class KuzuDatabase: - """Kuzu database wrapper.""" - - def __init__(self): - self.db = None - self.conn = None - - def connect(self): - """Initialize the database connection.""" - logger.info(f"Connecting to Kuzu database at {settings.database_path}") - self.db = kuzu.Database(settings.database_path) - self.conn = kuzu.Connection(self.db) - logger.info("Kuzu database connected successfully") - - def close(self): - """Close the database connection.""" - if self.conn: - self.conn = None - if self.db: - self.db = None - logger.info("Kuzu database connection closed") - - def execute(self, query: str, parameters: dict[str, Any] | None = None) -> list[list[Any]]: - """Execute a Cypher query and return results. - - Args: - query: Cypher query string - parameters: Optional query parameters - - Returns: - List of rows, where each row is a list of values - """ - if not self.conn: - raise RuntimeError("Database not connected") - - try: - if parameters: - result = self.conn.execute(query, parameters) - else: - result = self.conn.execute(query) - - rows = [] - while result.has_next(): - row = result.get_next() - processed_row = [] - for val in row: - processed_row.append(self._process_value(val)) - rows.append(processed_row) - - return rows - except Exception as e: - logger.error(f"Query execution failed: {e}") - logger.error(f"Query: {query}") - logger.error(f"Parameters: {parameters}") - raise - - def _process_value(self, val: Any) -> Any: - """Process a value from Kuzu result. - - Handles datetime objects and nested structures to ensure JSON serialization. - """ - if val is None: - return None - # Handle datetime types - if isinstance(val, datetime): - return val.isoformat() - if isinstance(val, date): - return val.isoformat() - if isinstance(val, time): - return val.isoformat() - if isinstance(val, timedelta): - return val.total_seconds() - # Handle lists recursively - if isinstance(val, list): - return [self._process_value(item) for item in val] - # Handle dicts - if isinstance(val, dict): - # Handle node/relationship objects - if "_id" in val or "_label" in val: - properties = {k: self._process_value(v) for k, v in val.items() if not k.startswith("_")} - # Use the node's 'id' property (UUID) instead of Kuzu's internal offset. - # Cognee uses UUID strings for node lookups (e.g., WHERE n.id = $id). - node_id = properties.get("id") or self._get_internal_offset(val) - return { - "id": node_id, - "label": val.get("_label"), - "properties": json.dumps(properties, cls=DateTimeEncoder), - } - # Process regular dicts recursively - return {k: self._process_value(v) for k, v in val.items()} - return val - - def _get_internal_offset(self, val: dict) -> Any: - """Extract Kuzu's internal offset from a node/relationship dict.""" - internal_id = val.get("_id") - if isinstance(internal_id, dict): - return internal_id.get("offset") - return internal_id - - -# Global database instance -db = KuzuDatabase() - diff --git a/services/graph-db/app/main.py b/services/graph-db/app/main.py deleted file mode 100644 index e0dde0042..000000000 --- a/services/graph-db/app/main.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Graph DB REST API service for Kuzu - Cognee compatible.""" - -from contextlib import asynccontextmanager -from typing import Any - -from fastapi import FastAPI, HTTPException -from loguru import logger -from pydantic import BaseModel - -from .config import settings -from .database import db - - -class QueryRequest(BaseModel): - """Query request model - matches Cognee's expected format.""" - - query: str - parameters: dict[str, Any] | None = None - - -class QueryResponse(BaseModel): - """Query response model - matches Cognee's expected format.""" - - data: list[list[Any]] - - -@asynccontextmanager -async def lifespan(app: FastAPI): - """Application lifespan handler.""" - logger.info("Starting Graph DB service...") - db.connect() - yield - logger.info("Shutting down Graph DB service...") - db.close() - - -app = FastAPI( - title="Graph DB Service", - description="Kuzu graph database REST API - Cognee compatible", - version="0.1.0", - lifespan=lifespan, -) - - -@app.get("/health") -async def health(): - """Health check endpoint.""" - return {"status": "healthy", "service": "graph-db", "database": "kuzu"} - - -@app.post("/query", response_model=QueryResponse) -async def execute_query(request: QueryRequest): - """Execute a Cypher query. - - This endpoint matches Cognee's expected kuzu-remote API format: - - POST /query - - Request: {"query": "...", "parameters": {}} - - Response: {"data": [[...]]} - """ - try: - logger.debug(f"Executing query: {request.query}") - if request.parameters: - logger.debug(f"Parameters: {request.parameters}") - - rows = db.execute(request.query, request.parameters) - return QueryResponse(data=rows) - except Exception as e: - logger.error(f"Query execution failed: {e}") - raise HTTPException(status_code=500, detail=str(e)) - - -if __name__ == "__main__": - import uvicorn - - uvicorn.run(app, host=settings.host, port=settings.port) - diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx index 82341467f..5c7922957 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx @@ -1,7 +1,7 @@ 'use client'; import { useMemo, useCallback, useState } from 'react'; -import { Trash2 } from 'lucide-react'; +import { RefreshCw, Trash2, Users } from 'lucide-react'; import { EntityRowActions, useEntityRowDialogs, @@ -10,8 +10,10 @@ import type { Id } from '@/convex/_generated/dataModel'; import { useDeleteDocument } from '../hooks/use-delete-document'; import { DocumentDeleteDialog } from './document-delete-dialog'; import { DocumentDeleteFolderDialog } from './document-delete-folder-dialog'; +import { DocumentTeamTagsDialog } from './document-team-tags-dialog'; import { toast } from '@/hooks/use-toast'; import { useT } from '@/lib/i18n/client'; +import { retryRagIndexing } from '../actions/retry-rag-indexing'; type StorageSourceMode = 'auto' | 'manual'; @@ -22,6 +24,7 @@ interface DocumentRowActionsProps { syncConfigId?: string; isDirectlySelected?: boolean; sourceMode?: StorageSourceMode; + teamTags?: string[]; } export function DocumentRowActions({ @@ -31,11 +34,13 @@ export function DocumentRowActions({ syncConfigId, isDirectlySelected, sourceMode, + teamTags, }: DocumentRowActionsProps) { const { t: tDocuments } = useT('documents'); const { t: tCommon } = useT('common'); - const dialogs = useEntityRowDialogs(['delete', 'deleteFolder']); + const dialogs = useEntityRowDialogs(['delete', 'deleteFolder', 'teamTags']); const [isDeleting, setIsDeleting] = useState(false); + const [isReindexing, setIsReindexing] = useState(false); const deleteDocument = useDeleteDocument(); // Determine if delete action should be visible @@ -88,8 +93,49 @@ export function DocumentRowActions({ } }, [itemType, dialogs.open]); + const handleReindex = useCallback(async () => { + setIsReindexing(true); + try { + const result = await retryRagIndexing(documentId); + if (result.success) { + toast({ + title: tDocuments('rag.toast.indexingStarted'), + description: tDocuments('rag.toast.indexingQueued'), + }); + } else { + toast({ + title: tDocuments('rag.toast.retryFailed'), + description: result.error || tDocuments('rag.toast.retryFailedDescription'), + variant: 'destructive', + }); + } + } catch { + toast({ + title: tDocuments('rag.toast.unexpectedError'), + variant: 'destructive', + }); + } finally { + setIsReindexing(false); + } + }, [documentId, tDocuments]); + const actions = useMemo( () => [ + { + key: 'reindex', + label: tDocuments('actions.reindex'), + icon: RefreshCw, + onClick: handleReindex, + visible: itemType === 'file', + disabled: isReindexing, + }, + { + key: 'teamTags', + label: tDocuments('actions.manageTeams'), + icon: Users, + onClick: dialogs.open.teamTags, + visible: itemType === 'file', + }, { key: 'delete', label: @@ -102,11 +148,12 @@ export function DocumentRowActions({ visible: canDelete, }, ], - [tDocuments, tCommon, handleDeleteClick, canDelete, itemType] + [tDocuments, tCommon, handleDeleteClick, handleReindex, canDelete, itemType, dialogs.open, isReindexing] ); - // Don't render anything if delete is not allowed - if (!canDelete) { + // Show actions if user can delete OR if it's a file (for team tags) + const hasVisibleActions = canDelete || itemType === 'file'; + if (!hasVisibleActions) { return null; } @@ -114,20 +161,33 @@ export function DocumentRowActions({ <> - + {dialogs.isOpen.delete && ( + + )} + + {dialogs.isOpen.deleteFolder && ( + + )} - ); diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx index 434644aba..c6dae5c87 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx @@ -6,6 +6,7 @@ import { Monitor, ClipboardList, RefreshCw } from 'lucide-react'; import { type ColumnDef, type Row } from '@tanstack/react-table'; import { DataTable } from '@/components/ui/data-table/data-table'; import { HStack } from '@/components/ui/layout/layout'; +import { Badge } from '@/components/ui/feedback/badge'; import { BreadcrumbNavigation } from './breadcrumb-navigation'; import { formatBytes } from '@/lib/utils/format/number'; import { OneDriveIcon } from '@/components/icons/onedrive-icon'; @@ -18,9 +19,11 @@ import { RagStatusBadge } from './rag-status-badge'; import { DocumentsActionMenu } from './documents-action-menu'; import { useT } from '@/lib/i18n/client'; import { TableDateCell } from '@/components/ui/data-display/table-date-cell'; +import { Skeleton } from '@/components/ui/feedback/skeleton'; import { useDebounce } from '@/hooks/use-debounce'; import { useUrlDialog } from '@/hooks/use-url-dialog'; import { useCursorPaginatedQuery } from '@/hooks/use-cursor-paginated-query'; +import { useListTeams } from '../../../settings/teams/hooks/use-list-teams'; import { api } from '@/convex/_generated/api'; export interface DocumentTableProps { @@ -50,6 +53,17 @@ export function DocumentTable({ // Debounce search query for URL updates const debouncedQuery = useDebounce(query, 300); + // Fetch all teams for mapping team IDs to names + // In trusted headers mode, teams come from JWT claims + // In normal auth mode, teams come from the teamMember database table + const { teams, isLoading: isLoadingTeams } = useListTeams(organizationId); + + // Create a map of team ID to team name for efficient lookups + const teamMap = useMemo(() => { + if (!teams) return new Map(); + return new Map(teams.map((team) => [team.id, team.name])); + }, [teams]); + // Build query args for cursor-based pagination const queryArgs = useMemo( () => ({ @@ -248,6 +262,53 @@ export function DocumentTable({ /> ), }, + { + id: 'teams', + header: tTables('headers.teams'), + size: 160, + cell: ({ row }) => { + const tags = row.original.teamTags; + if (row.original.type === 'folder' || !tags || tags.length === 0) { + return ; + } + if (isLoadingTeams) { + return ; + } + return ( + + {tags.slice(0, 2).map((tagId) => { + const teamName = teamMap.get(tagId); + if (!teamName) return null; + return ( + + {teamName} + + ); + })} + {tags.length > 2 && ( + + +{tags.length - 2} + + )} + + ); + }, + }, + { + id: 'uploadedBy', + header: tTables('headers.uploadedBy'), + size: 160, + cell: ({ row }) => { + if (row.original.type === 'folder') { + return ; + } + return ( + + {row.original.createdByName ?? '—'} + + ); + }, + }, { accessorKey: 'lastModified', header: () => ( @@ -276,12 +337,13 @@ export function DocumentTable({ syncConfigId={row.original.syncConfigId} isDirectlySelected={row.original.isDirectlySelected} sourceMode={row.original.sourceMode} + teamTags={row.original.teamTags} /> ), }, ], - [handleDocumentClick, tTables], + [handleDocumentClick, isLoadingTeams, tTables, teamMap], ); return ( diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx new file mode 100644 index 000000000..6032b3ff4 --- /dev/null +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx @@ -0,0 +1,160 @@ +'use client'; + +import { useState, useEffect, useMemo, useCallback } from 'react'; +import { useMutation, useQuery } from 'convex/react'; +import { FormDialog } from '@/components/ui/dialog/form-dialog'; +import { Checkbox } from '@/components/ui/forms/checkbox'; +import { Stack } from '@/components/ui/layout/layout'; +import { Users } from 'lucide-react'; +import { toast } from '@/hooks/use-toast'; +import { api } from '@/convex/_generated/api'; +import type { Id } from '@/convex/_generated/dataModel'; +import { useT } from '@/lib/i18n/client'; +import { useOrganizationId } from '@/hooks/use-organization-id'; + +interface DocumentTeamTagsDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + documentId: string; + documentName?: string | null; + currentTeamTags?: string[]; +} + +export function DocumentTeamTagsDialog({ + open, + onOpenChange, + documentId, + documentName, + currentTeamTags = [], +}: DocumentTeamTagsDialogProps) { + const { t: tDocuments } = useT('documents'); + const { t: tCommon } = useT('common'); + const organizationId = useOrganizationId(); + + const [selectedTeams, setSelectedTeams] = useState>( + () => new Set(currentTeamTags), + ); + const [isSubmitting, setIsSubmitting] = useState(false); + + // Update document mutation + const updateDocument = useMutation(api.documents.updateDocument); + + // Fetch only teams that the current user belongs to + const teamsResult = useQuery( + api.member.getMyTeams, + open && organizationId ? { organizationId } : 'skip', + ); + const teams = teamsResult?.teams ?? null; + const isLoading = teamsResult === undefined && open; + + // Reset selection when dialog opens + useEffect(() => { + if (open) { + setSelectedTeams(new Set(currentTeamTags)); + } + }, [open, currentTeamTags]); + + const handleToggleTeam = useCallback((teamId: string) => { + setSelectedTeams((prev) => { + const next = new Set(prev); + if (next.has(teamId)) { + next.delete(teamId); + } else { + next.add(teamId); + } + return next; + }); + }, []); + + const handleSubmit = useCallback(async (e: React.FormEvent) => { + e.preventDefault(); + setIsSubmitting(true); + + try { + await updateDocument({ + documentId: documentId as Id<'documents'>, + teamTags: Array.from(selectedTeams), + }); + + toast({ + title: tDocuments('teamTags.updated'), + variant: 'success', + }); + + onOpenChange(false); + } catch (error) { + console.error(error); + toast({ + title: tDocuments('teamTags.updateFailed'), + variant: 'destructive', + }); + } finally { + setIsSubmitting(false); + } + }, [documentId, selectedTeams, updateDocument, tDocuments, onOpenChange]); + + // Check if there are any changes + const hasChanges = useMemo(() => { + const currentSet = new Set(currentTeamTags); + if (currentSet.size !== selectedTeams.size) return true; + for (const teamId of selectedTeams) { + if (!currentSet.has(teamId)) return true; + } + return false; + }, [currentTeamTags, selectedTeams]); + + return ( + + + {documentName && ( +

+ {tDocuments('teamTags.description', { name: documentName })} +

+ )} + + {isLoading ? ( +
+ + {tCommon('actions.loading')} + +
+ ) : !teams || teams.length === 0 ? ( +
+ +

+ {tDocuments('teamTags.noTeams')} +

+
+ ) : ( + + {teams.map((team) => ( + + ))} + + )} + +

+ {tDocuments('teamTags.hint')} +

+
+
+ ); +} diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx new file mode 100644 index 000000000..0dc18a0c8 --- /dev/null +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx @@ -0,0 +1,233 @@ +'use client'; + +import { useState, useCallback, useRef, type ChangeEvent } from 'react'; +import { useQuery } from 'convex/react'; +import { FormDialog } from '@/components/ui/dialog/form-dialog'; +import { Checkbox } from '@/components/ui/forms/checkbox'; +import { Stack } from '@/components/ui/layout/layout'; +import { Users, Upload, X, FileText } from 'lucide-react'; +import { Button } from '@/components/ui/primitives/button'; +import { useT } from '@/lib/i18n/client'; +import { api } from '@/convex/_generated/api'; +import { useDocumentUpload, MAX_FILE_SIZE_BYTES } from '../hooks/use-document-upload'; +import { cn } from '@/lib/utils/cn'; + +interface DocumentUploadDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + organizationId: string; + onSuccess?: () => void; +} + +export function DocumentUploadDialog({ + open, + onOpenChange, + organizationId, + onSuccess, +}: DocumentUploadDialogProps) { + const { t: tDocuments } = useT('documents'); + const { t: tCommon } = useT('common'); + + const [selectedTeams, setSelectedTeams] = useState>(new Set()); + const [selectedFiles, setSelectedFiles] = useState([]); + const fileInputRef = useRef(null); + + // Fetch user's teams via Convex query + const teamsResult = useQuery( + api.member.getMyTeams, + open ? { organizationId } : 'skip', + ); + const teams = teamsResult?.teams ?? null; + const isLoadingTeams = teamsResult === undefined; + + const { uploadFiles, isUploading } = useDocumentUpload({ + organizationId, + onSuccess: () => { + onSuccess?.(); + onOpenChange(false); + }, + }); + + // Reset state when dialog closes + const handleOpenChange = useCallback((newOpen: boolean) => { + if (!newOpen) { + setSelectedTeams(new Set()); + setSelectedFiles([]); + } + onOpenChange(newOpen); + }, [onOpenChange]); + + const handleToggleTeam = useCallback((teamId: string) => { + setSelectedTeams((prev) => { + const next = new Set(prev); + if (next.has(teamId)) { + next.delete(teamId); + } else { + next.add(teamId); + } + return next; + }); + }, []); + + const handleFileSelect = useCallback(() => { + fileInputRef.current?.click(); + }, []); + + const handleFileChange = useCallback((event: ChangeEvent) => { + const files = Array.from(event.target.files || []); + if (files.length === 0) return; + + // Filter out files that are too large + const validFiles = files.filter((file) => file.size <= MAX_FILE_SIZE_BYTES); + setSelectedFiles((prev) => [...prev, ...validFiles]); + + // Reset the input + if (event.target) { + event.target.value = ''; + } + }, []); + + const handleRemoveFile = useCallback((index: number) => { + setSelectedFiles((prev) => prev.filter((_, i) => i !== index)); + }, []); + + const handleSubmit = useCallback(async (e: React.FormEvent) => { + e.preventDefault(); + + if (selectedFiles.length === 0) return; + + const teamTags = selectedTeams.size > 0 ? Array.from(selectedTeams) : undefined; + await uploadFiles(selectedFiles, { teamTags }); + }, [selectedFiles, selectedTeams, uploadFiles]); + + const formatFileSize = (bytes: number) => { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + }; + + const hasFiles = selectedFiles.length > 0; + + return ( + + + {/* File selection area */} +
+
+ +

{tCommon('upload.clickToUpload')}

+

+ {tDocuments('upload.fromComputerDescription')} +

+
+ + +
+ + {/* Selected files list */} + {selectedFiles.length > 0 && ( +
+

+ {tDocuments('upload.uploadingCount', { count: selectedFiles.length })} +

+
+ {selectedFiles.map((file, index) => ( +
+ + {file.name} + + {formatFileSize(file.size)} + + +
+ ))} +
+
+ )} + + {/* Team selection */} +
+

+ {tDocuments('upload.selectTeams')} +

+

+ {tDocuments('upload.selectTeamsDescription')} +

+ + {isLoadingTeams ? ( +
+ + {tCommon('actions.loading')} + +
+ ) : !teams || teams.length === 0 ? ( +
+ +

+ {tDocuments('upload.noTeamsAvailable')} +

+
+ ) : ( + + {teams.map((team) => ( + + ))} + + )} + +

+ {tDocuments('upload.allMembersHint')} +

+
+
+
+ ); +} diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx index c03956920..20a1da1e1 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx @@ -1,18 +1,21 @@ 'use client'; -import { useState, useRef, useCallback, useMemo } from 'react'; +import { useState, useMemo, useCallback } from 'react'; import dynamic from 'next/dynamic'; import { Plus, HardDrive } from 'lucide-react'; import { DataTableActionMenu, type DataTableActionMenuItem } from '@/components/ui/data-table/data-table-action-menu'; import { OneDriveIcon } from '@/components/icons/onedrive-icon'; -import { useDocumentUpload } from '../hooks/use-document-upload'; import { useT } from '@/lib/i18n/client'; -// Lazy-load OneDrive dialog to reduce initial bundle size +// Lazy-load dialogs to reduce initial bundle size const OneDriveImportDialog = dynamic( () => import('./onedrive-import-dialog').then(mod => ({ default: mod.OneDriveImportDialog })), ); +const DocumentUploadDialog = dynamic( + () => import('./document-upload-dialog').then(mod => ({ default: mod.DocumentUploadDialog })), +); + export interface DocumentsActionMenuProps { organizationId: string; hasMicrosoftAccount?: boolean; @@ -23,32 +26,13 @@ export function DocumentsActionMenu({ hasMicrosoftAccount, }: DocumentsActionMenuProps) { const { t: tDocuments } = useT('documents'); - const fileInputRef = useRef(null); const [isOneDriveDialogOpen, setIsOneDriveDialogOpen] = useState(false); + const [isUploadDialogOpen, setIsUploadDialogOpen] = useState(false); - // Data refresh happens automatically via Convex reactivity when documents page uses preloadQuery - const { uploadFiles, isUploading } = useDocumentUpload({ - organizationId, - }); - - const handleFileSelect = useCallback(() => { - fileInputRef.current?.click(); + const handleDeviceUpload = useCallback(() => { + setIsUploadDialogOpen(true); }, []); - const handleFileChange = useCallback(async ( - event: React.ChangeEvent, - ) => { - const files = Array.from(event.target.files || []) as File[]; - if (files.length === 0) return; - - await uploadFiles(files); - - // Reset the input - if (event.target) { - event.target.value = ''; - } - }, [uploadFiles]); - const handleOneDriveClick = useCallback(() => { setIsOneDriveDialogOpen(true); }, []); @@ -63,8 +47,7 @@ export function DocumentsActionMenu({ { label: tDocuments('upload.fromYourDevice'), icon: HardDrive, - onClick: handleFileSelect, - disabled: isUploading, + onClick: handleDeviceUpload, }, ]; @@ -77,7 +60,7 @@ export function DocumentsActionMenu({ } return items; - }, [tDocuments, handleFileSelect, handleOneDriveClick, hasMicrosoftAccount, isUploading]); + }, [tDocuments, handleDeviceUpload, handleOneDriveClick, hasMicrosoftAccount]); return ( <> @@ -87,22 +70,10 @@ export function DocumentsActionMenu({ menuItems={menuItems} /> - {isUploading && ( -
-
- {tDocuments('upload.uploading')} -
-
- )} - - {isOneDriveDialogOpen && ( diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx index ad9dba611..6efa29dd5 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useRef } from 'react'; +import { useState } from 'react'; import dynamic from 'next/dynamic'; import { NavigationMenu, @@ -13,10 +13,9 @@ import { import { Button } from '@/components/ui/primitives/button'; import { OneDriveIcon } from '@/components/icons/onedrive-icon'; import { HardDrive, Plus } from 'lucide-react'; -import { useDocumentUpload } from '../hooks/use-document-upload'; import { useT } from '@/lib/i18n/client'; -// Lazy-load OneDrive dialog to reduce initial bundle size +// Lazy-load dialogs to reduce initial bundle size const OneDriveImportDialog = dynamic( () => import('./onedrive-import-dialog').then((mod) => ({ @@ -24,6 +23,13 @@ const OneDriveImportDialog = dynamic( })), ); +const DocumentUploadDialog = dynamic( + () => + import('./document-upload-dialog').then((mod) => ({ + default: mod.DocumentUploadDialog, + })), +); + interface ImportDocumentsMenuProps { organizationId: string; hasMicrosoftAccount?: boolean; @@ -34,33 +40,16 @@ export function ImportDocumentsMenu({ hasMicrosoftAccount, }: ImportDocumentsMenuProps) { const { t } = useT('documents'); - const fileInputRef = useRef(null); const [isOneDriveImportDialogOpen, setIsOneDriveImportDialogOpen] = useState(false); - const { uploadFiles, isUploading } = useDocumentUpload({ - organizationId, - }); + const [isUploadDialogOpen, setIsUploadDialogOpen] = useState(false); const handleUploadComplete = () => { setIsOneDriveImportDialogOpen(false); }; - const handleFileSelect = () => { - fileInputRef.current?.click(); - }; - - const handleFileChange = async ( - event: React.ChangeEvent, - ) => { - const files = Array.from(event.target.files || []) as File[]; - if (files.length === 0) return; - - await uploadFiles(files); - - // Reset the input - if (event.target) { - event.target.value = ''; - } + const handleDeviceUpload = () => { + setIsUploadDialogOpen(true); }; const connectOneDrive = () => { @@ -85,8 +74,7 @@ export function ImportDocumentsMenu({ + )} + + + + + {!isExternallyManaged && ( + + )} + + ); +} diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/hooks/use-list-teams.ts b/services/platform/app/(app)/dashboard/[id]/settings/teams/hooks/use-list-teams.ts new file mode 100644 index 000000000..3c5b4a5f1 --- /dev/null +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/hooks/use-list-teams.ts @@ -0,0 +1,29 @@ +'use client'; + +import { useQuery } from 'convex/react'; +import { api } from '@/convex/_generated/api'; + +export interface Team { + id: string; + name: string; +} + +/** + * Hook to get teams for the current user. + * + * In trusted headers mode, teams come from JWT claims (trustedTeams). + * In normal auth mode, teams come from the teamMember database table. + */ +export function useListTeams(organizationId: string | undefined) { + const result = useQuery( + api.member.getMyTeams, + organizationId ? { organizationId } : 'skip', + ); + + return { + teams: result?.teams ?? null, + isLoading: result === undefined, + /** True if teams are managed by external IdP (trusted headers mode) */ + isExternallyManaged: result?.isExternallyManaged ?? false, + }; +} diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/page.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/page.tsx new file mode 100644 index 000000000..2660900f0 --- /dev/null +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/page.tsx @@ -0,0 +1,96 @@ +import { Suspense } from 'react'; +import { redirect } from 'next/navigation'; +import { getAuthToken } from '@/lib/auth/auth-server'; +import { fetchQuery } from '@/lib/convex-next-server'; +import { api } from '@/convex/_generated/api'; +import { Skeleton } from '@/components/ui/feedback/skeleton'; +import { Stack, HStack } from '@/components/ui/layout/layout'; +import { DataTableSkeleton } from '@/components/ui/data-table/data-table-skeleton'; +import { AccessDenied } from '@/components/layout/access-denied'; +import { getT } from '@/lib/i18n/server'; +import { TeamsSettings } from './components/teams-settings'; +import type { Metadata } from 'next'; + +// This page requires authentication (cookies/connection), so it must be dynamic +export const dynamic = 'force-dynamic'; + +export async function generateMetadata(): Promise { + const { t } = await getT('metadata'); + return { + title: t('teams.title'), + description: t('teams.description'), + }; +} + +interface TeamsSettingsPageProps { + params: Promise<{ id: string }>; +} + +/** + * Skeleton for the teams settings page. + */ +async function TeamsSettingsSkeleton() { + const { t } = await getT('settings'); + return ( + + + + + + + + + + + + + + ); +} + +interface TeamsSettingsContentProps { + params: Promise<{ id: string }>; +} + +async function TeamsSettingsPageContent({ + params, +}: TeamsSettingsContentProps) { + const token = await getAuthToken(); + const { id: organizationId } = await params; + if (!token) { + redirect('/log-in'); + } + + // Check if user is admin + const memberContext = await fetchQuery( + api.member.getCurrentMemberContext, + { organizationId }, + { token }, + ); + + // Only Admin can access teams settings + if (!memberContext.isAdmin) { + const { t } = await getT('accessDenied'); + return ; + } + + return ; +} + +export default function TeamsSettingsPage({ + params, +}: TeamsSettingsPageProps) { + return ( + }> + + + ); +} diff --git a/services/platform/convex/_generated/api.d.ts b/services/platform/convex/_generated/api.d.ts index 45149eb8c..e32902418 100644 --- a/services/platform/convex/_generated/api.d.ts +++ b/services/platform/convex/_generated/api.d.ts @@ -128,6 +128,7 @@ import type * as lib_crypto_get_secret_key from "../lib/crypto/get_secret_key.js import type * as lib_crypto_hex_to_bytes from "../lib/crypto/hex_to_bytes.js"; import type * as lib_debug_log from "../lib/debug_log.js"; import type * as lib_error_classification from "../lib/error_classification.js"; +import type * as lib_get_user_teams from "../lib/get_user_teams.js"; import type * as lib_metadata_get_metadata_string from "../lib/metadata/get_metadata_string.js"; import type * as lib_openai_provider from "../lib/openai_provider.js"; import type * as lib_pagination_helpers from "../lib/pagination/helpers.js"; @@ -137,9 +138,11 @@ import type * as lib_query_builder_build_query from "../lib/query_builder/build_ import type * as lib_query_builder_index from "../lib/query_builder/index.js"; import type * as lib_query_builder_select_index from "../lib/query_builder/select_index.js"; import type * as lib_query_builder_types from "../lib/query_builder/types.js"; +import type * as lib_rag_prefetch_index from "../lib/rag_prefetch/index.js"; import type * as lib_rate_limiter_helpers from "../lib/rate_limiter/helpers.js"; import type * as lib_rate_limiter_index from "../lib/rate_limiter/index.js"; import type * as lib_rls_auth_get_authenticated_user from "../lib/rls/auth/get_authenticated_user.js"; +import type * as lib_rls_auth_get_trusted_auth_data from "../lib/rls/auth/get_trusted_auth_data.js"; import type * as lib_rls_auth_require_authenticated_user from "../lib/rls/auth/require_authenticated_user.js"; import type * as lib_rls_context_create_org_query_builder from "../lib/rls/context/create_org_query_builder.js"; import type * as lib_rls_context_create_rls_context from "../lib/rls/context/create_rls_context.js"; @@ -260,6 +263,7 @@ import type * as model_documents_get_document_by_path from "../model/documents/g import type * as model_documents_get_documents from "../model/documents/get_documents.js"; import type * as model_documents_get_documents_cursor from "../model/documents/get_documents_cursor.js"; import type * as model_documents_get_onedrive_sync_configs from "../model/documents/get_onedrive_sync_configs.js"; +import type * as model_documents_get_user_names_batch from "../model/documents/get_user_names_batch.js"; import type * as model_documents_index from "../model/documents/index.js"; import type * as model_documents_list_documents_by_extension from "../model/documents/list_documents_by_extension.js"; import type * as model_documents_query_documents from "../model/documents/query_documents.js"; @@ -389,6 +393,7 @@ import type * as model_trusted_headers_authenticate_create_session_for_trusted_u import type * as model_trusted_headers_authenticate_find_or_create_user_from_headers from "../model/trusted_headers_authenticate/find_or_create_user_from_headers.js"; import type * as model_trusted_headers_authenticate_get_user_by_id from "../model/trusted_headers_authenticate/get_user_by_id.js"; import type * as model_trusted_headers_authenticate_index from "../model/trusted_headers_authenticate/index.js"; +import type * as model_trusted_headers_authenticate_resolve_team_names from "../model/trusted_headers_authenticate/resolve_team_names.js"; import type * as model_trusted_headers_authenticate_trusted_headers_authenticate from "../model/trusted_headers_authenticate/trusted_headers_authenticate.js"; import type * as model_users_add_member_internal from "../model/users/add_member_internal.js"; import type * as model_users_create_member from "../model/users/create_member.js"; @@ -575,6 +580,7 @@ import type * as predefined_workflows_website_scan from "../predefined_workflows import type * as predefined_workflows_workflow_rag_sync from "../predefined_workflows/workflow_rag_sync.js"; import type * as products from "../products.js"; import type * as streaming from "../streaming.js"; +import type * as team_members from "../team_members.js"; import type * as threads from "../threads.js"; import type * as tone_of_voice from "../tone_of_voice.js"; import type * as trusted_headers_authenticate from "../trusted_headers_authenticate.js"; @@ -864,6 +870,7 @@ declare const fullApi: ApiFromModules<{ "lib/crypto/hex_to_bytes": typeof lib_crypto_hex_to_bytes; "lib/debug_log": typeof lib_debug_log; "lib/error_classification": typeof lib_error_classification; + "lib/get_user_teams": typeof lib_get_user_teams; "lib/metadata/get_metadata_string": typeof lib_metadata_get_metadata_string; "lib/openai_provider": typeof lib_openai_provider; "lib/pagination/helpers": typeof lib_pagination_helpers; @@ -873,9 +880,11 @@ declare const fullApi: ApiFromModules<{ "lib/query_builder/index": typeof lib_query_builder_index; "lib/query_builder/select_index": typeof lib_query_builder_select_index; "lib/query_builder/types": typeof lib_query_builder_types; + "lib/rag_prefetch/index": typeof lib_rag_prefetch_index; "lib/rate_limiter/helpers": typeof lib_rate_limiter_helpers; "lib/rate_limiter/index": typeof lib_rate_limiter_index; "lib/rls/auth/get_authenticated_user": typeof lib_rls_auth_get_authenticated_user; + "lib/rls/auth/get_trusted_auth_data": typeof lib_rls_auth_get_trusted_auth_data; "lib/rls/auth/require_authenticated_user": typeof lib_rls_auth_require_authenticated_user; "lib/rls/context/create_org_query_builder": typeof lib_rls_context_create_org_query_builder; "lib/rls/context/create_rls_context": typeof lib_rls_context_create_rls_context; @@ -996,6 +1005,7 @@ declare const fullApi: ApiFromModules<{ "model/documents/get_documents": typeof model_documents_get_documents; "model/documents/get_documents_cursor": typeof model_documents_get_documents_cursor; "model/documents/get_onedrive_sync_configs": typeof model_documents_get_onedrive_sync_configs; + "model/documents/get_user_names_batch": typeof model_documents_get_user_names_batch; "model/documents/index": typeof model_documents_index; "model/documents/list_documents_by_extension": typeof model_documents_list_documents_by_extension; "model/documents/query_documents": typeof model_documents_query_documents; @@ -1125,6 +1135,7 @@ declare const fullApi: ApiFromModules<{ "model/trusted_headers_authenticate/find_or_create_user_from_headers": typeof model_trusted_headers_authenticate_find_or_create_user_from_headers; "model/trusted_headers_authenticate/get_user_by_id": typeof model_trusted_headers_authenticate_get_user_by_id; "model/trusted_headers_authenticate/index": typeof model_trusted_headers_authenticate_index; + "model/trusted_headers_authenticate/resolve_team_names": typeof model_trusted_headers_authenticate_resolve_team_names; "model/trusted_headers_authenticate/trusted_headers_authenticate": typeof model_trusted_headers_authenticate_trusted_headers_authenticate; "model/users/add_member_internal": typeof model_users_add_member_internal; "model/users/create_member": typeof model_users_create_member; @@ -1311,6 +1322,7 @@ declare const fullApi: ApiFromModules<{ "predefined_workflows/workflow_rag_sync": typeof predefined_workflows_workflow_rag_sync; products: typeof products; streaming: typeof streaming; + team_members: typeof team_members; threads: typeof threads; tone_of_voice: typeof tone_of_voice; trusted_headers_authenticate: typeof trusted_headers_authenticate; @@ -1523,10 +1535,13 @@ export declare const components: { | { data: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt: number; expiresAt: number; ipAddress?: null | string; token: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt: number; userAgent?: null | string; userId: string; @@ -1563,6 +1578,7 @@ export declare const components: { | { data: { createdAt: number; + expiresAt?: null | number; privateKey: string; publicKey: string; }; @@ -1578,6 +1594,23 @@ export declare const components: { }; model: "organization"; } + | { + data: { + createdAt: number; + name: string; + organizationId: string; + updatedAt?: null | number; + }; + model: "team"; + } + | { + data: { + createdAt?: null | number; + teamId: string; + userId: string; + }; + model: "teamMember"; + } | { data: { createdAt: number; @@ -1589,12 +1622,14 @@ export declare const components: { } | { data: { + createdAt: number; email: string; expiresAt: number; inviterId: string; organizationId: string; role?: null | string; status: string; + teamId?: null | string; }; model: "invitation"; }; @@ -1655,6 +1690,9 @@ export declare const components: { | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -1752,7 +1790,12 @@ export declare const components: { model: "jwks"; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -1806,6 +1849,63 @@ export declare const components: { | null; }>; } + | { + model: "team"; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; where?: Array<{ @@ -1845,8 +1945,10 @@ export declare const components: { | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -1934,6 +2036,9 @@ export declare const components: { | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -2031,7 +2136,12 @@ export declare const components: { model: "jwks"; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -2085,6 +2195,63 @@ export declare const components: { | null; }>; } + | { + model: "team"; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; where?: Array<{ @@ -2124,8 +2291,10 @@ export declare const components: { | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -2166,6 +2335,8 @@ export declare const components: { | "verification" | "jwks" | "organization" + | "team" + | "teamMember" | "member" | "invitation"; offset?: number; @@ -2216,6 +2387,8 @@ export declare const components: { | "verification" | "jwks" | "organization" + | "team" + | "teamMember" | "member" | "invitation"; select?: Array; @@ -2297,10 +2470,13 @@ export declare const components: { model: "session"; update: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt?: number; expiresAt?: number; ipAddress?: null | string; token?: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt?: number; userAgent?: null | string; userId?: string; @@ -2316,6 +2492,9 @@ export declare const components: { | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -2434,12 +2613,18 @@ export declare const components: { model: "jwks"; update: { createdAt?: number; + expiresAt?: null | number; privateKey?: string; publicKey?: string; }; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -2500,6 +2685,74 @@ export declare const components: { | null; }>; } + | { + model: "team"; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; update: { @@ -2540,12 +2793,14 @@ export declare const components: { | { model: "invitation"; update: { + createdAt?: number; email?: string; expiresAt?: number; inviterId?: string; organizationId?: string; role?: null | string; status?: string; + teamId?: null | string; }; where?: Array<{ connector?: "AND" | "OR"; @@ -2553,8 +2808,10 @@ export declare const components: { | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -2642,10 +2899,13 @@ export declare const components: { model: "session"; update: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt?: number; expiresAt?: number; ipAddress?: null | string; token?: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt?: number; userAgent?: null | string; userId?: string; @@ -2661,6 +2921,9 @@ export declare const components: { | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -2779,12 +3042,18 @@ export declare const components: { model: "jwks"; update: { createdAt?: number; + expiresAt?: null | number; privateKey?: string; publicKey?: string; }; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -2845,6 +3114,74 @@ export declare const components: { | null; }>; } + | { + model: "team"; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; update: { @@ -2885,12 +3222,14 @@ export declare const components: { | { model: "invitation"; update: { + createdAt?: number; email?: string; expiresAt?: number; inviterId?: string; organizationId?: string; role?: null | string; status?: string; + teamId?: null | string; }; where?: Array<{ connector?: "AND" | "OR"; @@ -2898,8 +3237,10 @@ export declare const components: { | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: diff --git a/services/platform/convex/agent_tools/integrations/integration_tool.ts b/services/platform/convex/agent_tools/integrations/integration_tool.ts index 37fb0d5e3..ee12e852f 100644 --- a/services/platform/convex/agent_tools/integrations/integration_tool.ts +++ b/services/platform/convex/agent_tools/integrations/integration_tool.ts @@ -46,10 +46,9 @@ Write operations create approval cards. Use integration_batch for multiple paral ctx: ToolCtx, args, ): Promise => { - // Extract parentThreadId from extended context (set by integration_assistant_tool) + // parentThreadId comes from extended context (set by integration_assistant_tool) // This ensures approval cards are linked to the parent thread, not the sub-thread - const ctxWithParent = ctx as ToolCtx & { parentThreadId?: string }; - const { organizationId, threadId: currentThreadId, messageId, parentThreadId } = ctxWithParent; + const { organizationId, threadId: currentThreadId, messageId, parentThreadId } = ctx; const threadId = parentThreadId ?? currentThreadId; console.log('[integration_tool] Context:', { diff --git a/services/platform/convex/agent_tools/rag/query_rag_context.ts b/services/platform/convex/agent_tools/rag/query_rag_context.ts index d20be40ec..30fa2479f 100644 --- a/services/platform/convex/agent_tools/rag/query_rag_context.ts +++ b/services/platform/convex/agent_tools/rag/query_rag_context.ts @@ -132,6 +132,16 @@ Current question: ${currentQuery}`; return expandedQuery; } +/** + * Options for multi-tenant RAG context queries. + */ +export interface RagContextOptions { + /** User ID for multi-tenant search */ + userId?: string; + /** List of dataset names to search within */ + datasets?: string[]; +} + /** * Query the RAG service for relevant context based on the user's message. * Returns formatted context string that can be injected into the agent's context. @@ -141,6 +151,7 @@ Current question: ${currentQuery}`; * @param similarityThreshold - Minimum similarity score (default: 0.3) * @param signal - Optional AbortSignal for timeout control * @param recentMessages - Optional recent conversation messages for context expansion + * @param options - Optional multi-tenant options (userId, datasets) * @returns Formatted context string or undefined if no relevant results */ export async function queryRagContext( @@ -149,6 +160,7 @@ export async function queryRagContext( similarityThreshold: number = DEFAULT_SIMILARITY_THRESHOLD, signal?: AbortSignal, recentMessages?: RecentMessage[], + options?: RagContextOptions, ): Promise { try { const ragServiceUrl = getRagServiceUrl(); @@ -174,17 +186,28 @@ export async function queryRagContext( const fetchSignal = signal || controller.signal; try { + // Build request payload with multi-tenant support + const requestPayload: Record = { + query: expandedQuery, + top_k: topK, + similarity_threshold: similarityThreshold, + include_metadata: true, + }; + + // Add multi-tenant parameters if provided + if (options?.userId) { + requestPayload.user_id = options.userId; + } + if (options?.datasets && options.datasets.length > 0) { + requestPayload.datasets = options.datasets; + } + const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify({ - query: expandedQuery, - top_k: topK, - similarity_threshold: similarityThreshold, - include_metadata: true, - }), + body: JSON.stringify(requestPayload), signal: fetchSignal, }); diff --git a/services/platform/convex/agent_tools/rag/rag_search_tool.ts b/services/platform/convex/agent_tools/rag/rag_search_tool.ts index a2dc33bb2..c8fa8968a 100644 --- a/services/platform/convex/agent_tools/rag/rag_search_tool.ts +++ b/services/platform/convex/agent_tools/rag/rag_search_tool.ts @@ -2,13 +2,17 @@ * Convex Tool: RAG Search * * Search the RAG knowledge base for relevant context using semantic search. + * Uses team IDs passed from the parent context (resolved in mutation where auth identity is available). */ import { z } from 'zod'; import { createTool } from '@convex-dev/agent'; import type { ToolCtx } from '@convex-dev/agent'; import type { ToolDefinition } from '../types'; - +import { + DEFAULT_DATASET_NAME, + teamIdToDatasetName, +} from '../../lib/get_user_teams'; import { createDebugLog } from '../../lib/debug_log'; const debugLog = createDebugLog('DEBUG_AGENT_TOOLS', '[AgentTools]'); @@ -29,15 +33,10 @@ interface QueryResponse { } /** - * Get RAG service URL from environment or variables + * Get RAG service URL from environment variable */ -function getRagServiceUrl(variables?: Record): string { - const url = - (variables?.ragServiceUrl as string) || - process.env.RAG_URL || - 'http://localhost:8001'; - - return url; +function getRagServiceUrl(): string { + return process.env.RAG_URL || 'http://localhost:8001'; } export const ragSearchTool = { @@ -90,30 +89,78 @@ Returns the most relevant document chunks based on semantic similarity to your q .describe('Whether to include metadata in results (default: true)'), }), handler: async (ctx: ToolCtx, args): Promise => { - // Get variables from context (injected by agent caller) - const { variables } = ctx; - - const ragServiceUrl = getRagServiceUrl(variables); + // Get user ID, team IDs, and prefetch cache from context + // userId is provided by Agent SDK from thread.userId + // userTeamIds is passed from generateAgentResponse (resolved in mutation where auth identity is available) + // ragPrefetchCache is set by generateAgentResponse for the first call + const { userId, userTeamIds, ragPrefetchCache } = ctx; debugLog('tool:rag_search start', { query: args.query, top_k: args.top_k, - ragServiceUrl, + hasPrefetchCache: !!ragPrefetchCache, + prefetchConsumed: ragPrefetchCache?.consumed, }); + // First call: use prefetched result if available + if (ragPrefetchCache && !ragPrefetchCache.consumed) { + ragPrefetchCache.consumed = true; + + try { + const result = await ragPrefetchCache.promise; + + debugLog('tool:rag_search using prefetched result (first call)', { + aiQuery: args.query, + prefetchAge: Date.now() - ragPrefetchCache.timestamp, + total_results: result.total_results, + processing_time_ms: result.processing_time_ms, + }); + + return result; + } catch (error) { + // Prefetch failed, fall through to make a fresh request + debugLog('tool:rag_search prefetch failed, making fresh request', { + error: error instanceof Error ? error.message : String(error), + }); + } + } + + // Subsequent calls or no prefetch: make a fresh request + const ragServiceUrl = getRagServiceUrl(); const url = `${ragServiceUrl}/api/v1/search`; // Default similarity_threshold of 0.3 balances recall and precision: // - Lower values (< 0.3) include more marginal matches, increasing noise // - Higher values (> 0.5) filter too aggressively, missing relevant results // - 0.3 is a common baseline for embedding-based search with cosine similarity - const payload = { + const payload: Record = { query: args.query, top_k: args.top_k || 5, similarity_threshold: args.similarity_threshold ?? 0.3, include_metadata: args.include_metadata !== false, }; + if (!userId) { + throw new Error( + 'rag_search requires userId in ToolCtx. ' + + 'Ensure the thread was created with a userId.' + ); + } + + payload.user_id = userId; + + // Build searchable datasets from user's team IDs + // Always include the default org-level dataset + team-specific datasets + const teamDatasets = (userTeamIds ?? []).map(teamIdToDatasetName); + const datasets = [DEFAULT_DATASET_NAME, ...teamDatasets]; + + payload.datasets = datasets; + debugLog('tool:rag_search datasets resolved', { + userId, + userTeamIds, + datasets, + }); + try { const response = await fetch(url, { method: 'POST', diff --git a/services/platform/convex/agent_tools/workflows/create_workflow_tool.ts b/services/platform/convex/agent_tools/workflows/create_workflow_tool.ts index 4355827dc..31ecd68dd 100644 --- a/services/platform/convex/agent_tools/workflows/create_workflow_tool.ts +++ b/services/platform/convex/agent_tools/workflows/create_workflow_tool.ts @@ -105,10 +105,9 @@ Reference: generalCustomerStatusAssessment, productRecommendationEmail`, validationErrors?: string[]; validationWarnings?: string[]; }> => { - // Use parentThreadId if available (when running as sub-agent), otherwise use threadId + // parentThreadId comes from extended context (when running as sub-agent) // This ensures approvals are linked to the parent conversation thread - const ctxWithParent = ctx as ToolCtx & { parentThreadId?: string }; - const { organizationId, threadId: currentThreadId, parentThreadId } = ctxWithParent; + const { organizationId, threadId: currentThreadId, parentThreadId } = ctx; const threadId = parentThreadId ?? currentThreadId; if (!organizationId) { diff --git a/services/platform/convex/auth.ts b/services/platform/convex/auth.ts index 659953d3e..81db68405 100644 --- a/services/platform/convex/auth.ts +++ b/services/platform/convex/auth.ts @@ -242,16 +242,40 @@ export const getAuthOptions = (ctx: GenericCtx) => { // Force secure cookies when running over HTTPS (this adds __Secure- prefix automatically) useSecureCookies: isHttps, }, + session: { + additionalFields: { + trustedRole: { + type: 'string' as const, + required: false, + }, + trustedTeams: { + type: 'string' as const, + required: false, + }, + }, + }, plugins: [ // The Convex plugin is required for Convex compatibility convex({ authConfig, + jwt: { + definePayload: ({ user, session }) => ({ + email: user.email, + name: user.name, + trustedRole: (session as any).trustedRole, + trustedTeams: (session as any).trustedTeams, + }), + }, }), organization({ ac, roles: orgRoles, // Set the default role for organization creators to admin creatorRole: 'admin', + // Enable teams for multi-tenancy support (team-level data isolation) + teams: { + enabled: true, + }, }), ], }; diff --git a/services/platform/convex/betterAuth/_generated/api.ts b/services/platform/convex/betterAuth/_generated/api.ts index 9d040567e..0bb41631e 100644 --- a/services/platform/convex/betterAuth/_generated/api.ts +++ b/services/platform/convex/betterAuth/_generated/api.ts @@ -9,6 +9,8 @@ */ import type * as adapter from "../adapter.js"; +import type * as auth from "../auth.js"; +import type * as generated_schema from "../generated_schema.js"; import type { ApiFromModules, @@ -19,6 +21,8 @@ import { anyApi, componentsGeneric } from "convex/server"; const fullApi: ApiFromModules<{ adapter: typeof adapter; + auth: typeof auth; + generated_schema: typeof generated_schema; }> = anyApi as any; /** diff --git a/services/platform/convex/betterAuth/_generated/component.ts b/services/platform/convex/betterAuth/_generated/component.ts index 44196488e..6eb4ff2b1 100644 --- a/services/platform/convex/betterAuth/_generated/component.ts +++ b/services/platform/convex/betterAuth/_generated/component.ts @@ -44,10 +44,13 @@ export type ComponentApi = | { data: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt: number; expiresAt: number; ipAddress?: null | string; token: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt: number; userAgent?: null | string; userId: string; @@ -84,6 +87,7 @@ export type ComponentApi = | { data: { createdAt: number; + expiresAt?: null | number; privateKey: string; publicKey: string; }; @@ -99,6 +103,23 @@ export type ComponentApi = }; model: "organization"; } + | { + data: { + createdAt: number; + name: string; + organizationId: string; + updatedAt?: null | number; + }; + model: "team"; + } + | { + data: { + createdAt?: null | number; + teamId: string; + userId: string; + }; + model: "teamMember"; + } | { data: { createdAt: number; @@ -110,12 +131,14 @@ export type ComponentApi = } | { data: { + createdAt: number; email: string; expiresAt: number; inviterId: string; organizationId: string; role?: null | string; status: string; + teamId?: null | string; }; model: "invitation"; }; @@ -177,6 +200,9 @@ export type ComponentApi = | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -274,7 +300,12 @@ export type ComponentApi = model: "jwks"; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -328,6 +359,63 @@ export type ComponentApi = | null; }>; } + | { + model: "team"; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; where?: Array<{ @@ -367,8 +455,10 @@ export type ComponentApi = | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -457,6 +547,9 @@ export type ComponentApi = | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -554,7 +647,12 @@ export type ComponentApi = model: "jwks"; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -608,6 +706,63 @@ export type ComponentApi = | null; }>; } + | { + model: "team"; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; where?: Array<{ @@ -647,8 +802,10 @@ export type ComponentApi = | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -690,6 +847,8 @@ export type ComponentApi = | "verification" | "jwks" | "organization" + | "team" + | "teamMember" | "member" | "invitation"; offset?: number; @@ -741,6 +900,8 @@ export type ComponentApi = | "verification" | "jwks" | "organization" + | "team" + | "teamMember" | "member" | "invitation"; select?: Array; @@ -823,10 +984,13 @@ export type ComponentApi = model: "session"; update: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt?: number; expiresAt?: number; ipAddress?: null | string; token?: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt?: number; userAgent?: null | string; userId?: string; @@ -842,6 +1006,9 @@ export type ComponentApi = | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -960,12 +1127,18 @@ export type ComponentApi = model: "jwks"; update: { createdAt?: number; + expiresAt?: null | number; privateKey?: string; publicKey?: string; }; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -1026,6 +1199,74 @@ export type ComponentApi = | null; }>; } + | { + model: "team"; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; update: { @@ -1066,12 +1307,14 @@ export type ComponentApi = | { model: "invitation"; update: { + createdAt?: number; email?: string; expiresAt?: number; inviterId?: string; organizationId?: string; role?: null | string; status?: string; + teamId?: null | string; }; where?: Array<{ connector?: "AND" | "OR"; @@ -1079,8 +1322,10 @@ export type ComponentApi = | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: @@ -1169,10 +1414,13 @@ export type ComponentApi = model: "session"; update: { activeOrganizationId?: null | string; + activeTeamId?: null | string; createdAt?: number; expiresAt?: number; ipAddress?: null | string; token?: string; + trustedRole?: null | string; + trustedTeams?: null | string; updatedAt?: number; userAgent?: null | string; userId?: string; @@ -1188,6 +1436,9 @@ export type ComponentApi = | "userAgent" | "userId" | "activeOrganizationId" + | "activeTeamId" + | "trustedRole" + | "trustedTeams" | "_id"; operator?: | "lt" @@ -1306,12 +1557,18 @@ export type ComponentApi = model: "jwks"; update: { createdAt?: number; + expiresAt?: null | number; privateKey?: string; publicKey?: string; }; where?: Array<{ connector?: "AND" | "OR"; - field: "publicKey" | "privateKey" | "createdAt" | "_id"; + field: + | "publicKey" + | "privateKey" + | "createdAt" + | "expiresAt" + | "_id"; operator?: | "lt" | "lte" @@ -1372,6 +1629,74 @@ export type ComponentApi = | null; }>; } + | { + model: "team"; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: + | "name" + | "organizationId" + | "createdAt" + | "updatedAt" + | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: "teamId" | "userId" | "createdAt" | "_id"; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "not_in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } | { model: "member"; update: { @@ -1412,12 +1737,14 @@ export type ComponentApi = | { model: "invitation"; update: { + createdAt?: number; email?: string; expiresAt?: number; inviterId?: string; organizationId?: string; role?: null | string; status?: string; + teamId?: null | string; }; where?: Array<{ connector?: "AND" | "OR"; @@ -1425,8 +1752,10 @@ export type ComponentApi = | "organizationId" | "email" | "role" + | "teamId" | "status" | "expiresAt" + | "createdAt" | "inviterId" | "_id"; operator?: diff --git a/services/platform/convex/betterAuth/auth.ts b/services/platform/convex/betterAuth/auth.ts new file mode 100644 index 000000000..e3695f122 --- /dev/null +++ b/services/platform/convex/betterAuth/auth.ts @@ -0,0 +1,4 @@ +import { createAuth } from '../auth' + +// Export a static instance for Better Auth schema generation +export const auth = createAuth({} as any) \ No newline at end of file diff --git a/services/platform/convex/betterAuth/generated_schema.ts b/services/platform/convex/betterAuth/generated_schema.ts new file mode 100644 index 000000000..d376172d2 --- /dev/null +++ b/services/platform/convex/betterAuth/generated_schema.ts @@ -0,0 +1,129 @@ +/** + * This file is auto-generated. Do not edit this file manually. + * To regenerate the schema, run: + * `npx @better-auth/cli generate --output convex/betterAuth/generated_schema.ts -y` + * + * To customize the schema, generate to an alternate file and import + * the table definitions to your schema file. See + * https://labs.convex.dev/better-auth/features/local-install#adding-custom-indexes. + */ + +import { defineSchema, defineTable } from "convex/server"; +import { v } from "convex/values"; + +export const tables = { + user: defineTable({ + name: v.string(), + email: v.string(), + emailVerified: v.boolean(), + image: v.optional(v.union(v.null(), v.string())), + createdAt: v.number(), + updatedAt: v.number(), + userId: v.optional(v.union(v.null(), v.string())), + }) + .index("email_name", ["email","name"]) + .index("name", ["name"]) + .index("userId", ["userId"]), + session: defineTable({ + expiresAt: v.number(), + token: v.string(), + createdAt: v.number(), + updatedAt: v.number(), + ipAddress: v.optional(v.union(v.null(), v.string())), + userAgent: v.optional(v.union(v.null(), v.string())), + userId: v.string(), + activeOrganizationId: v.optional(v.union(v.null(), v.string())), + activeTeamId: v.optional(v.union(v.null(), v.string())), + trustedRole: v.optional(v.union(v.null(), v.string())), + trustedTeams: v.optional(v.union(v.null(), v.string())), + }) + .index("expiresAt", ["expiresAt"]) + .index("expiresAt_userId", ["expiresAt","userId"]) + .index("token", ["token"]) + .index("userId", ["userId"]), + account: defineTable({ + accountId: v.string(), + providerId: v.string(), + userId: v.string(), + accessToken: v.optional(v.union(v.null(), v.string())), + refreshToken: v.optional(v.union(v.null(), v.string())), + idToken: v.optional(v.union(v.null(), v.string())), + accessTokenExpiresAt: v.optional(v.union(v.null(), v.number())), + refreshTokenExpiresAt: v.optional(v.union(v.null(), v.number())), + scope: v.optional(v.union(v.null(), v.string())), + password: v.optional(v.union(v.null(), v.string())), + createdAt: v.number(), + updatedAt: v.number(), + }) + .index("accountId", ["accountId"]) + .index("accountId_providerId", ["accountId","providerId"]) + .index("providerId_userId", ["providerId","userId"]) + .index("userId", ["userId"]), + verification: defineTable({ + identifier: v.string(), + value: v.string(), + expiresAt: v.number(), + createdAt: v.number(), + updatedAt: v.number(), + }) + .index("expiresAt", ["expiresAt"]) + .index("identifier", ["identifier"]), + jwks: defineTable({ + publicKey: v.string(), + privateKey: v.string(), + createdAt: v.number(), + expiresAt: v.optional(v.union(v.null(), v.number())), + }), + organization: defineTable({ + name: v.string(), + slug: v.string(), + logo: v.optional(v.union(v.null(), v.string())), + createdAt: v.number(), + metadata: v.optional(v.union(v.null(), v.string())), + }) + .index("name", ["name"]) + .index("slug", ["slug"]), + team: defineTable({ + name: v.string(), + organizationId: v.string(), + createdAt: v.number(), + updatedAt: v.optional(v.union(v.null(), v.number())), + }) + .index("organizationId", ["organizationId"]), + teamMember: defineTable({ + teamId: v.string(), + userId: v.string(), + createdAt: v.optional(v.union(v.null(), v.number())), + }) + .index("teamId", ["teamId"]) + .index("userId", ["userId"]), + member: defineTable({ + organizationId: v.string(), + userId: v.string(), + role: v.string(), + createdAt: v.number(), + }) + .index("organizationId", ["organizationId"]) + .index("userId", ["userId"]) + .index("role", ["role"]), + invitation: defineTable({ + organizationId: v.string(), + email: v.string(), + role: v.optional(v.union(v.null(), v.string())), + teamId: v.optional(v.union(v.null(), v.string())), + status: v.string(), + expiresAt: v.number(), + createdAt: v.number(), + inviterId: v.string(), + }) + .index("organizationId", ["organizationId"]) + .index("email", ["email"]) + .index("role", ["role"]) + .index("teamId", ["teamId"]) + .index("status", ["status"]) + .index("inviterId", ["inviterId"]), +}; + +const schema = defineSchema(tables); + +export default schema; diff --git a/services/platform/convex/betterAuth/schema.ts b/services/platform/convex/betterAuth/schema.ts index 4fe18436d..749cd456c 100644 --- a/services/platform/convex/betterAuth/schema.ts +++ b/services/platform/convex/betterAuth/schema.ts @@ -1,101 +1,24 @@ -// This file is auto-generated. Do not edit this file manually. -// To regenerate the schema, run: -// `npx @better-auth/cli generate --output undefined -y` +/** + * Better Auth Schema with Custom Indexes + * + * This file extends the auto-generated schema with custom indexes + * for optimized query performance. + * + * Base schema regeneration: + * cd convex/betterAuth && npx @better-auth/cli generate -y --output generated_schema.ts + */ -import { defineSchema, defineTable } from 'convex/server'; -import { v } from 'convex/values'; +import { defineSchema } from 'convex/server'; +import { tables as generatedTables } from './generated_schema'; +// Extend the generated tables with custom indexes export const tables = { - user: defineTable({ - name: v.string(), - email: v.string(), - emailVerified: v.boolean(), - image: v.optional(v.union(v.null(), v.string())), - createdAt: v.number(), - updatedAt: v.number(), - userId: v.optional(v.union(v.null(), v.string())), - }) - .index('email_name', ['email', 'name']) - .index('name', ['name']) - .index('userId', ['userId']), - session: defineTable({ - expiresAt: v.number(), - token: v.string(), - createdAt: v.number(), - updatedAt: v.number(), - ipAddress: v.optional(v.union(v.null(), v.string())), - userAgent: v.optional(v.union(v.null(), v.string())), - userId: v.string(), - activeOrganizationId: v.optional(v.union(v.null(), v.string())), - }) - .index('expiresAt', ['expiresAt']) - .index('expiresAt_userId', ['expiresAt', 'userId']) - .index('token', ['token']) - .index('userId', ['userId']), - account: defineTable({ - accountId: v.string(), - providerId: v.string(), - userId: v.string(), - accessToken: v.optional(v.union(v.null(), v.string())), - refreshToken: v.optional(v.union(v.null(), v.string())), - idToken: v.optional(v.union(v.null(), v.string())), - accessTokenExpiresAt: v.optional(v.union(v.null(), v.number())), - refreshTokenExpiresAt: v.optional(v.union(v.null(), v.number())), - scope: v.optional(v.union(v.null(), v.string())), - password: v.optional(v.union(v.null(), v.string())), - createdAt: v.number(), - updatedAt: v.number(), - }) - .index('accountId', ['accountId']) - .index('accountId_providerId', ['accountId', 'providerId']) - .index('providerId_userId', ['providerId', 'userId']) - .index('userId', ['userId']), - verification: defineTable({ - identifier: v.string(), - value: v.string(), - expiresAt: v.number(), - createdAt: v.number(), - updatedAt: v.number(), - }) - .index('expiresAt', ['expiresAt']) - .index('identifier', ['identifier']), - jwks: defineTable({ - publicKey: v.string(), - privateKey: v.string(), - createdAt: v.number(), - }), - organization: defineTable({ - name: v.string(), - slug: v.string(), - logo: v.optional(v.union(v.null(), v.string())), - createdAt: v.number(), - metadata: v.optional(v.union(v.null(), v.string())), - }) - .index('name', ['name']) - .index('slug', ['slug']), - member: defineTable({ - organizationId: v.string(), - userId: v.string(), - role: v.string(), - createdAt: v.number(), - }) - .index('organizationId', ['organizationId']) - .index('userId', ['userId']) - .index('role', ['role']) - .index('organizationId_userId', ['organizationId', 'userId']), - invitation: defineTable({ - organizationId: v.string(), - email: v.string(), - role: v.optional(v.union(v.null(), v.string())), - status: v.string(), - expiresAt: v.number(), - inviterId: v.string(), - }) - .index('organizationId', ['organizationId']) - .index('email', ['email']) - .index('role', ['role']) - .index('status', ['status']) - .index('inviterId', ['inviterId']), + ...generatedTables, + // Add custom index for [organizationId, userId] queries on member table + member: generatedTables.member.index('organizationId_userId', [ + 'organizationId', + 'userId', + ]), }; const schema = defineSchema(tables); diff --git a/services/platform/convex/chat_agent.ts b/services/platform/convex/chat_agent.ts index 3f3080956..9a0365f66 100644 --- a/services/platform/convex/chat_agent.ts +++ b/services/platform/convex/chat_agent.ts @@ -64,6 +64,10 @@ export const generateAgentResponse = internalAction({ messageText: v.optional(v.string()), // Stream ID for Persistent Text Streaming (optimized text delivery) streamId: v.optional(v.string()), + // User ID for RAG prefetch + userId: v.optional(v.string()), + // User's team IDs for RAG search (resolved in mutation where we have auth identity) + userTeamIds: v.optional(v.array(v.string())), }, returns: v.object({ threadId: v.string(), diff --git a/services/platform/convex/documents.ts b/services/platform/convex/documents.ts index 7a20c85aa..841998994 100644 --- a/services/platform/convex/documents.ts +++ b/services/platform/convex/documents.ts @@ -20,6 +20,8 @@ import { internal } from './_generated/api'; import type { Id } from './_generated/dataModel'; import type { DocumentMetadata } from './model/documents/types'; import { checkOrganizationRateLimit } from './lib/rate_limiter/helpers'; +import { getAuthenticatedUser } from './lib/rls/auth/get_authenticated_user'; +import { getUserOrganizations } from './lib/rls/organization/get_user_organizations'; // Import model functions and validators import * as DocumentsModel from './model/documents'; @@ -74,6 +76,7 @@ export const createDocument = internalMutation({ metadata: v.optional(v.any()), sourceProvider: v.optional(sourceProviderValidator), externalItemId: v.optional(v.string()), + createdBy: v.optional(v.string()), }, returns: v.object({ success: v.boolean(), @@ -618,10 +621,15 @@ export const updateDocument = mutationWithRLS({ title: v.optional(v.string()), content: v.optional(v.string()), metadata: v.optional(v.any()), + teamTags: v.optional(v.array(v.string())), }, returns: v.null(), handler: async (ctx, args) => { - await DocumentsModel.updateDocument(ctx, args); + const authUser = await getAuthenticatedUser(ctx); + await DocumentsModel.updateDocument(ctx, { + ...args, + userId: authUser?.userId, + }); return null; }, }); @@ -632,6 +640,11 @@ export const updateDocument = mutationWithRLS({ * This also schedules RAG cleanup to delete associated knowledge * from the RAG service (graph nodes and vector embeddings). * Documents are always file-based, so we use file upload deletion. + * + * Permission rules: + * - Admin/Developer can delete any document + * - Editor/Member can only delete documents they created + * - Legacy documents (no createdBy) can be deleted by any editor+ */ export const deleteDocument = mutationWithRLS({ args: { @@ -645,6 +658,30 @@ export const deleteDocument = mutationWithRLS({ throw new Error('Document not found'); } + // Check delete permission based on createdBy + const authUser = await getAuthenticatedUser(ctx); + if (!authUser) { + throw new Error('Not authenticated'); + } + + const userOrganizations = await getUserOrganizations(ctx, authUser); + const membership = userOrganizations.find( + (m) => m.organizationId === document.organizationId, + ); + const role = (membership?.role ?? 'member').toLowerCase(); + + // Admin/Developer can delete any document + const isAdminOrDeveloper = role === 'admin' || role === 'developer'; + + // Non-admin users can only delete documents they created + if (!isAdminOrDeveloper) { + // If document has createdBy, check if current user is the creator + if (document.createdBy && document.createdBy !== authUser.userId) { + throw new Error('You can only delete documents you created'); + } + // Legacy documents without createdBy can be deleted by anyone with write access + } + // Store document ID for RAG cleanup (it's stored in Cognee's node_set) const documentIdStr = args.documentId as string; @@ -832,6 +869,7 @@ export const uploadFile = action({ fileId: fileId, mimeType: args.contentType, metadata: documentMetadata, + createdBy: identity.subject, }); return { @@ -886,6 +924,7 @@ export const createDocumentFromUpload = mutationWithRLS({ fileName: v.string(), contentType: v.string(), metadata: v.optional(v.any()), + teamTags: v.optional(v.array(v.string())), }, returns: createDocumentFromUploadResponseValidator, handler: async (ctx, args): Promise<{ @@ -894,6 +933,10 @@ export const createDocumentFromUpload = mutationWithRLS({ error?: string; }> => { try { + // Get current authenticated user for createdBy tracking + const authUser = await getAuthenticatedUser(ctx); + const createdBy = authUser?.userId; + // Check if a document with the same name already exists const existingDocument = await DocumentsModel.findDocumentByTitle(ctx, { organizationId: args.organizationId, @@ -933,6 +976,8 @@ export const createDocumentFromUpload = mutationWithRLS({ sourceProvider: providerFromMetadata, externalItemId, metadata: documentMetadata, + teamTags: args.teamTags, + userId: authUser?.userId, }); return { @@ -950,6 +995,8 @@ export const createDocumentFromUpload = mutationWithRLS({ fileId: args.fileId, mimeType: args.contentType, metadata: documentMetadata, + teamTags: args.teamTags, + createdBy, }); return { diff --git a/services/platform/convex/lib/create_chat_agent.ts b/services/platform/convex/lib/create_chat_agent.ts index 12d264df2..61a635b4d 100644 --- a/services/platform/convex/lib/create_chat_agent.ts +++ b/services/platform/convex/lib/create_chat_agent.ts @@ -58,6 +58,24 @@ export function createChatAgent(options?: { Your primary goal is to answer questions accurately and to keep the internal knowledge base up to date. +==================== +LANGUAGE MATCHING +==================== + +ALWAYS respond in the SAME language the user used in their message. +• If the user writes in Chinese, respond in Chinese +• If the user writes in English, respond in English +• If the user writes in German, respond in German +• etc. + +This applies even when source documents are in a different language. +When quoting or referencing content from documents in other languages, +translate the relevant portions to the user's language while keeping +proper nouns, technical terms, or names as-is when appropriate. + +Exception: Only use a different language if the user explicitly requests it +(e.g., "Reply in English" or "请用中文回答"). + ==================== CONVERSATION CONTEXT ==================== diff --git a/services/platform/convex/lib/get_user_teams.ts b/services/platform/convex/lib/get_user_teams.ts new file mode 100644 index 000000000..6d79bf8db --- /dev/null +++ b/services/platform/convex/lib/get_user_teams.ts @@ -0,0 +1,139 @@ +/** + * Helper to get user's team IDs for multi-tenant RAG operations. + * + * This module provides utilities to fetch team IDs for a user, + * which are used to construct dataset names for RAG isolation. + * + * In trusted headers mode, team IDs come from JWT claims (trustedTeams). + * In normal auth mode, team IDs come from the teamMember table. + */ + +import type { GenericQueryCtx } from 'convex/server'; +import { v } from 'convex/values'; +import { components } from '../_generated/api'; +import type { DataModel } from '../_generated/dataModel'; +import { internalQuery } from '../_generated/server'; + +// Type for Better Auth teamMember record +interface BetterAuthTeamMember { + _id: string; + teamId: string; + userId: string; + createdAt?: number | null; +} + +// Generic result type from Better Auth adapter +interface BetterAuthFindManyResult { + page: T[]; + continueCursor?: string; + isDone?: boolean; +} + +/** + * Dataset name prefix for team-scoped data. + * Format: tale_team_{teamId} + */ +export const TEAM_DATASET_PREFIX = 'tale_team_'; + +/** + * Default dataset name for organization-level data (no team). + */ +export const DEFAULT_DATASET_NAME = 'tale_documents'; + +/** + * Get all team IDs that a user belongs to. + * + * In trusted headers mode, returns team IDs from JWT claims (trustedTeams). + * In normal auth mode, queries the teamMember table. + * + * @param ctx - Convex query context + * @param userId - User ID to look up + * @returns Array of team IDs + */ +export async function getUserTeamIds( + ctx: GenericQueryCtx, + userId: string, +): Promise { + // Check if JWT contains trusted teams (trusted headers mode) + const identity = await ctx.auth.getUserIdentity(); + const trustedTeamsRaw = (identity as any)?.trustedTeams; + + if (trustedTeamsRaw) { + // Trusted headers mode: parse team IDs from JWT claim + // Format: [{id: "...", name: "..."}, ...] + try { + const teams = JSON.parse(trustedTeamsRaw) as Array<{ id: string; name: string }>; + return teams.map((t) => t.id); + } catch { + return []; + } + } + + // Normal auth mode: query teamMember table + const memberships: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1000 }, + where: [{ field: 'userId', operator: 'eq', value: userId }], + }); + + return memberships.page.map((m) => m.teamId); +} + +/** + * Convert a team ID to a dataset name. + * + * @param teamId - Team ID + * @returns Dataset name in format 'tale_team_{teamId}' + */ +export function teamIdToDatasetName(teamId: string): string { + return `${TEAM_DATASET_PREFIX}${teamId}`; +} + +/** + * Get all dataset names for a user's teams. + * Used for searching across all team datasets. + * + * @param ctx - Convex query context + * @param userId - User ID to look up + * @returns Array of dataset names (e.g., ['tale_team_abc123', 'tale_team_def456']) + */ +export async function getUserDatasetNames( + ctx: GenericQueryCtx, + userId: string, +): Promise { + const teamIds = await getUserTeamIds(ctx, userId); + return teamIds.map(teamIdToDatasetName); +} + +/** + * Get dataset names for search, including team datasets and the default dataset. + * This allows users to search across: + * 1. All their team-specific datasets + * 2. The organization-level default dataset + * + * @param ctx - Convex query context + * @param userId - User ID to look up + * @returns Array of all dataset names the user can access + */ +export async function getSearchableDatasetNames( + ctx: GenericQueryCtx, + userId: string, +): Promise { + const teamDatasets = await getUserDatasetNames(ctx, userId); + // Include the default dataset for organization-level documents + return [DEFAULT_DATASET_NAME, ...teamDatasets]; +} + +/** + * Internal query to get searchable dataset names for a user. + * This is exposed as an internalQuery so it can be called from agent tools. + */ +export const getSearchableDatasetsInternal = internalQuery({ + args: { + userId: v.string(), + }, + handler: async (ctx, args): Promise => { + return getSearchableDatasetNames(ctx, args.userId); + }, +}); diff --git a/services/platform/convex/lib/rag_prefetch/index.ts b/services/platform/convex/lib/rag_prefetch/index.ts new file mode 100644 index 000000000..9492eaf2f --- /dev/null +++ b/services/platform/convex/lib/rag_prefetch/index.ts @@ -0,0 +1,286 @@ +'use node'; + +/** + * RAG Search Prefetch Module + * + * Provides non-blocking prefetch of RAG search results. + * The prefetch is triggered at the start of generateAgentResponse, + * and the first rag_search tool call uses the prefetched result. + */ + +import type { ActionCtx } from '../../_generated/server'; +import { components } from '../../_generated/api'; +import { listMessages } from '@convex-dev/agent'; +import { + DEFAULT_DATASET_NAME, + teamIdToDatasetName, +} from '../get_user_teams'; +import { createDebugLog } from '../debug_log'; + +const debugLog = createDebugLog('DEBUG_CHAT_AGENT', '[RagPrefetch]'); + +// Configuration constants +const DEFAULT_RAG_SERVICE_URL = 'http://localhost:8001'; +const DEFAULT_TOP_K = 5; +const DEFAULT_SIMILARITY_THRESHOLD = 0.3; +const RAG_REQUEST_TIMEOUT_MS = 10000; + +// Query expansion constants +const MAX_CONTEXT_MESSAGES = 3; +const MAX_CONTEXT_CHARS = 500; + +interface SearchResult { + content: string; + score: number; + document_id?: string; + metadata?: Record; +} + +export interface QueryResponse { + success: boolean; + query: string; + results: SearchResult[]; + total_results: number; + processing_time_ms: number; +} + +interface RecentMessage { + role: 'user' | 'assistant'; + content: string; +} + +/** + * RAG prefetch cache object. + * Attached to the action context and passed to tools. + */ +export interface RagPrefetchCache { + /** The Promise that resolves to the RAG search result */ + promise: Promise; + /** Whether this cache has been consumed (first call sets this to true) */ + consumed: boolean; + /** Timestamp when the prefetch was started */ + timestamp: number; +} + +function getRagServiceUrl(): string { + return process.env.RAG_URL || DEFAULT_RAG_SERVICE_URL; +} + +/** + * Check if the query likely contains unresolved references. + */ +function hasUnresolvedReferences(query: string): boolean { + const lowered = query.toLowerCase(); + const referencePatterns = [ + /\b(it|this|that|these|those|they|them|its|their)\b/i, + /\b(the same|the one|the other|above|previous|mentioned|said)\b/i, + /\b(他|她|它|这个|那个|这些|那些|上面|之前|刚才)\b/, + /\b(그것|이것|저것|그|이|저)\b/, + /\b(それ|これ|あれ|その|この|あの)\b/, + ]; + return referencePatterns.some((pattern) => pattern.test(lowered)); +} + +/** + * Build an expanded query that includes conversation context. + */ +function buildExpandedQuery( + currentQuery: string, + recentMessages?: RecentMessage[], +): string { + if (!recentMessages || recentMessages.length === 0) { + return currentQuery; + } + + if (!hasUnresolvedReferences(currentQuery) && currentQuery.length > 20) { + return currentQuery; + } + + const contextParts: string[] = []; + let totalChars = 0; + + const relevantMessages = recentMessages + .slice(-MAX_CONTEXT_MESSAGES * 2) + .filter((m) => m.content && m.content.trim().length > 0); + + for (const msg of relevantMessages) { + if (totalChars >= MAX_CONTEXT_CHARS * MAX_CONTEXT_MESSAGES) break; + + const truncated = + msg.content.length > MAX_CONTEXT_CHARS + ? msg.content.substring(0, MAX_CONTEXT_CHARS) + '...' + : msg.content; + + contextParts.push(`${msg.role}: ${truncated}`); + totalChars += truncated.length; + } + + if (contextParts.length === 0) { + return currentQuery; + } + + return `Previous conversation: +${contextParts.join('\n')} + +Current question: ${currentQuery}`; +} + +/** + * Fetch recent messages from the thread for context expansion. + */ +async function getRecentMessagesForPrefetch( + ctx: ActionCtx, + threadId: string, + limit = 6, +): Promise { + try { + const messagesResult = await listMessages(ctx, components.agent, { + threadId, + paginationOpts: { cursor: null, numItems: limit }, + excludeToolMessages: true, + }); + + return messagesResult.page + .filter((m) => m.message?.role === 'user' || m.message?.role === 'assistant') + .map((m) => ({ + role: m.message!.role as 'user' | 'assistant', + content: typeof m.message!.content === 'string' + ? m.message!.content + : '', + })) + .filter((m) => m.content.length > 0) + .reverse(); + } catch (error) { + debugLog('Failed to get recent messages for prefetch', { + threadId, + error: error instanceof Error ? error.message : String(error), + }); + return []; + } +} + +/** + * Fetch RAG search results from the RAG service. + */ +async function fetchRagResults(options: { + query: string; + datasets: string[]; + userId: string; + top_k: number; + similarity_threshold?: number; +}): Promise { + const ragServiceUrl = getRagServiceUrl(); + const url = `${ragServiceUrl}/api/v1/search`; + + const payload = { + query: options.query, + top_k: options.top_k, + similarity_threshold: options.similarity_threshold ?? DEFAULT_SIMILARITY_THRESHOLD, + include_metadata: true, + user_id: options.userId, + datasets: options.datasets, + }; + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), RAG_REQUEST_TIMEOUT_MS); + + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`RAG service error: ${response.status} ${errorText}`); + } + + return (await response.json()) as QueryResponse; + } catch (error) { + clearTimeout(timeoutId); + throw error; + } +} + +export interface StartRagPrefetchOptions { + ctx: ActionCtx; + threadId: string; + userMessage: string; + userId: string; + userTeamIds: string[]; + top_k?: number; +} + +/** + * Start RAG search prefetch. + * + * This function returns IMMEDIATELY (non-blocking). + * All async operations (fetching recent messages, building query, calling RAG service) + * happen inside the returned Promise. + * + * @returns A cache object containing: + * - promise: The Promise that resolves to QueryResponse + * - consumed: false (set to true after first use) + * - timestamp: When the prefetch was started + */ +export function startRagPrefetch(options: StartRagPrefetchOptions): RagPrefetchCache { + const top_k = options.top_k ?? DEFAULT_TOP_K; + + const promise = (async (): Promise => { + debugLog('RAG prefetch started', { + threadId: options.threadId, + userMessage: options.userMessage.substring(0, 100), + }); + + // 1. Get recent messages for context expansion + const recentMessages = await getRecentMessagesForPrefetch( + options.ctx, + options.threadId, + ); + + // 2. Build expanded query with conversation context + const expandedQuery = buildExpandedQuery( + options.userMessage, + recentMessages, + ); + + // 3. Build datasets list + const datasets = [ + DEFAULT_DATASET_NAME, + ...options.userTeamIds.map(teamIdToDatasetName), + ]; + + debugLog('RAG prefetch executing', { + expandedQueryLength: expandedQuery.length, + hasContextExpansion: expandedQuery !== options.userMessage, + datasets, + top_k, + }); + + // 4. Fetch RAG results + const result = await fetchRagResults({ + query: expandedQuery, + datasets, + userId: options.userId, + top_k, + }); + + debugLog('RAG prefetch completed', { + success: result.success, + total_results: result.total_results, + processing_time_ms: result.processing_time_ms, + }); + + return result; + })(); + + return { + promise, + consumed: false, + timestamp: Date.now(), + }; +} diff --git a/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts b/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts new file mode 100644 index 000000000..d4007a1b8 --- /dev/null +++ b/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts @@ -0,0 +1,70 @@ +/** + * Helper to extract trusted auth data (role, teams) from JWT identity. + * + * In trusted headers mode, the role and team IDs are stored in the session + * and included in the JWT claims. This helper extracts and parses that data. + */ + +import type { QueryCtx, MutationCtx, ActionCtx } from '../../../_generated/server'; + +export interface TrustedAuthData { + trustedRole: string; + trustedTeamIds: string[]; +} + +/** + * Get trusted auth data from JWT identity if available. + * + * Returns null if: + * - User is not authenticated + * - JWT doesn't contain trusted headers data (normal auth mode) + * + * Returns TrustedAuthData if the JWT contains trustedRole claim. + */ +export async function getTrustedAuthData( + ctx: QueryCtx | MutationCtx | ActionCtx, +): Promise { + const identity = await ctx.auth.getUserIdentity(); + + if (!identity) { + return null; + } + + // Check if JWT contains trusted headers data + const trustedRole = (identity as any).trustedRole; + + if (!trustedRole) { + // Not in trusted headers mode (or trustedRole not set) + return null; + } + + // Parse trustedTeamIds from JSON string + const trustedTeamIdsRaw = (identity as any).trustedTeamIds; + let trustedTeamIds: string[] = []; + + if (trustedTeamIdsRaw) { + try { + trustedTeamIds = JSON.parse(trustedTeamIdsRaw); + } catch { + trustedTeamIds = []; + } + } + + return { + trustedRole, + trustedTeamIds, + }; +} + +/** + * Check if the current request is in trusted headers mode. + * + * This checks if the JWT contains trustedRole claim, which indicates + * the user authenticated via trusted headers. + */ +export async function isTrustedHeadersAuth( + ctx: QueryCtx | MutationCtx | ActionCtx, +): Promise { + const data = await getTrustedAuthData(ctx); + return data !== null; +} diff --git a/services/platform/convex/lib/rls/helpers/rls_rules.ts b/services/platform/convex/lib/rls/helpers/rls_rules.ts index 3eec68383..9e2ace9d9 100644 --- a/services/platform/convex/lib/rls/helpers/rls_rules.ts +++ b/services/platform/convex/lib/rls/helpers/rls_rules.ts @@ -8,6 +8,7 @@ import { Rules } from 'convex-helpers/server/rowLevelSecurity'; import type { RLSRuleContext } from '../types'; import { getAuthenticatedUser } from '../auth/get_authenticated_user'; import { getUserOrganizations } from '../organization/get_user_organizations'; +import { getUserTeamIds } from '../../get_user_teams'; import { authorizeRls } from '../../../auth'; @@ -25,12 +26,26 @@ export async function rlsRules( userOrganizations.map((org) => org.organizationId), ); + // Get user's team IDs for team-based access control on documents + const userTeamIds = user?.userId + ? new Set(await getUserTeamIds(ctx, user.userId)) + : new Set(); + + // Helper to check team access for documents + // No teamTags or empty = accessible to all org members + // Has teamTags = user must be in at least one of those teams + const hasDocumentTeamAccess = (doc: { teamTags?: string[] }): boolean => { + if (!doc.teamTags || doc.teamTags.length === 0) return true; + return doc.teamTags.some((tag) => userTeamIds.has(tag)); + }; + return { - // Documents - organization-scoped + // Documents - organization-scoped with team-based access control documents: { read: async (_, doc) => { if (!user) return false; if (!userOrgIds.has(doc.organizationId)) return false; + if (!hasDocumentTeamAccess(doc)) return false; const membership = userOrganizations.find( (m) => m.organizationId === doc.organizationId, ); @@ -39,6 +54,7 @@ export async function rlsRules( modify: async (_, doc) => { if (!user) return false; if (!userOrgIds.has(doc.organizationId)) return false; + if (!hasDocumentTeamAccess(doc)) return false; const membership = userOrganizations.find( (m) => m.organizationId === doc.organizationId, ); @@ -47,6 +63,8 @@ export async function rlsRules( insert: async ({ user: ruleUser }, doc) => { if (!ruleUser) return false; if (!userOrgIds.has(doc.organizationId)) return false; + // User can only create documents with teamTags they belong to (or no teamTags) + if (!hasDocumentTeamAccess(doc)) return false; const membership = userOrganizations.find( (m) => m.organizationId === doc.organizationId, ); diff --git a/services/platform/convex/lib/rls/organization/get_user_organizations.ts b/services/platform/convex/lib/rls/organization/get_user_organizations.ts index c20a2950d..9b47eff5f 100644 --- a/services/platform/convex/lib/rls/organization/get_user_organizations.ts +++ b/services/platform/convex/lib/rls/organization/get_user_organizations.ts @@ -5,10 +5,14 @@ import type { QueryCtx } from '../../../_generated/server'; import type { AuthenticatedUser, OrganizationMember } from '../types'; import { requireAuthenticatedUser } from '../auth/require_authenticated_user'; +import { getTrustedAuthData } from '../auth/get_trusted_auth_data'; import { components } from '../../../_generated/api'; /** - * Get all organizations user has access to from Better Auth's member table + * Get all organizations user has access to from Better Auth's member table. + * + * In trusted headers mode, the role comes from the JWT claims (trustedRole) + * instead of the member.role field in the database. */ export async function getUserOrganizations( ctx: QueryCtx, @@ -22,6 +26,9 @@ export async function getUserOrganizations( > { const authUser = user || (await requireAuthenticatedUser(ctx)); + // Check if we're in trusted headers mode (role from JWT) + const trustedData = await getTrustedAuthData(ctx); + // Query Better Auth's member table for all memberships const result = await ctx.runQuery(components.betterAuth.adapter.findMany, { model: 'member', @@ -44,7 +51,9 @@ export async function getUserOrganizations( return result.page.map((member: any) => ({ organizationId: member.organizationId, - role: (member.role || 'member').toLowerCase(), + // Use JWT trustedRole if available (trusted headers mode), + // otherwise fall back to member.role from database (normal auth mode) + role: trustedData?.trustedRole || (member.role || 'member').toLowerCase(), member, })); } diff --git a/services/platform/convex/member.ts b/services/platform/convex/member.ts index 02099cb5d..6c5d7824e 100644 --- a/services/platform/convex/member.ts +++ b/services/platform/convex/member.ts @@ -635,3 +635,100 @@ export const getMemberRoleInternal = internalQuery({ return member?.role ?? null; }, }); + +// Types for Better Auth team records +interface BetterAuthTeam { + _id: string; + name: string; + organizationId: string; + createdAt: number; + updatedAt?: number | null; +} + +interface BetterAuthTeamMember { + _id: string; + teamId: string; + userId: string; + createdAt?: number | null; +} + +/** + * Get teams that the current user belongs to in an organization. + * Used for document scope selection during upload. + * + * In trusted headers mode, teams come directly from JWT claims (trustedTeams). + * In normal auth mode, team IDs come from the teamMember table. + */ +export const getMyTeams = queryWithRLS({ + args: { + organizationId: v.string(), + }, + returns: v.object({ + teams: v.array( + v.object({ + id: v.string(), + name: v.string(), + }), + ), + /** True if teams are managed by external IdP (trusted headers mode) */ + isExternallyManaged: v.boolean(), + }), + handler: async (ctx, args) => { + const authUser = await getAuthenticatedUser(ctx); + if (!authUser) { + return { teams: [], isExternallyManaged: false }; + } + + // Check if JWT contains trusted teams (trusted headers mode) + const identity = await ctx.auth.getUserIdentity(); + const trustedTeamsRaw = (identity as Record)?.trustedTeams; + + if (trustedTeamsRaw && typeof trustedTeamsRaw === 'string') { + // Trusted headers mode: return teams directly from JWT claim + // Format: [{id: "...", name: "..."}, ...] + try { + const teams = JSON.parse(trustedTeamsRaw) as Array<{ id: string; name: string }>; + return { teams, isExternallyManaged: true }; + } catch { + return { teams: [], isExternallyManaged: true }; + } + } + + // Normal auth mode: query teamMember table + const teamMembershipsRes: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1000 }, + where: [{ field: 'userId', operator: 'eq', value: authUser.userId }], + }); + const teamIds = teamMembershipsRes?.page?.map((m) => m.teamId) ?? []; + + if (teamIds.length === 0) { + return { teams: [], isExternallyManaged: false }; + } + + // Get all teams in the organization + const teamsRes: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'team', + paginationOpts: { cursor: null, numItems: 1000 }, + where: [ + { + field: 'organizationId', + operator: 'eq', + value: args.organizationId, + }, + ], + }); + + // Filter to only teams the user is a member of + const userTeams = (teamsRes?.page ?? []) + .filter((team) => teamIds.includes(team._id)) + .map((team) => ({ + id: team._id, + name: team.name, + })); + + return { teams: userTeams, isExternallyManaged: false }; + }, +}); diff --git a/services/platform/convex/model/chat_agent/chat_with_agent.ts b/services/platform/convex/model/chat_agent/chat_with_agent.ts index 83c040f3b..2229ac742 100644 --- a/services/platform/convex/model/chat_agent/chat_with_agent.ts +++ b/services/platform/convex/model/chat_agent/chat_with_agent.ts @@ -26,6 +26,7 @@ import { components, internal } from '../../_generated/api'; import { listMessages, saveMessage } from '@convex-dev/agent'; import { computeDeduplicationState } from './message_deduplication'; import { persistentStreaming } from '../../streaming'; +import { getUserTeamIds } from '../../lib/get_user_teams'; import { createDebugLog } from '../../lib/debug_log'; @@ -64,6 +65,14 @@ export async function chatWithAgent( // This enables optimized text delivery to the frontend via reactive query or HTTP streaming const streamId = await persistentStreaming.createStream(ctx); + // Get thread to retrieve userId, then get user's team IDs for RAG search + // This is done in the mutation (where we have auth identity) so the action + // doesn't need to query the session table (which could be insecure) + const thread = await ctx.runQuery(components.agent.threads.getThread, { threadId }); + const userTeamIds = thread?.userId + ? await getUserTeamIds(ctx, thread.userId) + : []; + // Load recent non-tool messages to deduplicate the last user message const existingMessages = await listMessages(ctx, components.agent, { threadId, @@ -206,6 +215,10 @@ export async function chatWithAgent( messageText: trimmedMessage, // Pass streamId for Persistent Text Streaming (optimized text delivery) streamId, + // Pass userId for RAG prefetch + userId: thread?.userId, + // Pass user's team IDs for RAG search (resolved in mutation where we have auth identity) + userTeamIds, }); return { messageAlreadyExists, streamId }; diff --git a/services/platform/convex/model/chat_agent/generate_agent_response.ts b/services/platform/convex/model/chat_agent/generate_agent_response.ts index 091167a7e..cc6e8e4d5 100644 --- a/services/platform/convex/model/chat_agent/generate_agent_response.ts +++ b/services/platform/convex/model/chat_agent/generate_agent_response.ts @@ -39,6 +39,7 @@ import { classifyError, NonRetryableError, } from '../../lib/error_classification'; +import { startRagPrefetch } from '../../lib/rag_prefetch'; const debugLog = createDebugLog('DEBUG_CHAT_AGENT', '[ChatAgent]'); @@ -63,6 +64,17 @@ export interface GenerateAgentResponseArgs { * The stream is populated with text content as it's generated. */ streamId?: string; + /** + * User ID for the thread owner. + * Resolved in the mutation and passed to the action for RAG prefetch. + */ + userId?: string; + /** + * User's team IDs for RAG search. + * Resolved in the mutation (where we have auth identity) and passed to the action + * to avoid insecure session table lookups. + */ + userTeamIds?: string[]; } export interface GenerateAgentResponseResult { @@ -120,7 +132,7 @@ export async function generateAgentResponse( ctx: ActionCtx, args: GenerateAgentResponseArgs, ): Promise { - const { threadId, organizationId, maxSteps, promptMessageId, attachments, messageText, streamId } = args; + const { threadId, organizationId, maxSteps, promptMessageId, attachments, messageText, streamId, userId, userTeamIds } = args; const startTime = Date.now(); @@ -133,6 +145,19 @@ export async function generateAgentResponse( try { const userQuery = messageText || ''; + // Start RAG prefetch immediately (non-blocking) + // This runs in parallel with context loading below. + // The first rag_search tool call will use this prefetched result. + const ragPrefetchCache = userId && userQuery + ? startRagPrefetch({ + ctx, + threadId, + userMessage: userQuery, + userId, + userTeamIds: userTeamIds ?? [], + }) + : undefined; + // Load context summary and integrations in parallel for faster startup // RAG is no longer pre-loaded - AI uses rag_search tool on-demand to reduce token usage const [initialContextSummary, integrationsList] = await Promise.all([ @@ -253,7 +278,11 @@ export async function generateAgentResponse( ...ctx, organizationId, threadId, + // User's team IDs for RAG search, passed from mutation where auth identity is available + userTeamIds: userTeamIds ?? [], variables: {}, + // RAG prefetch cache for the first rag_search tool call + ragPrefetchCache, }; // Build the prompt content - this may include multi-modal content for attachments diff --git a/services/platform/convex/model/documents/create_document.ts b/services/platform/convex/model/documents/create_document.ts index 16dbc0e96..c3f77cfa3 100644 --- a/services/platform/convex/model/documents/create_document.ts +++ b/services/platform/convex/model/documents/create_document.ts @@ -24,6 +24,8 @@ export async function createDocument( metadata: args.metadata, sourceProvider: args.sourceProvider, externalItemId: args.externalItemId, + teamTags: args.teamTags, + createdBy: args.createdBy, }); return { diff --git a/services/platform/convex/model/documents/get_document_by_id_public.ts b/services/platform/convex/model/documents/get_document_by_id_public.ts index ffa725af5..a7c5f11d2 100644 --- a/services/platform/convex/model/documents/get_document_by_id_public.ts +++ b/services/platform/convex/model/documents/get_document_by_id_public.ts @@ -6,7 +6,7 @@ import type { QueryCtx } from '../../_generated/server'; import type { Id } from '../../_generated/dataModel'; import type { DocumentItemResponse } from './types'; import { getDocumentById } from './get_document_by_id'; -import { transformToDocumentItem } from './transform_to_document_item'; +import { transformDocumentsBatch } from './transform_to_document_item'; export async function getDocumentByIdPublic( ctx: QueryCtx, @@ -24,7 +24,8 @@ export async function getDocumentByIdPublic( }; } - const item = await transformToDocumentItem(ctx, document); + // Use batch transform for consistent behavior (even for single document) + const [item] = await transformDocumentsBatch(ctx, [document]); return { success: true, diff --git a/services/platform/convex/model/documents/get_document_by_path.ts b/services/platform/convex/model/documents/get_document_by_path.ts index 37158e1ca..5b4e19630 100644 --- a/services/platform/convex/model/documents/get_document_by_path.ts +++ b/services/platform/convex/model/documents/get_document_by_path.ts @@ -4,7 +4,7 @@ import type { QueryCtx } from '../../_generated/server'; import type { DocumentItemResponse } from './types'; -import { transformToDocumentItem } from './transform_to_document_item'; +import { transformDocumentsBatch } from './transform_to_document_item'; export async function getDocumentByPath( ctx: QueryCtx, @@ -33,7 +33,8 @@ export async function getDocumentByPath( }; } - const item = await transformToDocumentItem(ctx, document); + // Use batch transform for consistent behavior (even for single document) + const [item] = await transformDocumentsBatch(ctx, [document]); return { success: true, diff --git a/services/platform/convex/model/documents/get_documents.ts b/services/platform/convex/model/documents/get_documents.ts index 0df91c695..2b6f78caa 100644 --- a/services/platform/convex/model/documents/get_documents.ts +++ b/services/platform/convex/model/documents/get_documents.ts @@ -8,7 +8,7 @@ import type { QueryCtx } from '../../_generated/server'; import type { Doc } from '../../_generated/dataModel'; import type { DocumentListResponse } from './types'; -import { transformToDocumentItem } from './transform_to_document_item'; +import { transformDocumentsBatch } from './transform_to_document_item'; export async function getDocuments( ctx: QueryCtx, @@ -85,10 +85,9 @@ export async function getDocuments( startIndex + size, ); - // Transform documents to DocumentItem format (expensive operation - only on paginated subset) - const items = await Promise.all( - paginatedDocuments.map((doc) => transformToDocumentItem(ctx, doc)), - ); + // Transform documents to DocumentItem format using batch processing + // This efficiently fetches user names and storage URLs in parallel + const items = await transformDocumentsBatch(ctx, paginatedDocuments); const hasNextPage = page * size < totalItems; diff --git a/services/platform/convex/model/documents/get_documents_cursor.ts b/services/platform/convex/model/documents/get_documents_cursor.ts index cfa170d05..a75ae66a3 100644 --- a/services/platform/convex/model/documents/get_documents_cursor.ts +++ b/services/platform/convex/model/documents/get_documents_cursor.ts @@ -10,7 +10,7 @@ import type { Doc } from '../../_generated/dataModel'; import type { DocumentItemResponse } from './types'; import { paginateWithFilter, DEFAULT_PAGE_SIZE } from '../../lib/pagination'; import { getMetadataString } from '../../lib/metadata/get_metadata_string'; -import { transformToDocumentItem } from './transform_to_document_item'; +import { transformDocumentsBatch } from './transform_to_document_item'; export interface GetDocumentsCursorArgs { organizationId: string; @@ -74,10 +74,9 @@ export async function getDocumentsCursor( filter, }); - // Transform documents to DocumentItemResponse format (expensive operation - only on paginated subset) - const items = await Promise.all( - result.page.map((doc) => transformToDocumentItem(ctx, doc)), - ); + // Transform documents to DocumentItemResponse format using batch processing + // This efficiently fetches user names and storage URLs in parallel + const items = await transformDocumentsBatch(ctx, result.page); return { page: items, diff --git a/services/platform/convex/model/documents/get_user_names_batch.ts b/services/platform/convex/model/documents/get_user_names_batch.ts new file mode 100644 index 000000000..b860ff84a --- /dev/null +++ b/services/platform/convex/model/documents/get_user_names_batch.ts @@ -0,0 +1,64 @@ +/** + * Batch fetch user names from Better Auth user table + * + * This helper efficiently fetches multiple user names in a single query, + * avoiding the N+1 query problem when displaying creator names in document lists. + */ + +import type { QueryCtx } from '../../_generated/server'; +import { components } from '../../_generated/api'; + +/** + * Batch fetch user display names for multiple user IDs + * + * @param ctx - Query context + * @param userIds - Array of user IDs to fetch names for + * @returns Map of userId -> display name (name or email) + */ +export async function getUserNamesBatch( + ctx: QueryCtx, + userIds: string[], +): Promise> { + const result = new Map(); + + // Filter out empty/undefined IDs and deduplicate + const uniqueIds = [...new Set(userIds.filter((id) => id))]; + + if (uniqueIds.length === 0) { + return result; + } + + // Fetch all users in parallel batches + // Better Auth adapter findMany doesn't support IN queries, so we need to batch individual lookups + // But we can parallelize them for efficiency + // Note: Better Auth uses _id as the primary key, not id + const userPromises = uniqueIds.map(async (userId) => { + const userRes = await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'user', + paginationOpts: { cursor: null, numItems: 1 }, + where: [{ field: '_id', value: userId, operator: 'eq' }], + }); + + const user = userRes?.page?.[0] as + | { _id?: string; name?: string; email?: string } + | undefined; + + if (user) { + const displayName = user.name ?? user.email; + if (displayName) { + return { userId, displayName }; + } + } + return null; + }); + + const users = await Promise.all(userPromises); + + for (const user of users) { + if (user) { + result.set(user.userId, user.displayName); + } + } + + return result; +} diff --git a/services/platform/convex/model/documents/index.ts b/services/platform/convex/model/documents/index.ts index 57cffe558..37673d0f6 100644 --- a/services/platform/convex/model/documents/index.ts +++ b/services/platform/convex/model/documents/index.ts @@ -10,6 +10,7 @@ export * from './query_documents'; export * from './check_membership'; export * from './generate_signed_url'; export * from './transform_to_document_item'; +export * from './get_user_names_batch'; export * from './get_documents'; export * from './get_documents_cursor'; export * from './get_document_by_id_public'; diff --git a/services/platform/convex/model/documents/transform_to_document_item.ts b/services/platform/convex/model/documents/transform_to_document_item.ts index 6a7f06683..cad63a8ec 100644 --- a/services/platform/convex/model/documents/transform_to_document_item.ts +++ b/services/platform/convex/model/documents/transform_to_document_item.ts @@ -6,18 +6,39 @@ import type { QueryCtx } from '../../_generated/server'; import type { Doc } from '../../_generated/dataModel'; import type { DocumentItemResponse, DocumentMetadata } from './types'; import { extractExtension } from './extract_extension'; +import { getUserNamesBatch } from './get_user_names_batch'; -export async function transformToDocumentItem( - ctx: QueryCtx, - document: Doc<'documents'>, -): Promise { - // Generate URL for file if it has a fileId - let url: string | undefined; - if (document.fileId) { - const fileUrl = await ctx.storage.getUrl(document.fileId); - url = fileUrl ?? undefined; - } +/** + * Transform options for batch processing + */ +export interface TransformOptions { + /** + * Pre-fetched user names map (userId -> displayName) + * When provided, avoids individual DB lookups for creator names + */ + userNamesMap?: Map; + /** + * Pre-fetched storage URLs map (fileId -> url) + * When provided, avoids individual storage.getUrl calls + */ + storageUrlsMap?: Map; +} +/** + * Transform a single document to DocumentItemResponse format + * + * This is a synchronous function that transforms document data. + * For batch processing, pre-fetch user names and storage URLs using: + * - getUserNamesBatch() for creator names + * - ctx.storage.getUrl() for file URLs (batched in caller) + * + * @param document - Document to transform + * @param options - Optional transform options including pre-fetched data + */ +export function transformToDocumentItem( + document: Doc<'documents'>, + options?: TransformOptions, +): DocumentItemResponse { // Type the metadata field for safer access const metadata = document.metadata as DocumentMetadata | undefined; @@ -29,6 +50,16 @@ export async function transformToDocumentItem( const normalizeType = (t: string | undefined): 'file' | 'folder' => t === 'file' || t === 'folder' ? t : 'file'; + // Get URL from pre-fetched map (fileId is converted to string as key) + const url = document.fileId + ? options?.storageUrlsMap?.get(String(document.fileId)) ?? undefined + : undefined; + + // Get creator display name from pre-fetched map + const createdByName = document.createdBy + ? options?.userNamesMap?.get(document.createdBy) + : undefined; + return { id: document._id, name: document.title ?? metadata?.name ?? 'Untitled', @@ -50,5 +81,91 @@ export async function transformToDocumentItem( ragStatus: document.ragInfo?.status, ragIndexedAt: document.ragInfo?.indexedAt, ragError: document.ragInfo?.error, + // Team tags for multi-tenancy support + teamTags: document.teamTags, + // Creator tracking + createdBy: document.createdBy, + createdByName, }; } + +/** + * Batch transform documents with efficient data fetching + * + * This function handles batch fetching of user names and storage URLs, + * then transforms all documents in a single pass. + * + * @param ctx - Query context for data fetching + * @param documents - Array of documents to transform + * @returns Array of transformed document items + */ +export async function transformDocumentsBatch( + ctx: QueryCtx, + documents: Doc<'documents'>[], +): Promise { + // Early return for empty arrays + if (documents.length === 0) { + return []; + } + + // Collect unique user IDs and file IDs + const userIds = documents + .map((doc) => doc.createdBy) + .filter((id): id is string => !!id); + + const fileIds = documents + .map((doc) => doc.fileId) + .filter((id): id is NonNullable['fileId']> => !!id); + + // Batch fetch user names and storage URLs in parallel + const [userNamesMap, storageUrlsMap] = await Promise.all([ + getUserNamesBatch(ctx, userIds), + batchGetStorageUrls(ctx, fileIds), + ]); + + // Transform all documents using pre-fetched data + return documents.map((doc) => + transformToDocumentItem(doc, { userNamesMap, storageUrlsMap }), + ); +} + +/** + * Batch fetch storage URLs for multiple file IDs + */ +async function batchGetStorageUrls( + ctx: QueryCtx, + fileIds: NonNullable['fileId']>[], +): Promise> { + const result = new Map(); + + if (fileIds.length === 0) { + return result; + } + + // Deduplicate file IDs using string representation + const seenIds = new Set(); + const uniqueIds: NonNullable['fileId']>[] = []; + for (const id of fileIds) { + const key = String(id); + if (!seenIds.has(key)) { + seenIds.add(key); + uniqueIds.push(id); + } + } + + // Fetch all URLs in parallel + const urlPromises = uniqueIds.map(async (fileId) => { + const url = await ctx.storage.getUrl(fileId); + return { fileId: String(fileId), url }; + }); + + const urls = await Promise.all(urlPromises); + + for (const { fileId, url } of urls) { + if (url) { + result.set(fileId, url); + } + } + + return result; +} diff --git a/services/platform/convex/model/documents/types.ts b/services/platform/convex/model/documents/types.ts index d89d90e8b..04bf8127a 100644 --- a/services/platform/convex/model/documents/types.ts +++ b/services/platform/convex/model/documents/types.ts @@ -67,6 +67,8 @@ export interface CreateDocumentArgs { metadata?: unknown; sourceProvider?: SourceProvider; externalItemId?: string; + teamTags?: string[]; + createdBy?: string; } export interface CreateDocumentResult { diff --git a/services/platform/convex/model/documents/update_document.ts b/services/platform/convex/model/documents/update_document.ts index cf639d218..291630005 100644 --- a/services/platform/convex/model/documents/update_document.ts +++ b/services/platform/convex/model/documents/update_document.ts @@ -6,6 +6,7 @@ import type { MutationCtx } from '../../_generated/server'; import type { Id } from '../../_generated/dataModel'; import _ from 'lodash'; import { extractExtension } from './extract_extension'; +import { getUserTeamIds } from '../../lib/get_user_teams'; export async function updateDocument( ctx: MutationCtx, @@ -19,6 +20,8 @@ export async function updateDocument( extension?: string; sourceProvider?: 'onedrive' | 'upload'; externalItemId?: string; + teamTags?: string[]; + userId?: string; }, ): Promise { const document = await ctx.db.get(args.documentId); @@ -26,6 +29,17 @@ export async function updateDocument( throw new Error('Document not found'); } + // Validate teamTags: user can only assign document to teams they belong to + if (args.teamTags !== undefined && args.userId) { + const userTeamIds = await getUserTeamIds(ctx, args.userId); + const userTeamSet = new Set(userTeamIds); + for (const tag of args.teamTags) { + if (!userTeamSet.has(tag)) { + throw new Error('Cannot assign document to a team you do not belong to'); + } + } + } + const updateData: { title?: string; content?: string; @@ -35,6 +49,7 @@ export async function updateDocument( extension?: string; sourceProvider?: 'onedrive' | 'upload'; externalItemId?: string; + teamTags?: string[]; } = {}; if (args.title !== undefined) updateData.title = args.title; if (args.content !== undefined) updateData.content = args.content; @@ -50,6 +65,7 @@ export async function updateDocument( updateData.sourceProvider = args.sourceProvider; if (args.externalItemId !== undefined) updateData.externalItemId = args.externalItemId; + if (args.teamTags !== undefined) updateData.teamTags = args.teamTags; if (args.metadata !== undefined) { const existingMetadata = (document as { metadata?: unknown }).metadata; diff --git a/services/platform/convex/model/documents/validators.ts b/services/platform/convex/model/documents/validators.ts index 314c3cbda..cc7173935 100644 --- a/services/platform/convex/model/documents/validators.ts +++ b/services/platform/convex/model/documents/validators.ts @@ -78,6 +78,11 @@ export const documentItemValidator = v.object({ ragStatus: v.optional(ragStatusValidator), ragIndexedAt: v.optional(v.number()), ragError: v.optional(v.string()), + // Team tags for multi-tenancy support + teamTags: v.optional(v.array(v.string())), + // Creator tracking + createdBy: v.optional(v.string()), + createdByName: v.optional(v.string()), }); /** @@ -116,7 +121,11 @@ export const documentRecordValidator = v.object({ metadata: v.optional(v.any()), sourceProvider: v.optional(sourceProviderValidator), externalItemId: v.optional(v.string()), + // Team tags for multi-tenancy support + teamTags: v.optional(v.array(v.string())), ragInfo: v.optional(ragInfoValidator), + // Creator tracking + createdBy: v.optional(v.string()), }); /** diff --git a/services/platform/convex/model/onedrive/upload_and_create_document_logic.ts b/services/platform/convex/model/onedrive/upload_and_create_document_logic.ts index e8d6a74e2..05e557a20 100644 --- a/services/platform/convex/model/onedrive/upload_and_create_document_logic.ts +++ b/services/platform/convex/model/onedrive/upload_and_create_document_logic.ts @@ -29,6 +29,7 @@ export interface UploadAndCreateDocDependencies { metadata: Record; sourceProvider?: 'onedrive' | 'upload'; externalItemId?: string; + createdBy?: string; }) => Promise<{ documentId?: Id<'documents'> }>; updateDocument: (args: { documentId: Id<'documents'>; @@ -52,6 +53,7 @@ export async function uploadAndCreateDocumentLogic( contentType: string; metadata: OneDriveMetadata; documentIdToUpdate?: Id<'documents'>; + createdBy?: string; }, deps: UploadAndCreateDocDependencies, ): Promise { @@ -102,6 +104,7 @@ export async function uploadAndCreateDocumentLogic( metadata: args.metadata, sourceProvider: 'onedrive', externalItemId, + createdBy: args.createdBy, }); return { success: true, fileId: storageId, documentId }; diff --git a/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts b/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts index 1f5ff2815..062d505b8 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts @@ -15,11 +15,14 @@ export interface CreateSessionForTrustedUserArgs { existingSessionToken?: string; ipAddress?: string; userAgent?: string; + trustedRole?: string; + trustedTeams?: string; } export interface CreateSessionForTrustedUserResult { sessionToken: string; shouldClearOldSession: boolean; + trustedHeadersChanged: boolean; } export async function createSessionForTrustedUser( @@ -65,13 +68,23 @@ export async function createSessionForTrustedUser( }); // Signal that we need to clear the old cookie } else if (existingSession.expiresAt > now) { - // Same user, session still valid - extend it and return + // Same user, session still valid - extend it and update trusted fields + // Check if trusted headers values have changed + const sessionRecord = existingSession as unknown as Record; + const existingRole = sessionRecord.trustedRole as string | null | undefined; + const existingTeams = sessionRecord.trustedTeams as string | null | undefined; + const trustedHeadersChanged = + (existingRole ?? null) !== (args.trustedRole ?? null) || + (existingTeams ?? null) !== (args.trustedTeams ?? null); + await ctx.runMutation(components.betterAuth.adapter.updateOne, { input: { model: 'session', update: { expiresAt: now + 24 * 60 * 60 * 1000, updatedAt: now, + trustedRole: args.trustedRole ?? null, + trustedTeams: args.trustedTeams ?? null, }, where: [ { @@ -85,6 +98,7 @@ export async function createSessionForTrustedUser( return { sessionToken: existingSession.token, shouldClearOldSession: false, + trustedHeadersChanged, }; } } @@ -111,12 +125,22 @@ export async function createSessionForTrustedUser( if (userSessionResult && userSessionResult.page.length > 0) { const session = userSessionResult.page[0]; if (session.expiresAt > now) { + // Check if trusted headers values have changed + const sessionRecord = session as unknown as Record; + const existingRole = sessionRecord.trustedRole as string | null | undefined; + const existingTeams = sessionRecord.trustedTeams as string | null | undefined; + const trustedHeadersChanged = + (existingRole ?? null) !== (args.trustedRole ?? null) || + (existingTeams ?? null) !== (args.trustedTeams ?? null); + await ctx.runMutation(components.betterAuth.adapter.updateOne, { input: { model: 'session', update: { expiresAt: now + 24 * 60 * 60 * 1000, updatedAt: now, + trustedRole: args.trustedRole ?? null, + trustedTeams: args.trustedTeams ?? null, }, where: [ { @@ -130,6 +154,7 @@ export async function createSessionForTrustedUser( return { sessionToken: session.token, shouldClearOldSession: args.existingSessionToken ? true : false, + trustedHeadersChanged, }; } } @@ -150,6 +175,8 @@ export async function createSessionForTrustedUser( updatedAt: now, ipAddress: args.ipAddress || null, userAgent: args.userAgent || null, + trustedRole: args.trustedRole || null, + trustedTeams: args.trustedTeams || null, }, }, }); @@ -157,5 +184,6 @@ export async function createSessionForTrustedUser( return { sessionToken, shouldClearOldSession: args.existingSessionToken ? true : false, + trustedHeadersChanged: true, }; } diff --git a/services/platform/convex/model/trusted_headers_authenticate/find_or_create_user_from_headers.ts b/services/platform/convex/model/trusted_headers_authenticate/find_or_create_user_from_headers.ts index f466a06ed..a32ee7a4f 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/find_or_create_user_from_headers.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/find_or_create_user_from_headers.ts @@ -1,6 +1,13 @@ /** * Business logic for finding or creating a Better Auth user from - * trusted headers and ensuring their profile (name, role) is up to date. + * trusted headers. In trusted headers mode, the role is NOT stored + * in the member table - it comes from the session/JWT instead. + * + * This function only handles: + * - Finding or creating the user record + * - Finding or creating organization membership (for organizationId linkage) + * - The member.role field is set to 'member' as a placeholder; the actual + * role is stored in the session and included in JWT claims. */ import type { MutationCtx } from '../../_generated/server'; @@ -97,25 +104,8 @@ export async function findOrCreateUserFromHeaders( if (memberResult && memberResult.page.length > 0) { const member = memberResult.page[0]; organizationId = member.organizationId; - - // Update member's role if it changed - if (member.role !== role) { - await ctx.runMutation(components.betterAuth.adapter.updateOne, { - input: { - model: 'member', - update: { - role, - }, - where: [ - { - field: '_id', - value: member._id, - operator: 'eq', - }, - ], - }, - }); - } + // Note: We don't update member.role here because in trusted headers mode, + // the role comes from the session/JWT, not the member table. } } else { // User doesn't exist - create them @@ -163,15 +153,15 @@ export async function findOrCreateUserFromHeaders( const existingOrgId = existingAdminMember.organizationId; organizationId = existingOrgId; - // Add the new user as a member of the existing organization, using - // the role provided by the trusted headers (already normalized). + // Add the new user as a member of the existing organization. + // Use 'member' as placeholder role - actual role comes from session/JWT. await ctx.runMutation(components.betterAuth.adapter.create, { input: { model: 'member', data: { organizationId: existingOrgId, userId, - role, + role: 'member', createdAt: Date.now(), }, }, diff --git a/services/platform/convex/model/trusted_headers_authenticate/index.ts b/services/platform/convex/model/trusted_headers_authenticate/index.ts index f3351bab4..369388fea 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/index.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/index.ts @@ -9,3 +9,4 @@ export * from './find_or_create_user_from_headers'; export * from './create_session_for_trusted_user'; export * from './get_user_by_id'; export * from './trusted_headers_authenticate'; +export * from './resolve_team_names'; diff --git a/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts b/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts new file mode 100644 index 000000000..e020c6e57 --- /dev/null +++ b/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts @@ -0,0 +1,37 @@ +/** + * Business logic for resolving teams from trusted headers. + * + * In trusted headers mode, the external IdP is the single source of truth + * for team membership. We simply pass through the external team data without + * any database lookup or validation. + * + * The external team IDs and names are stored directly in the session/JWT. + * - Team IDs are used for document team tags filtering + * - Team names are used for UI display + */ + +export interface TeamEntry { + id: string; + name: string; +} + +export interface ResolveTeamsArgs { + teams: TeamEntry[]; +} + +export interface ResolveTeamsResult { + /** Full team data (id + name) for storage in JWT */ + teams: TeamEntry[]; +} + +export function resolveTeams(args: ResolveTeamsArgs): ResolveTeamsResult { + const { teams } = args; + + if (teams.length === 0) { + return { teams: [] }; + } + + // Pass through external team data directly - no DB lookup needed + // The external IdP is the single source of truth for team membership + return { teams }; +} diff --git a/services/platform/convex/model/trusted_headers_authenticate/trusted_headers_authenticate.ts b/services/platform/convex/model/trusted_headers_authenticate/trusted_headers_authenticate.ts index 769a6c960..702fd0c01 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/trusted_headers_authenticate.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/trusted_headers_authenticate.ts @@ -3,17 +3,25 @@ * * This wraps the lower-level helpers for: * - finding/creating the user from headers - * - creating/reusing a Better Auth session + * - resolving team names to IDs + * - creating/reusing a Better Auth session with role and teams stored */ import type { MutationCtx } from '../../_generated/server'; import { findOrCreateUserFromHeaders } from './find_or_create_user_from_headers'; import { createSessionForTrustedUser } from './create_session_for_trusted_user'; +import { resolveTeams } from './resolve_team_names'; + +export interface TrustedHeadersTeamEntry { + id: string; + name: string; +} export interface TrustedHeadersAuthenticateArgs { email: string; name: string; role: string; + teams: TrustedHeadersTeamEntry[] | null; existingSessionToken?: string; ipAddress?: string; userAgent?: string; @@ -25,6 +33,7 @@ export interface TrustedHeadersAuthenticateResult { organizationId: string | null; sessionToken: string; shouldClearOldSession: boolean; + trustedHeadersChanged: boolean; } export async function trustedHeadersAuthenticate( @@ -36,7 +45,7 @@ export async function trustedHeadersAuthenticate( throw new Error('Invalid internal secret for trusted headers authentication'); } - const { email, name, role, existingSessionToken, ipAddress, userAgent } = args; + const { email, name, role, teams, existingSessionToken, ipAddress, userAgent } = args; // First, find or create the user and ensure their profile matches headers const userResult = await findOrCreateUserFromHeaders(ctx, { @@ -45,12 +54,24 @@ export async function trustedHeadersAuthenticate( role, }); + // Pass through external team data if teams header was provided + // In trusted headers mode, external IdP is the single source of truth + // Store full team data (id + name) for both filtering and UI display + let trustedTeams: string | undefined; + if (teams !== null) { + const teamResult = resolveTeams({ teams }); + trustedTeams = JSON.stringify(teamResult.teams); + } + // Then, create or reuse a session for this user, handling account switching + // Store role and teams in the session for JWT claims const sessionResult = await createSessionForTrustedUser(ctx, { userId: userResult.userId, existingSessionToken, ipAddress, userAgent, + trustedRole: role, + trustedTeams, }); return { @@ -58,5 +79,6 @@ export async function trustedHeadersAuthenticate( organizationId: userResult.organizationId, sessionToken: sessionResult.sessionToken, shouldClearOldSession: sessionResult.shouldClearOldSession, + trustedHeadersChanged: sessionResult.trustedHeadersChanged, }; } diff --git a/services/platform/convex/onedrive.ts b/services/platform/convex/onedrive.ts index 9f0259857..00fdb77a1 100644 --- a/services/platform/convex/onedrive.ts +++ b/services/platform/convex/onedrive.ts @@ -843,6 +843,7 @@ export const uploadToStorage = internalAction({ contentType: v.string(), metadata: v.optional(v.any()), documentIdToUpdate: v.optional(v.id('documents')), + createdBy: v.optional(v.string()), }, returns: v.object({ success: v.boolean(), @@ -891,6 +892,7 @@ export const uploadToStorage = internalAction({ fileId: fileId, mimeType: args.contentType, metadata: documentMetadata, + createdBy: args.createdBy, }); return { diff --git a/services/platform/convex/schema.ts b/services/platform/convex/schema.ts index dcfdbe193..22a88787e 100644 --- a/services/platform/convex/schema.ts +++ b/services/platform/convex/schema.ts @@ -23,6 +23,9 @@ export default defineSchema({ v.union(v.literal('onedrive'), v.literal('upload')), ), externalItemId: v.optional(v.string()), + // Team tags for multi-tenancy support - documents can belong to multiple teams + // Empty array or undefined means document is accessible to all organization members + teamTags: v.optional(v.array(v.string())), // Array of Better Auth team IDs // RAG indexing status - tracks status of document in RAG service ragInfo: v.optional( v.object({ @@ -37,9 +40,13 @@ export default defineSchema({ error: v.optional(v.string()), }), ), + // User who created/uploaded this document (Better Auth user ID) + // Optional for backward compatibility with existing documents + createdBy: v.optional(v.string()), metadata: v.optional(v.any()), }) .index('by_organizationId', ['organizationId']) + .index('by_organizationId_and_createdBy', ['organizationId', 'createdBy']) .index('by_organizationId_and_sourceProvider', [ 'organizationId', 'sourceProvider', diff --git a/services/platform/convex/team_members.ts b/services/platform/convex/team_members.ts new file mode 100644 index 000000000..36116d8cf --- /dev/null +++ b/services/platform/convex/team_members.ts @@ -0,0 +1,165 @@ +/** + * Team members management - Convex queries and mutations + * Works with Better Auth's teamMember table for team-based access control + */ + +import { v } from 'convex/values'; +import { query, mutation } from './_generated/server'; +import { components } from './_generated/api'; + +// Type for Better Auth teamMember record +interface BetterAuthTeamMember { + _id: string; + teamId: string; + userId: string; + createdAt?: number | null; +} + +// Type for Better Auth team record +interface BetterAuthTeam { + _id: string; + name: string; + organizationId: string; + createdAt: number; + updatedAt?: number | null; +} + +// Generic result type from Better Auth adapter +interface BetterAuthFindManyResult { + page: T[]; + continueCursor?: string; + isDone?: boolean; +} + +/** + * List all members of a specific team + */ +export const listByTeam = query({ + args: { + teamId: v.string(), + }, + handler: async (ctx, args) => { + // Query the Better Auth teamMember table via component adapter + const result: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1000 }, + where: [{ field: 'teamId', operator: 'eq', value: args.teamId }], + }); + + return result.page; + }, +}); + +/** + * Add a member to a team + */ +export const addMember = mutation({ + args: { + teamId: v.string(), + userId: v.string(), + }, + handler: async (ctx, args) => { + // Check if member already exists in this team + const existing: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1 }, + where: [ + { field: 'teamId', operator: 'eq', value: args.teamId }, + { field: 'userId', operator: 'eq', value: args.userId }, + ], + }); + + if (existing.page.length > 0) { + throw new Error('User is already a member of this team'); + } + + // Add the member via Better Auth adapter + const created = await ctx.runMutation(components.betterAuth.adapter.create, { + input: { + model: 'teamMember', + data: { + teamId: args.teamId, + userId: args.userId, + createdAt: Date.now(), + }, + }, + }); + + return created; + }, +}); + +/** + * Remove a member from a team + */ +export const removeMember = mutation({ + args: { + teamId: v.string(), + userId: v.string(), + }, + handler: async (ctx, args) => { + // Find the member record + const existing: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1 }, + where: [ + { field: 'teamId', operator: 'eq', value: args.teamId }, + { field: 'userId', operator: 'eq', value: args.userId }, + ], + }); + + if (existing.page.length === 0) { + throw new Error('User is not a member of this team'); + } + + // Remove the member via Better Auth adapter + await ctx.runMutation(components.betterAuth.adapter.deleteMany, { + input: { + model: 'teamMember', + where: [ + { field: 'teamId', operator: 'eq', value: args.teamId }, + { field: 'userId', operator: 'eq', value: args.userId }, + ], + }, + paginationOpts: { cursor: null, numItems: 1 }, + }); + + return { success: true }; + }, +}); + +/** + * Get all teams a user belongs to + */ +export const listTeamsByUser = query({ + args: { + userId: v.string(), + }, + handler: async (ctx, args) => { + // Get user's team memberships + const memberships: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1000 }, + where: [{ field: 'userId', operator: 'eq', value: args.userId }], + }); + + // Get team details for each membership + const teams = await Promise.all( + memberships.page.map(async (m) => { + const teamResult: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'team', + paginationOpts: { cursor: null, numItems: 1 }, + where: [{ field: '_id', operator: 'eq', value: m.teamId }], + }); + return teamResult.page[0]; + }) + ); + + return teams.filter(Boolean); + }, +}); diff --git a/services/platform/convex/trusted_headers_authenticate.ts b/services/platform/convex/trusted_headers_authenticate.ts index 9e4d6380a..e1cd57d03 100644 --- a/services/platform/convex/trusted_headers_authenticate.ts +++ b/services/platform/convex/trusted_headers_authenticate.ts @@ -2,12 +2,19 @@ import { mutation, internalMutation, internalQuery } from './_generated/server'; import { v } from 'convex/values'; import * as TrustedHeadersAuthModel from './model/trusted_headers_authenticate'; +// Team entry with required ID and name +const teamEntryValidator = v.object({ + id: v.string(), + name: v.string(), +}); + // Public mutation: full trusted-headers auth flow export const trustedHeadersAuthenticate = mutation({ args: { email: v.string(), name: v.string(), role: v.string(), + teams: v.union(v.array(teamEntryValidator), v.null()), existingSessionToken: v.optional(v.string()), ipAddress: v.optional(v.string()), userAgent: v.optional(v.string()), @@ -18,6 +25,7 @@ export const trustedHeadersAuthenticate = mutation({ organizationId: v.union(v.string(), v.null()), sessionToken: v.string(), shouldClearOldSession: v.boolean(), + trustedHeadersChanged: v.boolean(), }), handler: async (ctx, args) => { return await TrustedHeadersAuthModel.trustedHeadersAuthenticate(ctx, args); @@ -69,6 +77,8 @@ export const createSessionForTrustedUser = internalMutation({ existingSessionToken: v.optional(v.string()), ipAddress: v.optional(v.string()), userAgent: v.optional(v.string()), + trustedRole: v.optional(v.string()), + trustedTeamIds: v.optional(v.string()), }, returns: v.object({ sessionToken: v.string(), diff --git a/services/platform/convex/types/convex_action_ctx.augment.d.ts b/services/platform/convex/types/convex_action_ctx.augment.d.ts index da5d0789f..7a1eb8c99 100644 --- a/services/platform/convex/types/convex_action_ctx.augment.d.ts +++ b/services/platform/convex/types/convex_action_ctx.augment.d.ts @@ -1,4 +1,5 @@ import 'convex/server'; +import type { RagPrefetchCache } from '../lib/rag_prefetch'; declare module 'convex/server' { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -6,5 +7,23 @@ declare module 'convex/server' { organizationId?: string; workflowId?: string; variables?: Record; + /** + * User's team IDs for RAG search. + * Resolved in the mutation (where auth identity is available) and passed + * through the action to avoid insecure session table lookups. + */ + userTeamIds?: string[]; + /** + * Parent thread ID for sub-agent tools. + * Used to link approval cards to the parent conversation thread + * when a sub-agent creates approvals. + */ + parentThreadId?: string; + /** + * RAG search prefetch cache. + * Started at the beginning of generateAgentResponse, used by the first + * rag_search tool call to avoid redundant requests. + */ + ragPrefetchCache?: RagPrefetchCache; } } diff --git a/services/platform/convex/workflow/actions/onedrive/onedrive_action.ts b/services/platform/convex/workflow/actions/onedrive/onedrive_action.ts index e67ed06d9..a0ea9c34e 100644 --- a/services/platform/convex/workflow/actions/onedrive/onedrive_action.ts +++ b/services/platform/convex/workflow/actions/onedrive/onedrive_action.ts @@ -53,6 +53,7 @@ type OneDriveActionParams = token: string; folderItemPath?: string; configId?: string; + createdBy?: string; } | { operation: 'upload_to_storage'; @@ -61,6 +62,7 @@ type OneDriveActionParams = contentType?: string; storagePath?: string; metadata?: Record; + createdBy?: string; } | { operation: 'update_sync_config'; @@ -107,6 +109,7 @@ export const onedriveAction: ActionDefinition = { token: v.string(), folderItemPath: v.optional(v.string()), configId: v.optional(v.id('onedriveSyncConfigs')), + createdBy: v.optional(v.string()), }), // upload_to_storage: Upload file to Convex storage v.object({ @@ -116,6 +119,7 @@ export const onedriveAction: ActionDefinition = { contentType: v.optional(v.string()), storagePath: v.optional(v.string()), metadata: v.optional(v.any()), + createdBy: v.optional(v.string()), }), // update_sync_config: Update OneDrive sync configuration v.object({ @@ -209,6 +213,7 @@ export const onedriveAction: ActionDefinition = { : params.fileContent, // Required by validator contentType: params.contentType || 'application/octet-stream', metadata: params.metadata || {}, + createdBy: params.createdBy, }); if (!result.success) { @@ -340,6 +345,7 @@ export const onedriveAction: ActionDefinition = { fileMimeType || f.mimeType || 'application/octet-stream', metadata, documentIdToUpdate: existing?._id, + createdBy: params.createdBy, }, ); diff --git a/services/platform/convex/workflow/actions/rag/helpers/get_document_info.ts b/services/platform/convex/workflow/actions/rag/helpers/get_document_info.ts index eab1a048f..fc924ebb6 100644 --- a/services/platform/convex/workflow/actions/rag/helpers/get_document_info.ts +++ b/services/platform/convex/workflow/actions/rag/helpers/get_document_info.ts @@ -2,7 +2,7 @@ import type { RagActionParams } from './types'; import type { ActionCtx } from '../../../../_generated/server'; import { api, internal } from '../../../../_generated/api'; import type { Id } from '../../../../_generated/dataModel'; -import type { DocumentRecord, DocumentMetadata } from '../../../../model/documents/types'; +import type { DocumentMetadata } from '../../../../model/documents/types'; /** * Document information without downloading content @@ -14,6 +14,8 @@ export interface DocumentInfo { filename?: string; contentType?: string; metadata: Record; + /** Team tags for multi-tenancy - determines which datasets the document belongs to */ + teamTags?: string[]; } /** @@ -63,6 +65,7 @@ export async function getDocumentInfo( title: document.title, ...baseMetadata, }, + teamTags: document.teamTags, }; } @@ -77,6 +80,7 @@ export async function getDocumentInfo( title: document.title, ...baseMetadata, }, + teamTags: document.teamTags, }; } diff --git a/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts b/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts index 16527d58f..c88a2df21 100644 --- a/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts +++ b/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts @@ -7,6 +7,10 @@ export interface UploadFileDirectArgs { contentType: string; metadata?: Record; timeoutMs?: number; + /** User ID for multi-tenant isolation */ + userId?: string; + /** Dataset name for organizing documents (e.g., 'tale_team_{teamId}') */ + datasetName?: string; } /** @@ -35,6 +39,8 @@ export async function uploadFileDirect({ contentType, metadata, timeoutMs = 30000, + userId, + datasetName, }: UploadFileDirectArgs): Promise { const startTime = Date.now(); @@ -70,6 +76,14 @@ export async function uploadFileDirect({ formData.append('document_id', recordIdFromMetadata); } + // Add multi-tenant parameters if provided + if (userId) { + formData.append('user_id', userId); + } + if (datasetName) { + formData.append('dataset_name', datasetName); + } + // Step 3: Upload to RAG service const url = `${ragServiceUrl}/api/v1/documents/upload`; diff --git a/services/platform/convex/workflow/actions/rag/helpers/upload_text_document.ts b/services/platform/convex/workflow/actions/rag/helpers/upload_text_document.ts index 1a450e4dc..60b2d2a19 100644 --- a/services/platform/convex/workflow/actions/rag/helpers/upload_text_document.ts +++ b/services/platform/convex/workflow/actions/rag/helpers/upload_text_document.ts @@ -7,6 +7,10 @@ export interface UploadTextDocumentArgs { /** Optional logical record identifier; sent as `document_id` to the RAG endpoint. */ recordId?: string; timeoutMs?: number; + /** User ID for multi-tenant isolation */ + userId?: string; + /** Dataset name for organizing documents (e.g., 'tale_team_{teamId}') */ + datasetName?: string; } /** @@ -18,6 +22,8 @@ export async function uploadTextDocument({ metadata, recordId, timeoutMs = 30000, + userId, + datasetName, }: UploadTextDocumentArgs): Promise { const startTime = Date.now(); const url = `${ragServiceUrl}/api/v1/documents`; @@ -33,6 +39,14 @@ export async function uploadTextDocument({ payload.document_id = recordId; } + // Add multi-tenant parameters if provided + if (userId) { + payload.user_id = userId; + } + if (datasetName) { + payload.dataset_name = datasetName; + } + const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeoutMs); diff --git a/services/platform/convex/workflow/actions/rag/rag_action.ts b/services/platform/convex/workflow/actions/rag/rag_action.ts index 9387966a9..9f16882d4 100644 --- a/services/platform/convex/workflow/actions/rag/rag_action.ts +++ b/services/platform/convex/workflow/actions/rag/rag_action.ts @@ -8,6 +8,7 @@ import { uploadFileDirect } from './helpers/upload_file_direct'; import { deleteDocumentById } from './helpers/delete_document'; import { internal } from '../../../_generated/api'; import type { Id } from '../../../_generated/dataModel'; +import { teamIdToDatasetName, DEFAULT_DATASET_NAME } from '../../../lib/get_user_teams'; export const ragAction: ActionDefinition = { type: 'rag', @@ -72,12 +73,23 @@ export const ragAction: ActionDefinition = { // Document upload (from documents table) const documentInfo = await getDocumentInfo(ctx, processedParams); + // Determine dataset name based on team tags + // If document has team tags, upload to first team's dataset + // Otherwise, upload to default organization-level dataset + // Note: If document belongs to multiple teams, we upload to the first one + // In the future, we may want to upload to all team datasets + const datasetName = + documentInfo.teamTags && documentInfo.teamTags.length > 0 + ? teamIdToDatasetName(documentInfo.teamTags[0]) + : DEFAULT_DATASET_NAME; + if (documentInfo.type === 'text') { // Upload text content directly uploadResult = await uploadTextDocument({ ragServiceUrl: ragConfig.serviceUrl, content: documentInfo.content as string, metadata: documentInfo.metadata, + datasetName, }); } else { // Upload file directly by downloading from storage and uploading to RAG @@ -87,6 +99,7 @@ export const ragAction: ActionDefinition = { filename: documentInfo.filename || 'document', contentType: documentInfo.contentType || 'application/octet-stream', metadata: documentInfo.metadata, + datasetName, }); } documentType = documentInfo.type; diff --git a/services/platform/lib/auth-client.ts b/services/platform/lib/auth-client.ts index d48df388c..5dfcadc80 100644 --- a/services/platform/lib/auth-client.ts +++ b/services/platform/lib/auth-client.ts @@ -46,6 +46,10 @@ export const authClient = createAuthClient({ member, disabled, }, + // Enable teams for multi-tenancy support (team-level data isolation) + teams: { + enabled: true, + }, }), ], }); diff --git a/services/platform/lib/auth/trusted-headers-token.ts b/services/platform/lib/auth/trusted-headers-token.ts index 15cb3ec71..eb1a69dea 100644 --- a/services/platform/lib/auth/trusted-headers-token.ts +++ b/services/platform/lib/auth/trusted-headers-token.ts @@ -95,6 +95,7 @@ export async function authenticateViaTrustedHeaders( signedSessionToken: string; user: TrustedHeadersUser; shouldClearOldSession: boolean; + trustedHeadersChanged: boolean; } | null> { // Check if trusted headers are enabled if (!isTrustedHeadersEnabled()) { @@ -104,7 +105,7 @@ export async function authenticateViaTrustedHeaders( // Extract user info from headers const headerUser = extractTrustedHeaders(request); - console.log({ headerUser }); + console.log('Trusted headers user:', JSON.stringify(headerUser, null, 2)); if (!headerUser) { return null; @@ -129,6 +130,7 @@ export async function authenticateViaTrustedHeaders( email: headerUser.email, name: headerUser.name, role: headerUser.role, + teams: headerUser.teams, existingSessionToken, ipAddress: request.headers.get('x-forwarded-for') || undefined, userAgent: request.headers.get('user-agent') || undefined, @@ -150,6 +152,7 @@ export async function authenticateViaTrustedHeaders( signedSessionToken, user: headerUser, shouldClearOldSession: result.shouldClearOldSession, + trustedHeadersChanged: result.trustedHeadersChanged, }; } catch (error) { console.error('Error authenticating via trusted headers:', error); diff --git a/services/platform/lib/auth/trusted-headers.ts b/services/platform/lib/auth/trusted-headers.ts index 8fbc1dfc7..5aa1faa35 100644 --- a/services/platform/lib/auth/trusted-headers.ts +++ b/services/platform/lib/auth/trusted-headers.ts @@ -8,6 +8,17 @@ interface TrustedHeadersConfig { emailHeader: string; nameHeader: string; roleHeader: string; + teamsHeader: string; +} + +/** + * Team entry from trusted headers + */ +export interface TrustedHeadersTeam { + /** Team ID */ + id: string; + /** Team name */ + name: string; } /** @@ -17,6 +28,8 @@ export interface TrustedHeadersUser { email: string; name: string; role: string; + /** Teams from header. null = header not present, [] = header empty */ + teams: TrustedHeadersTeam[] | null; } /** @@ -28,6 +41,7 @@ function getTrustedHeadersConfig(): TrustedHeadersConfig { emailHeader: process.env.TRUSTED_EMAIL_HEADER || 'X-Auth-Email', nameHeader: process.env.TRUSTED_NAME_HEADER || 'X-Auth-Name', roleHeader: process.env.TRUSTED_ROLE_HEADER || 'X-Auth-Role', + teamsHeader: process.env.TRUSTED_TEAMS_HEADER || 'X-Auth-Teams', }; } @@ -54,8 +68,9 @@ export function extractTrustedHeaders( const email = request.headers.get(config.emailHeader); const name = request.headers.get(config.nameHeader); const role = request.headers.get(config.roleHeader); + const teamsHeaderValue = request.headers.get(config.teamsHeader); - // All headers must be present + // All required headers must be present (teams is optional) if (!email || !name || !role) { console.warn('Trusted headers authentication enabled but headers missing', { hasEmail: !!email, @@ -80,10 +95,25 @@ export function extractTrustedHeaders( return null; } + // Parse teams header: + // - null: header not present -> don't modify teams + // - []: header present but empty -> remove from all teams + // - [{id, name}, ...]: parse comma-separated list in "id:name" format + let teams: TrustedHeadersTeam[] | null = null; + if (teamsHeaderValue !== null) { + const parseResult = parseTeamsHeader(teamsHeaderValue); + if (!parseResult.success) { + console.warn('Invalid teams header format', { error: parseResult.error }); + return null; + } + teams = parseResult.teams; + } + return { email: email.toLowerCase().trim(), name: name.trim(), role: role.toLowerCase().trim(), + teams, }; } @@ -103,6 +133,61 @@ function isValidRole(role: string): boolean { return validRoles.includes(role.toLowerCase()); } +/** + * Parse result from parseTeamsHeader + */ +export type ParseTeamsResult = + | { success: true; teams: TrustedHeadersTeam[] } + | { success: false; error: string }; + +/** + * Parse comma-separated teams from header value. + * Requires ID:Name format: "id1:Team A, id2:Team B" + * + * Each entry must contain both ID and name separated by colon. + * Returns error if any entry is missing ID or name. + * Returns empty array for empty/whitespace-only header. + */ +function parseTeamsHeader(headerValue: string): ParseTeamsResult { + if (!headerValue || !headerValue.trim()) { + return { success: true, teams: [] }; + } + + const teams: TrustedHeadersTeam[] = []; + const entries = headerValue.split(',').map((entry) => entry.trim()).filter((entry) => entry.length > 0); + + for (const entry of entries) { + const colonIndex = entry.indexOf(':'); + if (colonIndex <= 0) { + return { + success: false, + error: `Invalid team entry "${entry}": must be in "id:name" format`, + }; + } + + const id = entry.substring(0, colonIndex).trim(); + const name = entry.substring(colonIndex + 1).trim(); + + if (!id) { + return { + success: false, + error: `Invalid team entry "${entry}": missing team ID`, + }; + } + + if (!name) { + return { + success: false, + error: `Invalid team entry "${entry}": missing team name`, + }; + } + + teams.push({ id, name }); + } + + return { success: true, teams }; +} + /** * Map trusted header role to organization role * This handles any role name variations from different auth providers diff --git a/services/platform/messages/en.json b/services/platform/messages/en.json index 2411d55f0..7718e297a 100644 --- a/services/platform/messages/en.json +++ b/services/platform/messages/en.json @@ -189,6 +189,7 @@ "settings": "Settings", "settingsAndMore": "Settings and more", "organization": "Organization", + "teams": "Teams", "integrations": "Integrations", "account": "Account", "logs": "Logs" @@ -278,7 +279,9 @@ "executionId": "Execution ID", "startedAt": "Started at", "duration": "Duration", - "triggeredBy": "Triggered by" + "triggeredBy": "Triggered by", + "teams": "Teams", + "uploadedBy": "Uploaded by" }, "cells": { "noEmail": "No email", @@ -474,7 +477,7 @@ "title": "Settings", "organization": { "title": "Organization (optional)", - "teamMembers": "Team members", + "membersTitle": "Organization members", "manageAccess": "Manage access to the organization", "searchMember": "Search member", "addMember": "Add member", @@ -497,7 +500,6 @@ "memberUpdateFailed": "Failed to update member", "memberRemoved": "Member removed", "memberRemoveFailed": "Failed to remove member", - "removeTeamMember": "Remove team member", "emailCannotChange": "Email cannot be changed", "cannotChangeOwnRole": "You cannot change your own role", "updatePassword": "Update password", @@ -509,6 +511,41 @@ "leaveConfirmation": "Are you sure you want to leave this organization? You will lose access to all resources.", "leaving": "Leaving..." }, + "teams": { + "title": "Teams", + "description": "Create and manage teams within your organization for granular access control", + "externallyManagedDescription": "Teams are managed by your identity provider. You belong to the teams shown below.", + "createTeam": "Create team", + "searchTeam": "Search teams", + "noTeams": "No teams yet", + "noTeamsDescription": "Create your first team to organize members and control access to documents.", + "noTeamsExternallyManaged": "You are not assigned to any teams. Contact your identity provider administrator to update your team membership.", + "columns": { + "name": "Name", + "members": "Members", + "created": "Created" + }, + "editTeam": "Edit team", + "deleteTeam": "Delete team", + "deleteConfirmation": "Are you sure you want to delete this team? Team members will lose access to team-specific documents.", + "teamDeleted": "Team deleted", + "teamDeleteFailed": "Failed to delete team", + "teamCreated": "Team created", + "teamCreateFailed": "Failed to create team", + "teamUpdated": "Team updated", + "teamUpdateFailed": "Failed to update team", + "teamNameRequired": "Team name is required", + "manageMembers": "Manage members", + "addMember": "Add member", + "removeMember": "Remove member", + "memberAdded": "Member added to team", + "memberAddFailed": "Failed to add member", + "memberRemoved": "Member removed from team", + "memberRemoveFailed": "Failed to remove member", + "selectMember": "Select a member to add", + "noMembersToAdd": "All organization members are already in this team", + "noTeamMembers": "No members in this team yet" + }, "integrations": { "accessDenied": "You need Admin or Developer permissions to access integrations settings.", "manage": "Manage", @@ -1407,7 +1444,17 @@ "deleteDocument": "Delete document", "deleteSyncFolder": "Delete sync folder", "deleteFolderFailed": "Failed to delete folder", - "deleteFileFailed": "An unexpected error occurred while deleting" + "deleteFileFailed": "An unexpected error occurred while deleting", + "manageTeams": "Manage teams", + "reindex": "Reindex" + }, + "teamTags": { + "title": "Manage document teams", + "description": "Select which teams can access \"{name}\"", + "updated": "Document teams updated", + "updateFailed": "Failed to update document teams", + "noTeams": "No teams available. Create teams in Settings to enable team-based access control.", + "hint": "Documents without any team tags are accessible to all organization members." }, "deleteFile": { "title": "Delete file", @@ -1455,7 +1502,11 @@ "uploadSuccessful": "Upload successful", "filesUploadedSuccessfully": "{count} {count, plural, one {file} other {files}} uploaded successfully", "uploadCancelled": "Upload cancelled", - "uploadFailed": "Upload failed" + "uploadFailed": "Upload failed", + "selectTeams": "Select teams", + "selectTeamsDescription": "Choose which teams can access the uploaded documents", + "noTeamsAvailable": "You are not a member of any teams", + "allMembersHint": "Documents without team tags are accessible to everyone in the organization." }, "import": { "noResponseBody": "No response body received" @@ -1849,7 +1900,8 @@ "title": "Access denied", "automations": "You need Admin or Developer permissions to access automations.", "integrations": "You need Admin or Developer permissions to access integrations settings.", - "organization": "You need Admin permissions to access organization settings." + "organization": "You need Admin permissions to access organization settings.", + "teams": "You need Admin permissions to access team settings." }, "metadata": { "suffix": "Tale", @@ -1922,6 +1974,10 @@ "title": "Organization", "description": "Manage your organization settings." }, + "teams": { + "title": "Teams", + "description": "Manage teams within your organization." + }, "integrations": { "title": "Integrations", "description": "Connect third-party services." diff --git a/services/platform/proxy.ts b/services/platform/proxy.ts index b90a05c6d..c00bfe869 100644 --- a/services/platform/proxy.ts +++ b/services/platform/proxy.ts @@ -15,7 +15,44 @@ export async function proxy(request: NextRequest) { } // 2. Then handle authentication (either Trusted Headers or Better Auth) - const isProtectedRoute = request.nextUrl.pathname.startsWith('/dashboard'); + const pathname = request.nextUrl.pathname; + const isProtectedRoute = pathname.startsWith('/dashboard'); + const isAuthRoute = pathname.startsWith('/log-in') || pathname.startsWith('/sign-up'); + + // Handle Trusted Headers mode for auth routes (auto-login) + if (isAuthRoute && shouldUseTrustedHeaders()) { + const authResult = await authenticateViaTrustedHeaders(request); + + if (authResult) { + // User is authenticated via trusted headers - redirect to dashboard + const siteUrl = process.env.SITE_URL || 'http://localhost:3000'; + const isHttps = siteUrl.startsWith('https://'); + const cookieName = isHttps + ? '__Secure-better-auth.session_token' + : 'better-auth.session_token'; + + // Check for redirectTo parameter + const redirectTo = request.nextUrl.searchParams.get('redirectTo') || '/dashboard'; + const redirectUrl = new URL(redirectTo, request.url); + + const response = NextResponse.redirect(redirectUrl); + + if (authResult.shouldClearOldSession) { + response.cookies.delete(cookieName); + } + + response.cookies.set(cookieName, authResult.signedSessionToken, { + httpOnly: true, + secure: isHttps, + sameSite: 'lax', + path: '/', + maxAge: 60 * 60 * 24, // 24 hours + }); + + return response; + } + // If trusted headers auth fails, fall through to show login page + } if (isProtectedRoute) { // Check if trusted headers authentication is enabled @@ -45,20 +82,29 @@ export async function proxy(request: NextRequest) { // we need to clear the old session cookie and set a new one const siteUrl = process.env.SITE_URL || 'http://localhost:3000'; const isHttps = siteUrl.startsWith('https://'); - const cookieName = isHttps + const sessionCookieName = isHttps ? '__Secure-better-auth.session_token' : 'better-auth.session_token'; + const jwtCookieName = isHttps + ? '__Secure-better-auth.convex_jwt' + : 'better-auth.convex_jwt'; const response = NextResponse.next(); // If we detected an account switch, clear the old cookie first if (authResult.shouldClearOldSession) { - response.cookies.delete(cookieName); + response.cookies.delete(sessionCookieName); + } + + // If trusted headers changed (role or teams), clear JWT cookie to force refresh + // This ensures the JWT claims are regenerated with the new values + if (authResult.trustedHeadersChanged) { + response.cookies.delete(jwtCookieName); } // Set the new session cookie. Use the HMAC-signed value so Better Auth's // `getSignedCookie` can validate it and allow `/convex/token` to issue JWTs. - response.cookies.set(cookieName, authResult.signedSessionToken, { + response.cookies.set(sessionCookieName, authResult.signedSessionToken, { httpOnly: true, secure: isHttps, sameSite: 'lax', diff --git a/services/platform/types/documents.ts b/services/platform/types/documents.ts index 6e1fe7bf8..b73afa16c 100644 --- a/services/platform/types/documents.ts +++ b/services/platform/types/documents.ts @@ -17,6 +17,12 @@ export interface DocumentItem { ragIndexedAt?: number; /** Error message (for failed status) */ ragError?: string; + /** Team tags for multi-tenancy support - Better Auth team IDs */ + teamTags?: string[]; + /** User ID who created/uploaded this document */ + createdBy?: string; + /** Display name of the user who created/uploaded this document */ + createdByName?: string; } export interface DocumentListResponse { diff --git a/services/rag/Dockerfile b/services/rag/Dockerfile index cbe5100d0..c6aaf5320 100644 --- a/services/rag/Dockerfile +++ b/services/rag/Dockerfile @@ -64,18 +64,37 @@ ENV TALE_VERSION=${VERSION} \ # Default Tale RAG configuration RAG_HOST=0.0.0.0 \ RAG_PORT=8001 \ - RAG_WORKERS=2 \ + # Single worker recommended for stability. + # FalkorDB is client-server, so multiple workers are theoretically possible, + # but single worker with FastAPI async handles most workloads efficiently. + RAG_WORKERS=1 \ RAG_LOG_LEVEL=info \ - # Worker recycling: restart worker after N requests to bound memory growth. - # Cognee accumulates in-process state that CPython doesn't return to OS. - # Requires RAG_WORKERS >= 2 so the parent process can respawn workers. - RAG_MAX_REQUESTS_PER_WORKER=100000 \ # Cognee data directory RAG_COGNEE_DATA_DIR=/app/data \ # Default database URL for local development (connects to tale-db container) # Note: PGVector uses this same PostgreSQL database for vector storage # Uses dedicated tale_rag database to isolate from other services (e.g., Convex uses tale_platform) - RAG_DATABASE_URL=postgresql://tale:tale_password_change_me@db:5432/tale_rag + RAG_DATABASE_URL=postgresql://tale:tale_password_change_me@db:5432/tale_rag \ + # Cognee Graph and Vector Database Configuration (FalkorDB) + # IMPORTANT: These must be set BEFORE Python imports cognee modules. + # Cognee reads these env vars at module import time, not at runtime. + # FalkorDB provides both graph and vector storage via hybrid adapter. + # Uses 'graph-db' as the hostname (Docker service name in compose.yml) + GRAPH_DATABASE_PROVIDER=falkor \ + GRAPH_DATABASE_URL=graph-db \ + GRAPH_DATABASE_PORT=6379 \ + GRAPH_DATASET_DATABASE_HANDLER=falkor_graph_local \ + VECTOR_DB_PROVIDER=falkor \ + VECTOR_DB_URL=graph-db \ + VECTOR_DB_PORT=6379 \ + VECTOR_DATASET_DATABASE_HANDLER=falkor_vector_local \ + ENABLE_GRAPH_STORAGE=true \ + ENABLE_VECTOR_SEARCH=true \ + COGNEE_DATA_DIR=/app/data \ + # Cognee BaseConfig paths (pydantic_settings reads these env vars) + # These override the default paths in cognee.base_config.BaseConfig + DATA_ROOT_DIRECTORY=/app/data/.data_storage \ + SYSTEM_ROOT_DIRECTORY=/app/data/.cognee_system # Expose port EXPOSE 8001 diff --git a/services/rag/app/config.py b/services/rag/app/config.py index cad29617a..952a25b1c 100644 --- a/services/rag/app/config.py +++ b/services/rag/app/config.py @@ -35,12 +35,6 @@ class Settings(BaseSettings): # PostgreSQL connection for cognee storage and PGVector database_url: Optional[str] = None - # ======================================================================== - # Graph Database Configuration (Kuzu Remote) - # ======================================================================== - graph_db_provider: str = "kuzu-remote" - graph_db_url: str = "http://graph-db:8000" - # ======================================================================== # LLM Provider Configuration (OpenAI-compatible) # ======================================================================== @@ -79,6 +73,13 @@ class Settings(BaseSettings): # Custom prompt for text extraction (optional) vision_extraction_prompt: Optional[str] = None + # ======================================================================== + # Knowledge Graph Extraction Configuration + # ======================================================================== + # Custom prompt for knowledge graph extraction (controls entity/relationship naming) + # If not set, uses default prompt that enforces English identifiers for FalkorDB + graph_extraction_prompt: Optional[str] = None + # ======================================================================== # Feature Flags # ======================================================================== diff --git a/services/rag/app/main.py b/services/rag/app/main.py index 29af49f4b..4b4cb0958 100644 --- a/services/rag/app/main.py +++ b/services/rag/app/main.py @@ -73,6 +73,17 @@ async def lifespan(app: FastAPI): except Exception: logger.exception("Failed to cleanup stale jobs on startup") + # Ensure HNSW indexes exist on vector tables for fast similarity search + try: + from .services.cognee.cleanup import ensure_vector_hnsw_indexes + index_result = await ensure_vector_hnsw_indexes() + if index_result["created"]: + logger.info( + f"Created {len(index_result['created'])} HNSW index(es) on startup" + ) + except Exception: + logger.exception("Failed to ensure HNSW indexes on startup") + # Start periodic GC cleanup task (replaces per-request middleware) gc_task = asyncio.create_task(periodic_gc_cleanup()) diff --git a/services/rag/app/models.py b/services/rag/app/models.py index ee4f019a5..687f142c4 100644 --- a/services/rag/app/models.py +++ b/services/rag/app/models.py @@ -55,6 +55,17 @@ class DocumentAddRequest(BaseModel): default=None, description="Optional custom document ID", ) + # Multi-tenancy support + user_id: Optional[str] = Field( + default=None, + description="User ID for multi-tenant isolation. When ENABLE_BACKEND_ACCESS_CONTROL is true, " + "documents are stored in the user's isolated dataset.", + ) + dataset_name: Optional[str] = Field( + default=None, + description="Dataset name for organizing documents. When specified with user_id, " + "creates a user-scoped dataset. Format: 'tale_team_{teamId}' for team datasets.", + ) class DocumentAddResponse(BaseModel): @@ -82,6 +93,11 @@ class DocumentAddResponse(BaseModel): default=None, description="Background job identifier when ingestion is queued", ) + cleaned_datasets: Optional[List[str]] = Field( + default=None, + description="List of old datasets that were cleaned up during upload " + "(when document was moved to a different team/dataset)", + ) class DocumentDeleteRequest(BaseModel): @@ -204,6 +220,17 @@ class QueryRequest(BaseModel): default=None, description="Optional filters for metadata" ) + # Multi-tenancy support + user_id: Optional[str] = Field( + default=None, + description="User ID for multi-tenant search. When ENABLE_BACKEND_ACCESS_CONTROL is true, " + "search is restricted to datasets accessible by this user.", + ) + datasets: Optional[List[str]] = Field( + default=None, + description="List of dataset names to search within. When not specified, searches all " + "datasets accessible by the user. Format: ['tale_team_{teamId}', ...]", + ) class SearchResult(BaseModel): @@ -252,6 +279,17 @@ class GenerateRequest(BaseModel): default=None, description="Maximum tokens to generate (overrides default)" ) + # Multi-tenancy support + user_id: Optional[str] = Field( + default=None, + description="User ID for multi-tenant generation. Context is retrieved from " + "datasets accessible by this user.", + ) + datasets: Optional[List[str]] = Field( + default=None, + description="List of dataset names to retrieve context from. " + "Format: ['tale_team_{teamId}', ...]", + ) class GenerateResponse(BaseModel): diff --git a/services/rag/app/routers/documents.py b/services/rag/app/routers/documents.py index b5199d462..1c52c45d0 100644 --- a/services/rag/app/routers/documents.py +++ b/services/rag/app/routers/documents.py @@ -42,17 +42,21 @@ async def _ingest_single_document( content: str, metadata: Optional[dict[str, Any]], document_id: Optional[str], + user_id: Optional[str] = None, + dataset_name: Optional[str] = None, ) -> DocumentAddResponse: """Ingest a single text document.""" # Persist text content to file so cognee can operate on a path file_path = await _persist_text_content(content) try: - # Add to cognee + # Add to cognee with multi-tenant support result = await cognee_service.add_document( content=file_path, metadata=metadata, document_id=document_id, + user_id=user_id, + dataset_name=dataset_name, ) success = result.get("success", False) @@ -93,6 +97,8 @@ async def _background_ingest_text( content: str, metadata: Optional[dict[str, Any]], document_id: str, + user_id: Optional[str] = None, + dataset_name: Optional[str] = None, ) -> None: try: job_store.mark_running(job_id=document_id) @@ -100,6 +106,8 @@ async def _background_ingest_text( content=content, metadata=metadata, document_id=document_id, + user_id=user_id, + dataset_name=dataset_name, ) job_store.mark_completed( job_id=document_id, @@ -121,6 +129,8 @@ async def _background_ingest_text( request.content, request.metadata, doc_id, + request.user_id, + request.dataset_name, ) # Return immediately with queued status so upstream callers (e.g. Convex @@ -140,6 +150,8 @@ async def upload_document( file: UploadFile = File(..., description="File to upload"), metadata: Optional[str] = Form(None, description="Optional metadata as JSON string"), document_id: Optional[str] = Form(None, description="Optional custom document ID"), + user_id: Optional[str] = Form(None, description="User ID for multi-tenant isolation"), + dataset_name: Optional[str] = Form(None, description="Dataset name for organizing documents"), background_tasks: BackgroundTasks = None, ): """Upload a file to the knowledge base. @@ -209,6 +221,8 @@ async def _background_ingest_file( path: str, metadata_dict: dict[str, Any], doc_id_inner: str, + user_id_inner: Optional[str] = None, + dataset_name_inner: Optional[str] = None, ) -> None: try: job_store.mark_running(job_id=doc_id_inner) @@ -216,6 +230,8 @@ async def _background_ingest_file( content=path, metadata=metadata_dict, document_id=doc_id_inner, + user_id=user_id_inner, + dataset_name=dataset_name_inner, ) job_store.mark_completed( job_id=doc_id_inner, @@ -259,10 +275,12 @@ async def _background_ingest_file( tmp_path, parsed_metadata, doc_id, + user_id, + dataset_name, ) else: # Fallback for contexts without BackgroundTasks (should be rare) - await _background_ingest_file(tmp_path, parsed_metadata, doc_id) + await _background_ingest_file(tmp_path, parsed_metadata, doc_id, user_id, dataset_name) return DocumentAddResponse( success=True, diff --git a/services/rag/app/routers/search.py b/services/rag/app/routers/search.py index 2bf9754fb..c3797b670 100644 --- a/services/rag/app/routers/search.py +++ b/services/rag/app/routers/search.py @@ -37,6 +37,8 @@ async def search(request: QueryRequest): top_k=request.top_k, similarity_threshold=request.similarity_threshold, _filters=request.filters, + user_id=request.user_id, + datasets=request.datasets, ) processing_time = (time.time() - start_time) * 1000 @@ -77,6 +79,8 @@ async def generate(request: GenerateRequest): system_prompt=request.system_prompt, temperature=request.temperature, max_tokens=request.max_tokens, + user_id=request.user_id, + datasets=request.datasets, ) sources = [ diff --git a/services/rag/app/services/cognee/cleanup.py b/services/rag/app/services/cognee/cleanup.py index 43a7d12e3..7dc398be7 100644 --- a/services/rag/app/services/cognee/cleanup.py +++ b/services/rag/app/services/cognee/cleanup.py @@ -3,6 +3,7 @@ This module provides functions to: - Clean up stale or legacy data rows that reference files that no longer exist - Migrate vector tables when embedding dimensions change +- Create HNSW indexes on vector tables for fast similarity search """ import os @@ -13,6 +14,133 @@ from ...config import settings +async def ensure_vector_hnsw_indexes() -> dict: + """Create HNSW indexes on all PGVector tables that don't have one. + + Cognee creates vector tables dynamically (one per collection/dataset). + Without HNSW indexes, queries on large datasets (200k+ vectors) can take + 5-15 seconds. With HNSW indexes, queries complete in <500ms. + + This function is idempotent - it only creates indexes that don't exist. + + Returns: + Dict with 'created' (list of index names) and 'existing' (count). + """ + result = {"created": [], "existing": 0, "errors": []} + + try: + import asyncpg + + db_url = settings.get_database_url() + parsed = urlparse(db_url) + + if parsed.scheme not in ("postgresql", "postgres"): + logger.debug( + "Unsupported database scheme '{}', skipping HNSW index creation", + parsed.scheme, + ) + return result + + conn = await asyncpg.connect( + host=parsed.hostname or "localhost", + port=parsed.port or 5432, + database=parsed.path.lstrip("/") if parsed.path else "", + user=parsed.username or "", + password=parsed.password or "", + ) + + try: + # Find all tables with vector columns + vector_columns = await conn.fetch( + """ + SELECT + c.relname as table_name, + a.attname as column_name + FROM pg_class c + JOIN pg_attribute a ON a.attrelid = c.oid + JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind = 'r' + AND n.nspname = 'public' + AND a.attnum > 0 + AND pg_catalog.format_type(a.atttypid, a.atttypmod) LIKE 'vector%' + ORDER BY c.relname + """ + ) + + if not vector_columns: + logger.debug("No vector tables found, skipping HNSW index creation") + return result + + for row in vector_columns: + table_name = row["table_name"] + column_name = row["column_name"] + index_name = f"{table_name}_{column_name}_hnsw_idx" + + # Check if index already exists + exists = await conn.fetchval( + """ + SELECT EXISTS ( + SELECT 1 FROM pg_indexes + WHERE schemaname = 'public' + AND indexname = $1 + ) + """, + index_name, + ) + + if exists: + result["existing"] += 1 + continue + + # Create HNSW index + try: + logger.info( + "Creating HNSW index: {} on {}.{}", + index_name, + table_name, + column_name, + ) + # Use cosine distance (most common for embeddings) + # m=16, ef_construction=64 are good defaults + await conn.execute( + f'CREATE INDEX "{index_name}" ON "{table_name}" ' + f'USING hnsw ("{column_name}" vector_cosine_ops) ' + f"WITH (m = 16, ef_construction = 64)" + ) + result["created"].append(index_name) + logger.info("Created HNSW index: {}", index_name) + except Exception as e: + error_msg = f"Failed to create index {index_name}: {e}" + logger.error(error_msg) + result["errors"].append(error_msg) + + finally: + await conn.close() + + if result["created"]: + logger.info( + "HNSW index creation complete: {} created, {} already existed", + len(result["created"]), + result["existing"], + ) + elif result["existing"] > 0: + logger.debug( + "All {} vector column(s) already have HNSW indexes", + result["existing"], + ) + + except ImportError: + logger.debug( + "asyncpg not available, skipping HNSW index creation. " + "Install asyncpg to enable automatic index management." + ) + except Exception as e: + logger.error("HNSW index creation failed: {}", e) + result["errors"].append(str(e)) + + return result + + async def migrate_vector_dimensions() -> None: """Check and migrate vector tables if embedding dimensions have changed. @@ -209,7 +337,14 @@ async def cleanup_legacy_site_packages_data() -> None: legacy_substring, ) except Exception as cleanup_err: - logger.error("Failed to cleanup legacy Cognee data rows: {}", cleanup_err) + if "UndefinedTableError" in str(type(cleanup_err).__name__) or "does not exist" in str( + cleanup_err + ): + logger.warning( + "Cognee data table does not exist yet, skipping legacy cleanup (this is normal on first run)" + ) + else: + logger.error("Failed to cleanup legacy Cognee data rows: {}", cleanup_err) async def cleanup_missing_local_files_data() -> None: @@ -291,8 +426,15 @@ async def cleanup_missing_local_files_data() -> None: data_root_prefix, ) except Exception as cleanup_err: - logger.error( - "Failed to cleanup Cognee data rows with missing local files: {}", - cleanup_err, - ) + if "UndefinedTableError" in str(type(cleanup_err).__name__) or "does not exist" in str( + cleanup_err + ): + logger.warning( + "Cognee data table does not exist yet, skipping missing-file cleanup (this is normal on first run)" + ) + else: + logger.error( + "Failed to cleanup Cognee data rows with missing local files: {}", + cleanup_err, + ) diff --git a/services/rag/app/services/cognee/config.py b/services/rag/app/services/cognee/config.py index d1368002d..d4cbcc67d 100644 --- a/services/rag/app/services/cognee/config.py +++ b/services/rag/app/services/cognee/config.py @@ -2,9 +2,19 @@ This module sets up environment variables and initializes cognee BEFORE the main cognee package is imported. + +IMPORTANT: The FalkorDB adapter import triggers cognee import, which reads +LLM environment variables at import time. Therefore, we must set all LLM +environment variables BEFORE importing the adapter. + +Upstream Issues (remove patches when fixed): +- https://github.com/topoteretes/cognee-community/issues/59 (Non-ASCII identifiers) +- https://github.com/topoteretes/cognee-community/issues/60 (is_empty IndexError) +- https://github.com/topoteretes/cognee-community/issues/61 (add_nodes IndexError) """ import os +import re from typing import Any from urllib.parse import urlparse @@ -13,6 +23,125 @@ from ...config import settings +def _pre_configure_llm_env() -> None: + """Set LLM environment variables BEFORE any cognee imports. + + Cognee reads LLM configuration from environment variables at import time. + This function must be called before importing cognee or any adapter that + triggers cognee import (like cognee_community_hybrid_adapter_falkor). + """ + # Get LLM config - this validates required env vars are set + try: + llm_config = settings.get_llm_config() + except ValueError as e: + logger.warning(f"LLM config not available for pre-configuration: {e}") + return + + api_key = llm_config["api_key"] + base_url = llm_config["base_url"] + model = llm_config["model"] + embedding_model = llm_config["embedding_model"] + + # Add openai/ prefix for non-OpenAI endpoints (for LiteLLM routing) + cognee_llm_model = model + cognee_embedding_model = embedding_model + if "api.openai.com" not in base_url: + if not model.startswith("openai/"): + cognee_llm_model = f"openai/{model}" + if not embedding_model.startswith("openai/"): + cognee_embedding_model = f"openai/{embedding_model}" + + # Set LLM environment variables that Cognee reads at import time + os.environ.setdefault("LLM_PROVIDER", "openai") + os.environ.setdefault("LLM_API_KEY", api_key) + os.environ.setdefault("LLM_ENDPOINT", base_url) + os.environ.setdefault("LLM_MODEL", cognee_llm_model) + os.environ.setdefault("EMBEDDING_PROVIDER", "openai") + os.environ.setdefault("EMBEDDING_MODEL", cognee_embedding_model) + os.environ.setdefault("EMBEDDING_API_KEY", api_key) + os.environ.setdefault("EMBEDDING_ENDPOINT", base_url) + + # Set embedding dimensions + try: + embedding_dimensions = settings.get_embedding_dimensions() + os.environ.setdefault("EMBEDDING_DIMENSIONS", str(embedding_dimensions)) + except ValueError: + pass # Will be set later if available + + # Export OPENAI_* for libraries that look at these env vars + os.environ.setdefault("OPENAI_API_KEY", api_key) + os.environ.setdefault("OPENAI_BASE_URL", base_url) + + logger.debug("Pre-configured LLM environment variables for Cognee import") + + +def _pre_configure_database_env() -> None: + """Set database environment variables BEFORE any cognee imports. + + Cognee reads database configuration from environment variables at import time. + This function must be called before importing cognee or any adapter that + triggers cognee import (like cognee_community_hybrid_adapter_falkor). + """ + # Get database URL - this validates the env var is set + try: + database_url = settings.get_database_url() + except ValueError as e: + logger.warning(f"Database config not available for pre-configuration: {e}") + return + + parsed = urlparse(database_url) + + # Set PostgreSQL configuration for Cognee + # These must be set BEFORE cognee imports + os.environ["DB_PROVIDER"] = "postgres" + os.environ["DB_NAME"] = parsed.path.lstrip("/") + os.environ["DB_HOST"] = parsed.hostname or "localhost" + os.environ["DB_PORT"] = str(parsed.port or 5432) + os.environ["DB_USERNAME"] = parsed.username or "" + os.environ["DB_PASSWORD"] = parsed.password or "" + + # Also set FalkorDB env vars for graph/vector storage + falkordb_url = os.environ.get("GRAPH_DATABASE_URL", "graph-db") + falkordb_port = os.environ.get("GRAPH_DATABASE_PORT", "6379") + + os.environ["GRAPH_DATABASE_PROVIDER"] = "falkor" + os.environ["GRAPH_DATABASE_URL"] = falkordb_url + os.environ["GRAPH_DATABASE_PORT"] = falkordb_port + os.environ["GRAPH_DATASET_DATABASE_HANDLER"] = "falkor_graph_local" + + os.environ["VECTOR_DB_PROVIDER"] = "falkor" + os.environ["VECTOR_DB_URL"] = falkordb_url + os.environ["VECTOR_DB_PORT"] = falkordb_port + os.environ["VECTOR_DATASET_DATABASE_HANDLER"] = "falkor_vector_local" + + logger.debug( + "Pre-configured database environment: PostgreSQL {}@{}:{}/{}, FalkorDB {}:{}", + parsed.username, + parsed.hostname, + parsed.port or 5432, + parsed.path.lstrip("/"), + falkordb_url, + falkordb_port, + ) + + +# PRE-CONFIGURE ALL env vars BEFORE any cognee-related imports +# This is critical because the adapter import triggers cognee import, +# which reads env vars at import time (not runtime) +_pre_configure_llm_env() +_pre_configure_database_env() + +# NOW register FalkorDB adapter (this triggers cognee import) +try: + from cognee_community_hybrid_adapter_falkor import register # noqa: F401 + + logger.info("FalkorDB adapter registered successfully") +except ImportError: + logger.warning( + "cognee-community-hybrid-adapter-falkor not installed, FalkorDB support unavailable" + ) + + def patch_tiktoken() -> None: """Patch tiktoken to handle unknown models gracefully. @@ -74,15 +203,77 @@ def configure_litellm_drop_params() -> None: logger.debug("litellm not available, skipping drop_params configuration") +def _patch_litellm_aembedding() -> None: + """Patch litellm.aembedding to filter empty inputs. + + Cognee's LiteLLMEmbeddingEngine calls litellm.aembedding() directly. + When FalkorDB adapter's create_data_points collects embeddable values, + it may produce an empty list if all data points have None properties. + + This patch intercepts aembedding calls to: + 1. Filter out empty strings from input + 2. Return empty response if all inputs are empty (prevents API error) + + This is different from the OpenAIChatCompletion.embedding patch because + Cognee bypasses that layer by calling aembedding directly. + """ + try: + import litellm + + # Check if already patched + if getattr(litellm, "_tale_aembedding_patch_applied", False): + return + + _original_aembedding = litellm.aembedding + + async def _patched_aembedding( + model: str, + input: list, + **kwargs: Any, + ) -> Any: + # Filter out empty or whitespace-only strings from input + original_input_len = len(input) if input else 0 + if input: + filtered_input = [ + item for item in input + if item and (not isinstance(item, str) or item.strip()) + ] + if len(filtered_input) < original_input_len: + logger.warning( + f"aembedding: Filtered {original_input_len - len(filtered_input)} empty inputs " + f"(remaining: {len(filtered_input)})" + ) + input = filtered_input + + # If all inputs were filtered out, return empty response + if not input: + logger.warning("aembedding: All inputs were empty, returning empty response") + from litellm import EmbeddingResponse + return EmbeddingResponse( + model=model, + data=[], + usage={"prompt_tokens": 0, "total_tokens": 0}, + ) + + return await _original_aembedding(model=model, input=input, **kwargs) + + litellm.aembedding = _patched_aembedding + litellm._tale_aembedding_patch_applied = True + logger.info("Patched litellm.aembedding to filter empty inputs") + except ImportError as e: + logger.debug(f"litellm not available, skipping aembedding patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch litellm.aembedding: {e}") + + def _patch_litellm_embedding() -> None: - """Patch LiteLLM embedding to remove encoding_format parameter for OpenRouter. + """Patch LiteLLM OpenAI embedding to remove encoding_format for non-OpenAI endpoints. OpenRouter's embeddings API only accepts 'float' or 'base64' for encoding_format, but LiteLLM may send other values internally. This patch intercepts the internal OpenAI embedding call to remove the encoding_format parameter. - We patch litellm.llms.openai.openai.OpenAIChatCompletion.embedding method - which is called internally by litellm.aembedding(). + We patch litellm.llms.openai.openai.OpenAIChatCompletion.embedding method. """ try: import litellm @@ -131,13 +322,363 @@ def _patched_embedding( OpenAIChatCompletion.embedding = _patched_embedding OpenAIChatCompletion._tale_embedding_patch_applied = True - logger.info("Patched LiteLLM OpenAIChatCompletion.embedding to remove encoding_format for non-OpenAI endpoints") + logger.info("Patched LiteLLM OpenAI embedding to remove encoding_format") except ImportError as e: logger.debug(f"litellm not available, skipping embedding patch: {e}") except Exception as e: logger.warning(f"Failed to patch LiteLLM embedding: {e}") +def _sanitize_identifier_for_cypher(name: str, default: str = "UNKNOWN") -> str: + """Sanitize a string to ASCII-only for use as a Cypher identifier. + + FalkorDB's Cypher parser only supports ASCII characters in identifiers + (node labels, relationship types, property names). This function converts + non-ASCII characters to their transliterated ASCII equivalents using + unidecode, preserving semantic meaning. + + Examples: + - "人物" -> "Ren_Wu" + - "属于" -> "Shu_Yu" + - "概念实体" -> "Gai_Nian_Shi_Ti" + - "Document_文档" -> "Document_Wen_Dang" + + Args: + name: The original identifier name (may contain Unicode characters) + default: Default value if sanitization results in empty string + + Returns: + ASCII-only identifier safe for FalkorDB Cypher + """ + if not name: + return default + + try: + from unidecode import unidecode as _unidecode + except ImportError: + _unidecode = None + + # Convert non-ASCII to ASCII using unidecode (preserves meaning) + if _unidecode is not None: + ascii_name = _unidecode(name) + else: + # Fallback: remove non-ASCII characters + ascii_name = name.encode("ascii", "ignore").decode("ascii") + + # Replace non-alphanumeric with underscores (standard Cypher identifier rules) + sanitized = re.sub(r"[^a-zA-Z0-9_]", "_", ascii_name) + # Collapse multiple underscores + sanitized = re.sub(r"_+", "_", sanitized) + # Remove leading/trailing underscores + sanitized = sanitized.strip("_") + # Ensure it starts with a letter (Cypher requirement for identifiers) + if sanitized and not sanitized[0].isalpha(): + sanitized = "N_" + sanitized + + return sanitized if sanitized else default + + +def _patch_falkordb_adapter_relationship_sanitize() -> None: + """Patch FalkorDB adapter to properly sanitize non-ASCII relationship names. + + Upstream: https://github.com/topoteretes/cognee-community/issues/59 + Remove this patch when the issue is fixed. + + FalkorDB's Cypher parser only supports ASCII characters in relationship type names. + The original sanitize_relationship_name uses \\w which includes Unicode characters + like Chinese, causing "Invalid input '�'" errors. + + This patch converts non-ASCII characters to their transliterated ASCII equivalents + using unidecode, preserving semantic meaning (e.g., "属于" -> "Shu_Yu"). + """ + try: + from cognee_community_hybrid_adapter_falkor.falkor_adapter import FalkorDBAdapter + + if getattr(FalkorDBAdapter, "_tale_relationship_patch_applied", False): + return + + import re + + try: + from unidecode import unidecode + except ImportError: + logger.warning("unidecode not installed, falling back to basic ASCII conversion") + unidecode = None + + def _patched_sanitize_relationship_name(self: Any, relationship_name: str) -> str: + """Sanitize relationship name to ASCII-only for FalkorDB Cypher compatibility. + + Converts non-ASCII characters to transliterated ASCII using unidecode. + For example: "属于" -> "Shu_Yu", "関係" -> "Guan_Xi" + """ + if not relationship_name: + return "RELATIONSHIP" + + # Convert non-ASCII to ASCII using unidecode (preserves meaning) + if unidecode is not None: + ascii_name = unidecode(relationship_name) + else: + # Fallback: remove non-ASCII characters + ascii_name = relationship_name.encode("ascii", "ignore").decode("ascii") + + # Replace non-alphanumeric with underscores (standard Cypher identifier rules) + sanitized = re.sub(r"[^a-zA-Z0-9_]", "_", ascii_name) + # Collapse multiple underscores + sanitized = re.sub(r"_+", "_", sanitized) + # Remove leading/trailing underscores + sanitized = sanitized.strip("_") + # Ensure it starts with a letter (Cypher requirement) + if sanitized and not sanitized[0].isalpha(): + sanitized = "R_" + sanitized + # Handle empty result + if not sanitized: + return "RELATIONSHIP" + + return sanitized.upper() + + FalkorDBAdapter.sanitize_relationship_name = _patched_sanitize_relationship_name + FalkorDBAdapter._tale_relationship_patch_applied = True + logger.info("Patched FalkorDB adapter to sanitize non-ASCII relationship names") + + _original_is_empty = FalkorDBAdapter.is_empty + + async def _patched_is_empty(self: Any) -> bool: + """Check if the graph is empty, handling empty result sets gracefully. + + Upstream: https://github.com/topoteretes/cognee-community/issues/60 + """ + query = "MATCH (n) RETURN true LIMIT 1;" + result = self.query(query) + # Original bug: result_set[0][0] fails with IndexError when graph is empty + # because an empty graph returns an empty result_set + if not result.result_set: + return True # Empty result means no nodes, so graph is empty + return False # If any result exists, graph is not empty + + FalkorDBAdapter.is_empty = _patched_is_empty + logger.info("Patched FalkorDB adapter is_empty to handle empty result sets") + + except ImportError as e: + logger.debug(f"FalkorDB adapter not available, skipping relationship patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch FalkorDB adapter: {e}") + + +def _patch_falkordb_adapter_add_node() -> None: + """Patch FalkorDB adapter to sanitize non-ASCII node labels. + + Upstream: https://github.com/topoteretes/cognee-community/issues/59 + Remove this patch when the issue is fixed. + + FalkorDB's Cypher parser only supports ASCII characters in node labels. + The add_node method uses properties["type"] as the node label, which may + contain non-ASCII characters (e.g., Chinese entity types from LLM extraction). + + This patch converts non-ASCII type names to ASCII equivalents using + _sanitize_identifier_for_cypher before passing to the original method. + """ + try: + from cognee_community_hybrid_adapter_falkor.falkor_adapter import FalkorDBAdapter + + if getattr(FalkorDBAdapter, "_tale_add_node_patch_applied", False): + return + + _original_add_node = FalkorDBAdapter.add_node + + async def _patched_add_node(self: Any, node_id: str, properties: dict[str, Any]) -> None: + """Add node with sanitized label for FalkorDB Cypher compatibility.""" + # Shallow copy to avoid mutating caller's dict + sanitized_properties = properties.copy() + + # Sanitize the type (node label) + if "type" in sanitized_properties: + original_type = sanitized_properties["type"] + sanitized_type = _sanitize_identifier_for_cypher(original_type, "Node") + sanitized_properties["type"] = sanitized_type + + # Sanitize index_fields (used for vector property names) + if "metadata" in sanitized_properties: + metadata = sanitized_properties.get("metadata", {}) + if metadata and "index_fields" in metadata: + original_fields = metadata["index_fields"] + sanitized_fields = [] + for field in original_fields: + sanitized_field = _sanitize_identifier_for_cypher(field, "field") + sanitized_fields.append(sanitized_field) + # Rename vector property keys if field name changed + if field != sanitized_field: + vector_key = f"{field}_vector" + if vector_key in sanitized_properties: + sanitized_properties[f"{sanitized_field}_vector"] = ( + sanitized_properties.pop(vector_key) + ) + sanitized_properties["metadata"] = {**metadata, "index_fields": sanitized_fields} + + return await _original_add_node(self, node_id, sanitized_properties) + + FalkorDBAdapter.add_node = _patched_add_node + FalkorDBAdapter._tale_add_node_patch_applied = True + logger.info("Patched FalkorDB adapter add_node for ASCII node labels") + + except ImportError as e: + logger.debug(f"FalkorDB adapter not available, skipping add_node patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch FalkorDB adapter add_node: {e}") + + +def _patch_falkordb_adapter_stringify_properties() -> None: + """Patch FalkorDB adapter to sanitize non-ASCII property names. + + Upstream: https://github.com/topoteretes/cognee-community/issues/59 + Remove this patch when the issue is fixed. + + FalkorDB's Cypher parser only supports ASCII characters in property names. + The stringify_properties method serializes property dicts to Cypher syntax, + but doesn't sanitize property keys that may contain non-ASCII characters. + + This patch converts non-ASCII property keys to ASCII equivalents while + preserving the original property values (which can contain any characters). + """ + try: + from cognee_community_hybrid_adapter_falkor.falkor_adapter import FalkorDBAdapter + + if getattr(FalkorDBAdapter, "_tale_stringify_properties_patch_applied", False): + return + + _original_stringify_properties = FalkorDBAdapter.stringify_properties + + def _patched_stringify_properties(self: Any, properties: dict[str, Any]) -> str: + """Convert properties to Cypher string with sanitized keys.""" + sanitized_properties = {} + for key, value in properties.items(): + if value is not None: + sanitized_key = _sanitize_identifier_for_cypher(key, "prop") + sanitized_properties[sanitized_key] = value + return _original_stringify_properties(self, sanitized_properties) + + FalkorDBAdapter.stringify_properties = _patched_stringify_properties + FalkorDBAdapter._tale_stringify_properties_patch_applied = True + logger.info("Patched FalkorDB adapter stringify_properties for ASCII property names") + + except ImportError as e: + logger.debug(f"FalkorDB adapter not available, skipping stringify_properties patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch FalkorDB adapter stringify_properties: {e}") + + +def _patch_falkordb_adapter_create_data_point_query() -> None: + """Patch FalkorDB adapter to sanitize DataPoint class names used as node labels. + + Upstream: https://github.com/topoteretes/cognee-community/issues/59 + Remove this patch when the issue is fixed. + + The create_data_point_query method uses data_point.__class__.__name__ as the + node label. If custom DataPoint subclasses have non-ASCII names, this causes + Cypher parser errors. + + This patch sanitizes the class name in the generated query. + """ + try: + from cognee_community_hybrid_adapter_falkor.falkor_adapter import FalkorDBAdapter + + if getattr(FalkorDBAdapter, "_tale_create_data_point_query_patch_applied", False): + return + + _original_create_data_point_query = FalkorDBAdapter.create_data_point_query + + def _patched_create_data_point_query(self: Any, data_point: Any) -> tuple[str, dict]: + """Create data point query with sanitized node label.""" + query, params = _original_create_data_point_query(self, data_point) + + # Get the original class name and sanitize it + original_label = data_point.__class__.__name__ + sanitized_label = _sanitize_identifier_for_cypher(original_label, "DataPoint") + + # Replace the label in the query if it changed + if original_label != sanitized_label: + # The query format is: MERGE (n:ClassName {id: $id}) SET n = $properties + query = query.replace(f"(n:{original_label} ", f"(n:{sanitized_label} ") + + return query, params + + FalkorDBAdapter.create_data_point_query = _patched_create_data_point_query + FalkorDBAdapter._tale_create_data_point_query_patch_applied = True + logger.info("Patched FalkorDB adapter create_data_point_query for ASCII labels") + + except ImportError as e: + logger.debug(f"FalkorDB adapter not available, skipping create_data_point_query patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch FalkorDB adapter create_data_point_query: {e}") + + +def _patch_falkordb_adapter_add_nodes() -> None: + """Patch FalkorDB adapter add_nodes to fix vector index bug. + + Upstream: https://github.com/topoteretes/cognee-community/issues/61 + Remove this patch when the issue is fixed. + + The original implementation has a bug where it uses enumerate(property_names) + to index into vectorized_values, but vectorized_values only contains vectors + for properties that have non-None values. This causes IndexError when some + embeddable properties are None. + + Fix: Use vector_map to correctly map property names to their vector indices. + """ + try: + from cognee.infrastructure.databases.graph.graph_db_interface import DataPoint + from cognee_community_hybrid_adapter_falkor.falkor_adapter import FalkorDBAdapter + + if getattr(FalkorDBAdapter, "_tale_add_nodes_patch_applied", False): + return + + _original_add_nodes = FalkorDBAdapter.add_nodes + + async def _patched_add_nodes(self: Any, nodes: list) -> None: + """Add nodes with fixed vector index mapping.""" + for node in nodes: + if isinstance(node, tuple) and len(node) == 2: + node_id, properties = node + await self.add_node(node_id, properties) + elif hasattr(node, "id") and hasattr(node, "model_dump"): + embeddable_values = [] + property_names = DataPoint.get_embeddable_property_names(node) + vector_map = {} + for property_name in property_names: + property_value = getattr(node, property_name, None) + if property_value is not None: + vector_map[property_name] = len(embeddable_values) + embeddable_values.append(property_value) + + vectorized_values = await self.embed_data(embeddable_values) + + # FIX: Only create vectors for properties that have values + properties = { + **node.model_dump(), + **( + { + f"{property_name}_vector": vectorized_values[vector_map[property_name]] + for property_name in vector_map.keys() + } + ), + } + + await self.add_node(str(node.id), properties) + else: + raise ValueError( + f"Invalid node format: {node}. Expected tuple (node_id, properties) " + f"or DataPoint object." + ) + + FalkorDBAdapter.add_nodes = _patched_add_nodes + FalkorDBAdapter._tale_add_nodes_patch_applied = True + logger.info("Patched FalkorDB adapter add_nodes to fix vector index bug") + + except ImportError as e: + logger.debug(f"FalkorDB adapter not available, skipping add_nodes patch: {e}") + except Exception as e: + logger.warning(f"Failed to patch FalkorDB adapter add_nodes: {e}") + + def setup_cognee_environment() -> None: """Set up environment variables for cognee BEFORE importing it. @@ -201,6 +742,11 @@ def setup_cognee_environment() -> None: embedding_dimensions = settings.get_embedding_dimensions() os.environ.setdefault("EMBEDDING_DIMENSIONS", str(embedding_dimensions)) + # Set chunk size for text chunking during cognify + # This controls the maximum tokens per chunk (affects retrieval precision) + # Default cognee value is 8191 which is too large for most RAG use cases + os.environ.setdefault("EMBEDDING_MAX_COMPLETION_TOKENS", str(settings.chunk_size)) + # Configure BAML for structured outputs (knowledge graph extraction) # Use BAML_LLM_MODEL to specify a different model for extraction if needed. # This is useful when the main model is a "thinking" model that causes JSON truncation. @@ -220,12 +766,13 @@ def setup_cognee_environment() -> None: os.environ.setdefault("OPENAI_BASE_URL", base_url) logger.info( - "LLM configured - Provider: {}, Model: {}, Embedding: {} (dim={}), BAML: {}", + "LLM configured - Provider: {}, Model: {}, Embedding: {} (dim={}), BAML: {}, chunk_size: {}", provider, cognee_llm_model, cognee_embedding_model, embedding_dimensions, baml_model, + settings.chunk_size, ) _setup_database_config() @@ -280,22 +827,39 @@ def _setup_database_config() -> None: def _setup_vector_and_graph_config() -> None: - """Set up vector and graph database configuration for Cognee.""" - # Set vector database configuration - # Cognee uses VECTOR_DB_PROVIDER to select the vector store backend - # Supported providers: LanceDB, PGVector, neptune_analytics, ChromaDB - # We use PGVector since we already have PostgreSQL configured - os.environ["VECTOR_DB_PROVIDER"] = "pgvector" - - logger.info("Configured Cognee to use PGVector for vector storage") - - # Set graph database configuration (Kuzu Remote) - # Cognee uses GRAPH_DATABASE_PROVIDER to select the graph store backend - os.environ["GRAPH_DATABASE_PROVIDER"] = settings.graph_db_provider - os.environ["GRAPH_DATABASE_URL"] = settings.graph_db_url + """Set up vector and graph database configuration for Cognee. + + Uses FalkorDB for both graph and vector storage via the hybrid adapter. + FalkorDB is a Redis-based graph database optimized for GraphRAG with: + - Native multi-tenant support (10K+ graphs per instance) + - Low latency (~140ms p99) + - Client-server architecture (no file-level locking issues) + - Combined graph and vector storage in one system + """ + # FalkorDB connection settings (defaults for Docker network) + # 'graph-db' is the Docker service name in compose.yml + falkordb_url = os.environ.get("GRAPH_DATABASE_URL", "graph-db") + falkordb_port = os.environ.get("GRAPH_DATABASE_PORT", "6379") + + # Use FalkorDB for graph storage + # Note: Cognee expects provider name "falkor" (not "falkordb") + os.environ["GRAPH_DATABASE_PROVIDER"] = "falkor" + os.environ["GRAPH_DATABASE_URL"] = falkordb_url + os.environ["GRAPH_DATABASE_PORT"] = falkordb_port + # Set the dataset handler for multi-user access control mode + os.environ["GRAPH_DATASET_DATABASE_HANDLER"] = "falkor_graph_local" + + # Use FalkorDB for vector storage (hybrid adapter handles both) + os.environ["VECTOR_DB_PROVIDER"] = "falkor" + os.environ["VECTOR_DB_URL"] = falkordb_url + os.environ["VECTOR_DB_PORT"] = falkordb_port + # Set the dataset handler for multi-user access control mode + os.environ["VECTOR_DATASET_DATABASE_HANDLER"] = "falkor_vector_local" logger.info( - f"Configured Cognee to use Kuzu remote graph store: {settings.graph_db_url}" + "Configured Cognee to use FalkorDB (graph + vector) at {}:{}", + falkordb_url, + falkordb_port, ) @@ -312,65 +876,12 @@ def _setup_feature_flags() -> None: "true" if settings.enable_query_logging else "false" ) - # Set cognee data directory - os.environ["COGNEE_DATA_DIR"] = settings.cognee_data_dir - - -def _patch_remote_kuzu_adapter() -> None: - """Patch RemoteKuzuAdapter to prevent it from creating a local Kuzu database. + # FalkorDB handles multi-tenancy natively via separate graphs per dataset. + # No need for file-based isolation (ENABLE_BACKEND_ACCESS_CONTROL) since + # FalkorDB is a centralized client-server database, not embedded files. - The Cognee RemoteKuzuAdapter inherits from KuzuAdapter and calls - super().__init__("/tmp/kuzu_remote"), which creates a local Kuzu database - even though we're using a remote REST API. With multiple uvicorn workers, - this causes file lock conflicts. - - This patch overrides the RemoteKuzuAdapter.__init__ to skip the parent's - _initialize_connection() call, which is the method that creates the local - database. The remote adapter doesn't need a local database since it uses - HTTP to communicate with the remote Kuzu server. - """ - try: - from cognee.infrastructure.databases.graph.kuzu.remote_kuzu_adapter import ( - RemoteKuzuAdapter, - ) - - # Check if already patched - if getattr(RemoteKuzuAdapter, "_tale_patched", False): - return - - def patched_init(self, api_url: str, username: str, password: str) -> None: - """Patched init that skips local Kuzu database creation.""" - import asyncio - from concurrent.futures import ThreadPoolExecutor - - # Initialize only the minimal attributes needed for RemoteKuzuAdapter - # WITHOUT calling parent __init__ (which creates a local Kuzu DB) - self.open_connections = 0 - self._is_closed = False - self.db_path = "/tmp/kuzu_remote" # Not actually used - self.db = None - self.connection = None - self.executor = ThreadPoolExecutor() - self.KUZU_ASYNC_LOCK = asyncio.Lock() - self._connection_change_lock = asyncio.Lock() - - # RemoteKuzuAdapter-specific attributes - self.api_url = api_url - self.username = username - self.password = password - self._session = None - self._schema_initialized = False - - RemoteKuzuAdapter.__init__ = patched_init - RemoteKuzuAdapter._tale_patched = True - logger.info( - "Patched RemoteKuzuAdapter to skip local Kuzu database creation " - "(fixes multi-worker lock conflicts)" - ) - except ImportError: - logger.debug("RemoteKuzuAdapter not available, skipping patch") - except Exception as e: - logger.warning(f"Failed to patch RemoteKuzuAdapter: {e}") + # Set cognee data directory (still needed for temp files and document processing) + os.environ["COGNEE_DATA_DIR"] = settings.cognee_data_dir def configure_cognee_base_config() -> None: @@ -411,15 +922,17 @@ def initialize_cognee() -> bool: """ patch_tiktoken() configure_litellm_drop_params() + _patch_litellm_aembedding() _patch_litellm_embedding() + _patch_falkordb_adapter_relationship_sanitize() + _patch_falkordb_adapter_add_node() + _patch_falkordb_adapter_stringify_properties() + _patch_falkordb_adapter_create_data_point_query() + _patch_falkordb_adapter_add_nodes() setup_cognee_environment() configure_cognee_base_config() try: - # Patch RemoteKuzuAdapter BEFORE importing cognee to prevent - # local Kuzu database creation that causes multi-worker lock conflicts - _patch_remote_kuzu_adapter() - import cognee # noqa: F401 logger.info("Cognee imported successfully with preconfigured base_config") return True diff --git a/services/rag/app/services/cognee/service.py b/services/rag/app/services/cognee/service.py index 751e1a6ec..b98daf7a4 100644 --- a/services/rag/app/services/cognee/service.py +++ b/services/rag/app/services/cognee/service.py @@ -66,6 +66,40 @@ def _map_api_search_type_to_cognee(search_type: ApiSearchType | None) -> SearchT # thousands of small documents. DEFAULT_COGNEE_DATASET_NAME = "tale_documents" +# Default prompt for knowledge graph extraction - enforces English identifiers +# for FalkorDB compatibility (Cypher parser only supports ASCII in identifiers) +DEFAULT_GRAPH_EXTRACTION_PROMPT = """ +Extract entities and relationships from the provided text content. + +CRITICAL REQUIREMENTS for FalkorDB compatibility: +1. ALL entity type names (node labels) MUST be in English using PascalCase (e.g., Person, Organization, Document, Concept) +2. ALL relationship type names MUST be in English using UPPER_SNAKE_CASE (e.g., WORKS_FOR, LOCATED_IN, RELATED_TO) +3. ALL property names MUST be in English using snake_case (e.g., name, description, created_at) +4. Property VALUES can be in any language (Chinese, etc.) - only the keys must be English + +Examples: +- Entity type: "Person" (not "人物"), "Organization" (not "组织"), "Document" (not "文档") +- Relationship: "BELONGS_TO" (not "属于"), "CREATED_BY" (not "创建者") +- Property: {"name": "张三", "description": "这是中文描述"} (keys in English, values can be Chinese) + +Focus on extracting meaningful entities and their relationships while strictly following the naming conventions above. +""" + +# System prompt for GRAPH_COMPLETION search - generates detailed, comprehensive answers +DEFAULT_GRAPH_COMPLETION_PROMPT = """You are a knowledgeable assistant that provides comprehensive answers based on the provided context. + +Instructions: +1. Provide detailed and thorough answers based on the context +2. Include specific information, policy details, and key points from the source documents +3. If there are specific clauses, regulations, or procedures mentioned, include them +4. Structure your answer clearly with sections if the topic has multiple aspects +5. Respond in the same language as the user's question +6. If the context is insufficient, clearly state what information is missing +7. Do not make up information - only use what is provided in the context + +Your goal is to give the user a complete understanding of the topic, not just a brief summary. +""" + class CogneeService: """Service wrapper for cognee RAG operations.""" @@ -77,6 +111,8 @@ def __init__(self) -> None: # Created once during initialize() to avoid per-request overhead self._llm_config: dict[str, Any] | None = None self._openai_client: AsyncOpenAI | None = None + # Note: FalkorDB is client-server architecture, no file-level locking + # issues like Kuzu had. No need for per-dataset initialization locks. async def initialize(self) -> None: """Initialize cognee with configuration.""" @@ -118,11 +154,105 @@ async def initialize(self) -> None: logger.error(f"Failed to initialize cognee: {e}") raise + async def get_document_datasets(self, document_id: str) -> list[dict[str, Any]]: + """Query all datasets that contain a document. + + Finds all Data records containing the given document_id in their node_set, + and returns dataset information for each record. + + Args: + document_id: The document ID to search for + + Returns: + List of dicts, each containing { data_id: UUID, dataset_id: UUID, dataset_name: str } + """ + if not self.initialized: + await self.initialize() + + try: + from sqlalchemy import select, cast, String + from cognee.infrastructure.databases.relational import get_relational_engine + from cognee.modules.data.models import Data, Dataset, DatasetData + + db_engine = get_relational_engine() + async with db_engine.get_async_session() as session: + # Find all Data records containing this document_id in node_set + result = await session.execute( + select(Data).where( + cast(Data.node_set, String).contains(document_id) + ) + ) + matching_data = result.scalars().all() + + if not matching_data: + return [] + + # Get dataset information for each record + entries = [] + for data in matching_data: + dataset_link = ( + await session.execute( + select(DatasetData).where(DatasetData.data_id == data.id) + ) + ).scalars().first() + + if dataset_link: + # Get the dataset name + dataset = ( + await session.execute( + select(Dataset).where(Dataset.id == dataset_link.dataset_id) + ) + ).scalars().first() + + entries.append({ + "data_id": data.id, + "dataset_id": dataset_link.dataset_id, + "dataset_name": dataset.name if dataset else "unknown", + }) + + return entries + + except Exception as e: + logger.warning(f"Failed to get document datasets for '{document_id}': {e}") + return [] + + async def _delete_data_entry( + self, + data_id: Any, + dataset_id: Any, + mode: str = "hard" + ) -> bool: + """Delete a single Data record and its associated data. + + Args: + data_id: Cognee Data record UUID + dataset_id: Dataset UUID + mode: Delete mode ("soft" or "hard") + + Returns: + Whether deletion was successful + """ + try: + from cognee.api.v1.delete import delete as cognee_delete + + await cognee_delete( + data_id=data_id, + dataset_id=dataset_id, + mode=mode, + ) + logger.info(f"Deleted data entry: {data_id} from dataset: {dataset_id}") + return True + except Exception as e: + logger.error(f"Failed to delete data entry {data_id}: {e}") + return False + async def add_document( self, content: str, metadata: Optional[dict[str, Any]] = None, document_id: Optional[str] = None, + user_id: Optional[str] = None, + dataset_name: Optional[str] = None, ) -> dict[str, Any]: """Add a document to the knowledge base. @@ -130,6 +260,10 @@ async def add_document( content: Path to the document file to ingest metadata: Optional metadata (reserved for future use) document_id: Optional custom document ID (used for tagging and later deletion) + user_id: Reserved for future user-level permission support. Currently not used; + multi-tenancy is handled via dataset_name. + dataset_name: Dataset name for multi-tenant isolation. + Format: 'tale_team_{teamId}' for team datasets, or 'tale_documents' for default. Returns: Dictionary with operation results @@ -144,10 +278,28 @@ async def add_document( start_time = time.time() timeout_seconds = settings.ingestion_timeout_seconds - # Add document to cognee. We use a shared logical dataset instead of - # creating one dataset per document_id to keep Cognee's in-memory - # structures bounded even when ingesting many small documents. - dataset_name = DEFAULT_COGNEE_DATASET_NAME + # Use the provided dataset_name for multi-tenant isolation, + # or fall back to the default shared dataset. + effective_dataset_name = dataset_name or DEFAULT_COGNEE_DATASET_NAME + + # Clean up document from old datasets if it exists elsewhere + # This handles the case when a document's team assignment changes + cleaned_datasets: list[str] = [] + if document_id: + existing_entries = await self.get_document_datasets(document_id) + for entry in existing_entries: + # Only delete records from datasets other than the target + if entry["dataset_name"] != effective_dataset_name: + success = await self._delete_data_entry( + entry["data_id"], + entry["dataset_id"], + mode="hard" + ) + if success: + cleaned_datasets.append(entry["dataset_name"]) + logger.info( + f"Cleaned up document '{document_id}' from old dataset: {entry['dataset_name']}" + ) # Use node_set to tag the document with our document_id for later deletion # This allows us to find and delete documents by their external ID @@ -155,7 +307,7 @@ async def add_document( logger.info( f"Starting document ingestion for {document_id or 'unknown'} " - f"(timeout: {timeout_seconds}s)" + f"(timeout: {timeout_seconds}s, dataset: {effective_dataset_name})" ) # Pre-process PDFs and images with Vision API @@ -184,13 +336,17 @@ async def add_document( ) # Wrap cognee.add() with timeout + # Multi-tenancy is handled via dataset_name filtering, not Cognee's user system. + # We use logical isolation (dataset names like "tale_team_xxx") instead of + # Cognee's ENABLE_BACKEND_ACCESS_CONTROL which requires specific backends. try: + add_kwargs: dict[str, Any] = { + "dataset_name": effective_dataset_name, + "node_set": node_set, + } + result = await asyncio.wait_for( - cognee.add( - file_to_ingest, - dataset_name=dataset_name, - node_set=node_set, - ), + cognee.add(file_to_ingest, **add_kwargs), timeout=timeout_seconds, ) except asyncio.TimeoutError: @@ -226,11 +382,25 @@ async def add_document( ): with attempt: try: + # Build cognify kwargs, including user context if available + cognify_kwargs: dict[str, Any] = { + "datasets": [effective_dataset_name], + "incremental_loading": True, + # Explicitly set chunk_size to override cognee's default (8191) + # Smaller chunks improve retrieval precision for RAG + "chunk_size": settings.chunk_size, + } + if "user" in add_kwargs: + cognify_kwargs["user"] = add_kwargs["user"] + + # Add custom prompt for English identifier enforcement + # This helps FalkorDB compatibility (Cypher parser requires ASCII) + custom_prompt = settings.graph_extraction_prompt or DEFAULT_GRAPH_EXTRACTION_PROMPT + cognify_kwargs["custom_prompt"] = custom_prompt + + logger.info(f"Calling cognee.cognify with chunk_size={cognify_kwargs.get('chunk_size')}") await asyncio.wait_for( - cognee.cognify( - datasets=[dataset_name], - incremental_loading=True, - ), + cognee.cognify(**cognify_kwargs), timeout=remaining_timeout, ) except asyncio.TimeoutError: @@ -252,6 +422,7 @@ async def add_document( "document_id": doc_id, "chunks_created": chunks_created, "processing_time_ms": processing_time, + "cleaned_datasets": cleaned_datasets, } except TimeoutError: @@ -278,6 +449,8 @@ async def search( top_k: Optional[int] = None, similarity_threshold: Optional[float] = None, _filters: Optional[dict[str, Any]] = None, + user_id: Optional[str] = None, + datasets: Optional[list[str]] = None, ) -> list[dict[str, Any]]: """Search the knowledge base. @@ -288,6 +461,10 @@ async def search( top_k: Number of results to return similarity_threshold: Minimum similarity score _filters: Optional metadata filters (reserved for future use) + user_id: Reserved for future user-level permission support. Currently not used; + multi-tenancy is handled via datasets parameter. + datasets: List of dataset names to search within for multi-tenant isolation. + Format: ['tale_documents', 'tale_team_xxx', ...] Returns: List of search results @@ -302,15 +479,108 @@ async def search( cognee_search_type = _map_api_search_type_to_cognee(search_type) logger.info( - f"Searching with type={cognee_search_type.value}, query='{query[:50]}...'" + f"Searching with type={cognee_search_type.value}, query='{query[:50]}...', " + f"datasets={datasets}" ) - # Use cognee search with specified search type - raw_results = await cognee.search( - query, - query_type=cognee_search_type, - top_k=top_k or settings.top_k, - ) + # Build base search kwargs + # Multi-tenancy is handled via dataset filtering, not Cognee's user system. + # We use logical isolation (dataset names like "tale_team_xxx") instead of + # Cognee's ENABLE_BACKEND_ACCESS_CONTROL which requires specific backends. + effective_top_k = top_k or settings.top_k + + # Use custom system prompt for GRAPH_COMPLETION to generate detailed answers + system_prompt = None + if cognee_search_type in ( + SearchType.GRAPH_COMPLETION, + SearchType.RAG_COMPLETION, + SearchType.GRAPH_SUMMARY_COMPLETION, + ): + system_prompt = DEFAULT_GRAPH_COMPLETION_PROMPT + + # Search datasets concurrently, handling partial failures gracefully. + # If one dataset has no vector index, we still want results from others. + raw_results: list[Any] = [] + + if datasets: + import asyncio + + async def search_dataset(ds: str) -> tuple[str, list[Any] | Exception]: + try: + results = await cognee.search( + query, + query_type=cognee_search_type, + top_k=effective_top_k, + datasets=[ds], + system_prompt=system_prompt, + ) + return (ds, results or []) + except Exception as e: + return (ds, e) + + # Search all datasets concurrently + dataset_results = await asyncio.gather( + *[search_dataset(ds) for ds in datasets] + ) + + # Collect results, skip failed datasets + for dataset, result in dataset_results: + if isinstance(result, Exception): + error_str = str(result) + if ( + "No vector index found" in error_str + or "CollectionNotFoundError" in error_str + or "NoDataError" in error_str + or "No data found in the system" in error_str + or "DatabaseNotCreatedError" in error_str + or "DatasetNotFoundError" in error_str + or "No datasets found" in error_str + ): + logger.debug(f"Dataset '{dataset}' skipped: no data yet") + else: + logger.warning(f"Dataset '{dataset}' search failed: {result}") + elif result: + # Extract actual chunks from cognee's nested structure + # cognee.search returns: [{'search_result': [...], 'dataset_id': ...}] + # search_result can be [[chunk1, chunk2]] (nested) or [chunk1, chunk2] (flat) + chunks_extracted = 0 + for item in result: + if isinstance(item, dict) and "search_result" in item: + search_results = item.get("search_result", []) + if search_results: + # Handle both nested [[chunk]] and flat [chunk] structures + if isinstance(search_results[0], list): + # Nested: [[chunk1, chunk2, ...]] + raw_results.extend(search_results[0]) + chunks_extracted += len(search_results[0]) + else: + # Flat: [chunk1, chunk2, ...] + raw_results.extend(search_results) + chunks_extracted += len(search_results) + else: + raw_results.append(item) + chunks_extracted += 1 + logger.debug(f"Dataset '{dataset}' returned {chunks_extracted} chunks") + else: + # No datasets specified - search globally + global_results = await cognee.search( + query, + query_type=cognee_search_type, + top_k=effective_top_k, + system_prompt=system_prompt, + ) + # Extract actual chunks from cognee's nested structure + for item in global_results or []: + if isinstance(item, dict) and "search_result" in item: + search_results = item.get("search_result", []) + if search_results: + # Handle both nested [[chunk]] and flat [chunk] structures + if isinstance(search_results[0], list): + raw_results.extend(search_results[0]) + else: + raw_results.extend(search_results) + else: + raw_results.append(item) # Normalize results - cognee.search may return strings or dicts normalized_results = normalize_search_results(raw_results) @@ -343,6 +613,17 @@ async def search( ) return [] + # Handle DatasetNotFoundError - happens when the specified dataset(s) don't exist + # This is normal when searching before any documents are indexed or + # when searching datasets that haven't been created yet + if "DatasetNotFoundError" in error_str or "No datasets found" in error_str: + logger.info( + f"Dataset(s) not found for search: {datasets}. " + "This is normal if no documents have been indexed to these datasets yet. " + "Search returning empty results." + ) + return [] + # Handle BamlValidationError - this happens when the knowledge graph # has no relevant nodes/connections for the query. The LLM returns # an empty response which BAML fails to parse. Return empty results. @@ -372,6 +653,8 @@ async def generate( system_prompt: Optional[str] = None, temperature: Optional[float] = None, max_tokens: Optional[int] = None, + user_id: Optional[str] = None, + datasets: Optional[list[str]] = None, ) -> dict[str, Any]: """Generate a response using RAG. @@ -381,6 +664,9 @@ async def generate( system_prompt: Optional system prompt temperature: LLM temperature max_tokens: Maximum tokens to generate + user_id: Reserved for future user-level permission support. Currently not used; + multi-tenancy is handled via datasets parameter. + datasets: List of dataset names to retrieve context from for multi-tenant isolation. Returns: Dictionary with generated response and sources @@ -391,8 +677,10 @@ async def generate( try: start_time = time.time() - # Search for relevant context - search_results = await self.search(query, top_k=top_k) + # Search for relevant context with multi-tenant dataset filtering + search_results = await self.search( + query, top_k=top_k, user_id=user_id, datasets=datasets + ) # Build context from search results context_parts = [] @@ -557,6 +845,7 @@ async def delete_document(self, document_id: str, mode: str = "hard") -> dict[st if dataset_link: dataset_id = dataset_link.dataset_id + try: # Use Cognee's delete function await cognee_delete( @@ -596,6 +885,20 @@ async def delete_document(self, document_id: str, mode: str = "hard") -> dict[st "processing_time_ms": None, } except Exception as e: + error_str = str(e) + # Handle case where data table doesn't exist yet (fresh database) + # This is normal on first run before any documents are indexed + if "UndefinedTableError" in error_str or "relation \"data\" does not exist" in error_str: + logger.info( + f"Data table does not exist yet, no documents to delete for '{document_id}'" + ) + return { + "success": True, + "message": f"No documents found with ID '{document_id}' (database not initialized)", + "deleted_count": 0, + "deleted_data_ids": [], + "processing_time_ms": None, + } logger.error(f"Failed to delete document: {e}") raise @@ -858,42 +1161,15 @@ def is_cognee_table(table_name: str) -> bool: logger.warning(f"PGVector cleanup failed (continuing): {e}") async def _cleanup_graph_database(self) -> None: - """Clear all data from the Kuzu graph database. - - Sends Cypher queries to delete all nodes and relationships. - """ - try: - import httpx + """Clear graph data from FalkorDB. - from ...config import settings - - graph_url = settings.graph_db_url + FalkorDB is a Redis-based client-server database. Graph data is managed + centrally and will be cleared when the PostgreSQL metadata is reset. + FalkorDB graphs are created dynamically per dataset and will be + recreated when documents are re-indexed. - async with httpx.AsyncClient(timeout=30.0) as client: - # Delete all relationships first, then all nodes - # Kuzu uses Cypher-like syntax - queries = [ - "MATCH ()-[r]->() DELETE r", # Delete all relationships - "MATCH (n) DELETE n", # Delete all nodes - ] - - for query in queries: - try: - response = await client.post( - f"{graph_url}/query", - json={"query": query}, - ) - if response.status_code == 200: - logger.debug(f"Graph query executed: {query}") - else: - logger.warning( - f"Graph query failed: {query}, status: {response.status_code}" - ) - except Exception as e: - logger.warning(f"Graph query failed: {query}, error: {e}") - - logger.info("Graph database cleanup completed") - - except Exception as e: - logger.warning(f"Graph database cleanup failed (continuing): {e}") + Note: For a complete FalkorDB reset, you may also want to flush the + FalkorDB instance directly using redis-cli FLUSHALL. + """ + logger.info("FalkorDB graph database: data will be recreated on re-index") diff --git a/services/rag/app/services/cognee/utils.py b/services/rag/app/services/cognee/utils.py index bd237d6dd..b1d77179d 100644 --- a/services/rag/app/services/cognee/utils.py +++ b/services/rag/app/services/cognee/utils.py @@ -70,39 +70,45 @@ def normalize_search_result(result: Any) -> Dict[str, Any]: """Normalize a single search result into a consistent dictionary format. Args: - result: A single result from cognee.search() + result: A single result (chunk) from cognee.search() Returns: Dictionary with content, score, document_id, and metadata """ if isinstance(result, str): - # If result is a string, wrap it in a dict return { "content": result, - "score": 1.0, # Default score for string results + "score": 1.0, "document_id": None, "metadata": {}, } elif isinstance(result, dict): - # Normalize dict to expected schema with defaults for missing keys + # Extract content from chunk payload (use 'text' field from DocumentChunk) + content = result.get("text", result.get("content", "")) + + # Build metadata, excluding large vector fields like text_vector + metadata: Dict[str, Any] = {} + for key in ("chunk_size", "chunk_index", "cut_type", "type"): + if key in result: + metadata[key] = result[key] + return { - "content": result.get("content", result.get("text", str(result))), + "content": content, "score": result.get("score", result.get("similarity", 1.0)), - "document_id": result.get("document_id", result.get("id")), - "metadata": result.get("metadata", {}), + "document_id": result.get("id", result.get("document_id")), + "metadata": metadata, } else: # Try to convert to dict if it has attributes try: return { - "content": getattr(result, "content", str(result)), + "content": getattr(result, "text", getattr(result, "content", str(result))), "score": getattr(result, "score", 1.0), - "document_id": getattr(result, "document_id", None), - "metadata": getattr(result, "metadata", {}), + "document_id": getattr(result, "id", getattr(result, "document_id", None)), + "metadata": {}, } except Exception as conv_err: logger.warning(f"Could not normalize search result ({type(result)}): {conv_err}") - # Fallback: convert to string return { "content": str(result), "score": 1.0, diff --git a/services/rag/app/services/vision/openai_client.py b/services/rag/app/services/vision/openai_client.py index 1eaa9c290..88d219b0b 100644 --- a/services/rag/app/services/vision/openai_client.py +++ b/services/rag/app/services/vision/openai_client.py @@ -42,13 +42,9 @@ def _detect_mime_type(image_bytes: bytes) -> str: If there's no readable text, respond with "[No text found]". Return ONLY the extracted text, nothing else.""" -DESCRIBE_PROMPT = """Describe this image in detail for document indexing purposes. -Include: -- What type of image it is (photo, chart, diagram, graph, illustration, etc.) -- The main subject or content -- Any visible text, labels, or captions -- Key details that would help someone searching for this content -Keep the description concise but comprehensive (2-4 sentences).""" +DESCRIBE_PROMPT = """Briefly describe this image in 1-2 short sentences (max 150 characters). +Focus on: image type (photo/chart/diagram), main subject, and key visible text. +Be extremely concise - omit minor details.""" class VisionClient: @@ -171,7 +167,7 @@ async def describe_image( ], } ], - max_tokens=500, + max_tokens=100, ) if not response.choices: diff --git a/services/rag/docker-entrypoint.sh b/services/rag/docker-entrypoint.sh index 49f41cef8..cc865e57f 100644 --- a/services/rag/docker-entrypoint.sh +++ b/services/rag/docker-entrypoint.sh @@ -18,8 +18,11 @@ if [ -z "${RAG_DATABASE_URL:-}" ]; then fi # Start the application with environment variables +# NOTE: RAG_WORKERS must be 1 for embedded databases (Kuzu + LanceDB). +# Multiple workers would fork separate processes, each trying to write to the +# same database files, causing data corruption. FastAPI async handles +# concurrency well within a single process. exec python -m uvicorn app.main:app \ --host "${RAG_HOST:-0.0.0.0}" \ --port "${RAG_PORT:-8001}" \ - --workers "${RAG_WORKERS:-2}" \ - --limit-max-requests "${RAG_MAX_REQUESTS_PER_WORKER:-100000}" + --workers "${RAG_WORKERS:-1}" diff --git a/services/rag/pyproject.toml b/services/rag/pyproject.toml index 33711ed1d..aea3b1ef6 100644 --- a/services/rag/pyproject.toml +++ b/services/rag/pyproject.toml @@ -4,17 +4,18 @@ version = "0.1.0" requires-python = ">=3.11" dependencies = [ "cognee[baml]==0.5.1", + "cognee-community-hybrid-adapter-falkor", "unstructured[xlsx,docx,pptx]==0.18.27", "PyMuPDF==1.26.7", "asyncpg==0.31.0", "psycopg2-binary==2.9.11", - "pgvector==0.4.2", "python-multipart==0.0.20", "python-dotenv==1.2.1", "loguru==0.7.3", "httpx==0.28.1", "aiofiles==25.1.0", "tenacity==9.1.2", + "unidecode==1.3.8", ] [project.optional-dependencies] diff --git a/services/rag/tests/concurrent_read_test.ts b/services/rag/tests/concurrent_read_test.ts new file mode 100644 index 000000000..5f9846759 --- /dev/null +++ b/services/rag/tests/concurrent_read_test.ts @@ -0,0 +1,315 @@ +#!/usr/bin/env npx tsx +/** + * Concurrent read test for RAG service. + * + * This script tests concurrent search requests to the RAG service to measure + * performance, throughput, and error rates under load. + * + * Usage: npx tsx concurrent_read_test.ts + */ + +interface RequestResult { + success: boolean; + latencyMs: number; + statusCode?: number; + error?: string; + totalResults: number; +} + +interface TestSummary { + totalRequests: number; + successfulRequests: number; + failedRequests: number; + totalTimeSeconds: number; + requestsPerSecond: number; + avgLatencyMs: number; + minLatencyMs: number; + maxLatencyMs: number; + p50LatencyMs: number; + p95LatencyMs: number; + p99LatencyMs: number; + errorRatePercent: number; +} + +const RAG_BASE_URL = "http://localhost:8001"; +const DEFAULT_DATASET = "tale_team_ddd123"; +const TEST_QUERIES = [ + "what is the document about?", + "key information", + "main topic", + "summary", + "important details", +]; + +async function makeSearchRequest( + query: string, + datasets: string[], + topK = 5 +): Promise { + const startTime = performance.now(); + + const payload = { + query, + search_type: "CHUNKS", + top_k: topK, + datasets, + include_metadata: true, + }; + + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 30000); + + const response = await fetch(`${RAG_BASE_URL}/api/v1/search`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + const latencyMs = performance.now() - startTime; + + if (response.ok) { + const data = await response.json(); + return { + success: true, + latencyMs, + statusCode: response.status, + totalResults: data.total_results ?? 0, + }; + } else { + const errorText = await response.text(); + return { + success: false, + latencyMs, + statusCode: response.status, + error: `HTTP ${response.status}: ${errorText.slice(0, 200)}`, + totalResults: 0, + }; + } + } catch (e) { + const latencyMs = performance.now() - startTime; + const error = e instanceof Error ? e.message : String(e); + return { + success: false, + latencyMs, + error: error.includes("abort") ? "Request timeout" : error, + totalResults: 0, + }; + } +} + +function percentile(sortedData: number[], p: number): number { + if (sortedData.length === 0) return 0; + const k = (sortedData.length - 1) * (p / 100); + const f = Math.floor(k); + const c = Math.min(f + 1, sortedData.length - 1); + return sortedData[f] + (k - f) * (sortedData[c] - sortedData[f]); +} + +async function runConcurrentTest( + numRequests: number, + concurrency: number, + datasets: string[] +): Promise { + console.log("\n" + "=".repeat(60)); + console.log("Running concurrent read test"); + console.log(` Total requests: ${numRequests}`); + console.log(` Concurrency: ${concurrency}`); + console.log(` Datasets: ${datasets.join(", ")}`); + console.log("=".repeat(60) + "\n"); + + const results: RequestResult[] = []; + const errorsSeenMap = new Map(); + let completed = 0; + let inFlight = 0; + + const startTime = performance.now(); + + const executeRequest = async (index: number): Promise => { + const query = TEST_QUERIES[index % TEST_QUERIES.length]; + const result = await makeSearchRequest(query, datasets); + results.push(result); + + if (!result.success && result.error) { + const errorKey = result.error.slice(0, 80); + errorsSeenMap.set(errorKey, (errorsSeenMap.get(errorKey) ?? 0) + 1); + } + + completed++; + if (completed % 10 === 0 || completed === numRequests) { + console.log(` Progress: ${completed}/${numRequests} requests completed`); + } + }; + + const pending: Promise[] = []; + let nextIndex = 0; + + while (nextIndex < numRequests || pending.length > 0) { + while (inFlight < concurrency && nextIndex < numRequests) { + const index = nextIndex++; + inFlight++; + const promise = executeRequest(index).finally(() => { + inFlight--; + }); + pending.push(promise); + } + + if (pending.length > 0) { + await Promise.race(pending); + const resolvedIndices: number[] = []; + for (let i = 0; i < pending.length; i++) { + const status = await Promise.race([ + pending[i].then(() => "resolved" as const), + Promise.resolve("pending" as const), + ]); + if (status === "resolved") { + resolvedIndices.push(i); + } + } + for (let i = resolvedIndices.length - 1; i >= 0; i--) { + pending.splice(resolvedIndices[i], 1); + } + } + } + + const totalTime = (performance.now() - startTime) / 1000; + + const successful = results.filter((r) => r.success); + const failed = results.filter((r) => !r.success); + + if (errorsSeenMap.size > 0) { + console.log("\n Error breakdown:"); + const sortedErrors = [...errorsSeenMap.entries()].sort( + (a, b) => b[1] - a[1] + ); + for (const [error, count] of sortedErrors) { + console.log(` [${count}x] ${error}`); + } + } + + const latencies = results.map((r) => r.latencyMs); + const sortedLatencies = [...latencies].sort((a, b) => a - b); + + const avg = latencies.length > 0 + ? latencies.reduce((a, b) => a + b, 0) / latencies.length + : 0; + + return { + totalRequests: numRequests, + successfulRequests: successful.length, + failedRequests: failed.length, + totalTimeSeconds: totalTime, + requestsPerSecond: totalTime > 0 ? numRequests / totalTime : 0, + avgLatencyMs: avg, + minLatencyMs: latencies.length > 0 ? Math.min(...latencies) : 0, + maxLatencyMs: latencies.length > 0 ? Math.max(...latencies) : 0, + p50LatencyMs: percentile(sortedLatencies, 50), + p95LatencyMs: percentile(sortedLatencies, 95), + p99LatencyMs: percentile(sortedLatencies, 99), + errorRatePercent: + numRequests > 0 ? (failed.length / numRequests) * 100 : 0, + }; +} + +function printSummary(summary: TestSummary): void { + console.log("\n" + "=".repeat(60)); + console.log("TEST RESULTS SUMMARY"); + console.log("=".repeat(60)); + console.log(` Total Requests: ${summary.totalRequests}`); + console.log(` Successful: ${summary.successfulRequests}`); + console.log(` Failed: ${summary.failedRequests}`); + console.log(` Error Rate: ${summary.errorRatePercent.toFixed(2)}%`); + console.log("=".repeat(60)); + console.log("PERFORMANCE METRICS"); + console.log("=".repeat(60)); + console.log(` Total Time: ${summary.totalTimeSeconds.toFixed(2)}s`); + console.log( + ` Throughput: ${summary.requestsPerSecond.toFixed(2)} req/s` + ); + console.log("=".repeat(60)); + console.log("LATENCY (ms)"); + console.log("=".repeat(60)); + console.log(` Min: ${summary.minLatencyMs.toFixed(2)}`); + console.log(` Avg: ${summary.avgLatencyMs.toFixed(2)}`); + console.log(` Max: ${summary.maxLatencyMs.toFixed(2)}`); + console.log(` P50 (Median): ${summary.p50LatencyMs.toFixed(2)}`); + console.log(` P95: ${summary.p95LatencyMs.toFixed(2)}`); + console.log(` P99: ${summary.p99LatencyMs.toFixed(2)}`); + console.log("=".repeat(60) + "\n"); +} + +async function checkHealth(): Promise { + try { + const response = await fetch(`${RAG_BASE_URL}/health`, { + signal: AbortSignal.timeout(5000), + }); + if (response.ok) { + const data = await response.json(); + console.log(`RAG service is healthy:`, data); + return true; + } else { + console.log(`RAG service returned status ${response.status}`); + return false; + } + } catch (e) { + console.log(`Failed to connect to RAG service: ${e}`); + return false; + } +} + +async function main(): Promise { + console.log("\n" + "=".repeat(60)); + console.log("RAG CONCURRENT READ TEST"); + console.log("=".repeat(60)); + + if (!(await checkHealth())) { + console.log("ERROR: RAG service is not available. Exiting."); + process.exit(1); + } + + const datasets = [DEFAULT_DATASET]; + + const testConfigs = [ + { numRequests: 10, concurrency: 5 }, + { numRequests: 50, concurrency: 10 }, + { numRequests: 100, concurrency: 20 }, + ]; + + const allSummaries: Array<{ config: typeof testConfigs[0]; summary: TestSummary }> = []; + + for (const config of testConfigs) { + const summary = await runConcurrentTest( + config.numRequests, + config.concurrency, + datasets + ); + printSummary(summary); + allSummaries.push({ config, summary }); + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + console.log("\n" + "=".repeat(60)); + console.log("FINAL COMPARISON"); + console.log("=".repeat(60)); + console.log( + `${"Concurrency".padEnd(12)} ${"Requests".padEnd(10)} ${"RPS".padEnd( + 10 + )} ${"Avg(ms)".padEnd(10)} ${"P95(ms)".padEnd(10)} ${"Errors".padEnd(10)}` + ); + console.log("-".repeat(62)); + for (const { config, summary } of allSummaries) { + console.log( + `${String(config.concurrency).padEnd(12)} ` + + `${String(config.numRequests).padEnd(10)} ` + + `${summary.requestsPerSecond.toFixed(2).padEnd(10)} ` + + `${summary.avgLatencyMs.toFixed(2).padEnd(10)} ` + + `${summary.p95LatencyMs.toFixed(2).padEnd(10)} ` + + `${String(summary.failedRequests).padEnd(10)}` + ); + } + console.log("=".repeat(60) + "\n"); +} + +main().catch(console.error); From 94339ac06849053316381fb83ad483fa96d387f2 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 20:42:21 +0800 Subject: [PATCH 02/47] chore: optimize Docker build and add Linux native deps - Use --omit=dev instead of --legacy-peer-deps for cleaner production builds - Add optional dependencies for Linux native binaries (tailwindcss oxide, parcel watcher, swc) - Sort dependencies alphabetically in platform package.json Co-Authored-By: Claude Opus 4.5 --- package-lock.json | 385 +++++++++++++++++++++++++++------ package.json | 3 + services/platform/Dockerfile | 9 +- services/platform/package.json | 28 ++- 4 files changed, 343 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index df611ae24..b96389743 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,12 @@ "services/proxy", "services/search" ], + "dependencies": { + "@tailwindcss/oxide-linux-x64-gnu": "*" + }, "devDependencies": { "@eslint/eslintrc": "3.3.3", - "@types/node": "24.10.1", + "@types/node": "24.10.8", "@vitest/coverage-v8": "4.0.17", "eslint": "9.39.2", "eslint-plugin-unicorn": "62.0.0", @@ -26,6 +29,9 @@ "turbo": "2.7.4", "typescript": "5.9.3", "vitest": "4.0.17" + }, + "optionalDependencies": { + "@tailwindcss/oxide-linux-x64-gnu": "^4.1.18" } }, "node_modules/@acemir/cssom": { @@ -1346,25 +1352,81 @@ } }, "node_modules/@better-auth/core": { - "version": "1.3.27", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.4.9.tgz", + "integrity": "sha512-JT2q4NDkQzN22KclUEoZ7qU6tl9HUTfK1ctg2oWlT87SEagkwJcnrUwS9VznL+u9ziOIfY27P0f7/jSnmvLcoQ==", "dependencies": { - "better-call": "1.0.19", - "zod": "^4.1.5" + "@standard-schema/spec": "^1.0.0", + "zod": "^4.1.12" + }, + "peerDependencies": { + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.21", + "better-call": "1.1.7", + "jose": "^6.1.0", + "kysely": "^0.28.5", + "nanostores": "^1.0.1" } }, "node_modules/@better-auth/core/node_modules/zod": { "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@better-auth/passkey": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@better-auth/passkey/-/passkey-1.4.9.tgz", + "integrity": "sha512-fPsV0LYbmPytxrTaltM2RXbJnmSttX9UWr4wkZtJYgCBGeFqN8+8ZzBTZXOymWDJTVQ0kVZrD7c7/HyxXEG1zA==", + "license": "MIT", + "dependencies": { + "@simplewebauthn/browser": "^13.1.2", + "@simplewebauthn/server": "^13.1.2", + "zod": "^4.1.12" + }, + "peerDependencies": { + "@better-auth/core": "1.4.9", + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.21", + "better-auth": "1.4.9", + "better-call": "1.1.7", + "nanostores": "^1.0.1" + } + }, + "node_modules/@better-auth/passkey/node_modules/zod": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/@better-auth/telemetry": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.4.9.tgz", + "integrity": "sha512-Tthy1/Gmx+pYlbvRQPBTKfVei8+pJwvH1NZp+5SbhwA6K2EXIaoonx/K6N/AXYs2aKUpyR4/gzqDesDjL7zd6A==", + "dependencies": { + "@better-auth/utils": "0.3.0", + "@better-fetch/fetch": "1.1.21" + }, + "peerDependencies": { + "@better-auth/core": "1.4.9" + } + }, "node_modules/@better-auth/utils": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@better-auth/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==", "license": "MIT" }, "node_modules/@better-fetch/fetch": { - "version": "1.1.18" + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@better-fetch/fetch/-/fetch-1.1.21.tgz", + "integrity": "sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==" }, "node_modules/@codemirror/autocomplete": { "version": "6.20.0", @@ -1741,24 +1803,37 @@ } }, "node_modules/@convex-dev/better-auth": { - "version": "0.9.7", + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/@convex-dev/better-auth/-/better-auth-0.10.10.tgz", + "integrity": "sha512-BpwQ2kph43O7hmtGQAJ+ie3KrjONp83659QDjKDdH+X8yIdGevgehaqS5GHB0iJo7zQTtvs687GnAeLZ4Xx3/w==", "license": "Apache-2.0", "dependencies": { + "@better-auth/passkey": "1.4.9", + "@better-fetch/fetch": "^1.1.18", "common-tags": "^1.8.2", "convex-helpers": "^0.1.95", "jose": "^6.1.0", "remeda": "^2.32.0", "semver": "^7.7.3", "type-fest": "^4.39.1", - "zod": "^3.24.4" + "zod": "^4.0.0" }, "peerDependencies": { - "better-auth": "1.3.27", - "convex": ">=1.28.2 <1.35.0", + "better-auth": "1.4.9", + "convex": "^1.25.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, + "node_modules/@convex-dev/better-auth/node_modules/zod": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@convex-dev/eslint-plugin": { "version": "1.0.0", "dev": true, @@ -2670,6 +2745,8 @@ }, "node_modules/@hexagon/base64": { "version": "1.1.28", + "resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-1.1.28.tgz", + "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==", "license": "MIT" }, "node_modules/@hookform/resolvers": { @@ -2861,6 +2938,8 @@ }, "node_modules/@levischuck/tiny-cbor": { "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz", + "integrity": "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==", "license": "MIT" }, "node_modules/@lezer/common": { @@ -3703,8 +3782,30 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.4.tgz", + "integrity": "sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@peculiar/asn1-android": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-android/-/asn1-android-2.6.0.tgz", + "integrity": "sha512-cBRCKtYPF7vJGN76/yG8VbxRcHLPF3HnkoHhKOZeHpoVtbMYfY9ROKtH3DtYUY9m8uI1Mh47PRhHf2hSK3xcSQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3714,6 +3815,8 @@ }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", + "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3725,6 +3828,8 @@ }, "node_modules/@peculiar/asn1-csr": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", + "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3735,6 +3840,8 @@ }, "node_modules/@peculiar/asn1-ecc": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", + "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3745,6 +3852,8 @@ }, "node_modules/@peculiar/asn1-pfx": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", + "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -3757,6 +3866,8 @@ }, "node_modules/@peculiar/asn1-pkcs8": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", + "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3767,6 +3878,8 @@ }, "node_modules/@peculiar/asn1-pkcs9": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", + "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -3781,6 +3894,8 @@ }, "node_modules/@peculiar/asn1-rsa": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", + "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3791,6 +3906,8 @@ }, "node_modules/@peculiar/asn1-schema": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", "license": "MIT", "dependencies": { "asn1js": "^3.0.6", @@ -3800,6 +3917,8 @@ }, "node_modules/@peculiar/asn1-x509": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", + "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3810,6 +3929,8 @@ }, "node_modules/@peculiar/asn1-x509-attr": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", + "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -3820,6 +3941,8 @@ }, "node_modules/@peculiar/x509": { "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -6170,10 +6293,14 @@ }, "node_modules/@simplewebauthn/browser": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.2.2.tgz", + "integrity": "sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==", "license": "MIT" }, "node_modules/@simplewebauthn/server": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.2.2.tgz", + "integrity": "sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==", "license": "MIT", "dependencies": { "@hexagon/base64": "^1.1.27", @@ -8010,6 +8137,22 @@ "node": ">=10" } }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.8.tgz", + "integrity": "sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "license": "Apache-2.0" @@ -8076,6 +8219,22 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@tailwindcss/postcss": { "version": "4.1.18", "license": "MIT", @@ -8116,7 +8275,9 @@ "link": true }, "node_modules/@tanstack/query-core": { - "version": "5.90.16", + "version": "5.90.17", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.17.tgz", + "integrity": "sha512-hDww+RyyYhjhUfoYQ4es6pbgxY7LNiPWxt4l1nJqhByjndxJ7HIjDxTBtfvMr5HwjYavMrd+ids5g4Rfev3lVQ==", "license": "MIT", "funding": { "type": "github", @@ -8132,10 +8293,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.90.16", + "version": "5.90.17", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.17.tgz", + "integrity": "sha512-PGc2u9KLwohDUSchjW9MZqeDQJfJDON7y4W7REdNBgiFKxQy+Pf7eGjiFWEj5xPqKzAeHYdAb62IWI1a9UJyGQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.90.16" + "@tanstack/query-core": "5.90.17" }, "funding": { "type": "github", @@ -8352,7 +8515,7 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/deep-eql": "*", @@ -8412,7 +8575,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/doctrine": { @@ -8518,7 +8681,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", + "version": "24.10.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.8.tgz", + "integrity": "sha512-r0bBaXu5Swb05doFYO2kTWHMovJnNVbCsII0fhesM8bNRlLhXIuckley4a2DaD+vOdmm5G+zGkQZAPZsF80+YQ==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -8545,7 +8710,6 @@ }, "node_modules/@types/react": { "version": "19.2.8", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -8564,7 +8728,7 @@ }, "node_modules/@types/react-dom": { "version": "19.2.3", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -8594,6 +8758,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha512-t11pzegWB32MpVjCMXD0LoSxsUQESC7CInDtVoEmnPbLWA5hMRSLBa0U/xCOdj6zFQyHlLn0Qmp76kyp/KyfQw==", + "deprecated": "This is a stub types definition for striptags (https://github.com/ericnorris/striptags). striptags provides its own type definitions, so you don't need @types/striptags installed!", + "dev": true, + "license": "MIT", + "dependencies": { + "striptags": "*" + } + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "license": "MIT", @@ -9352,7 +9527,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -9370,7 +9545,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vitest/spy": "4.0.17", @@ -9397,7 +9572,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "tinyrainbow": "^3.0.3" @@ -9410,7 +9585,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vitest/utils": "4.0.17", @@ -9424,7 +9599,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.0.17", @@ -9439,7 +9614,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" @@ -9449,7 +9624,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.0.17", @@ -9883,6 +10058,8 @@ }, "node_modules/asn1js": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", @@ -9897,7 +10074,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -10052,33 +10229,81 @@ } }, "node_modules/better-auth": { - "version": "1.3.27", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.4.9.tgz", + "integrity": "sha512-usSdjuyTzZwIvM8fjF8YGhPncxV3MAg3dHUO9uPUnf0yklXUSYISiH1+imk6/Z+UBqsscyyPRnbIyjyK97p7YA==", "license": "MIT", "dependencies": { - "@better-auth/core": "1.3.27", + "@better-auth/core": "1.4.9", + "@better-auth/telemetry": "1.4.9", "@better-auth/utils": "0.3.0", - "@better-fetch/fetch": "1.1.18", + "@better-fetch/fetch": "1.1.21", "@noble/ciphers": "^2.0.0", "@noble/hashes": "^2.0.0", - "@simplewebauthn/browser": "^13.1.2", - "@simplewebauthn/server": "^13.1.2", - "better-call": "1.0.19", + "better-call": "1.1.7", "defu": "^6.1.4", "jose": "^6.1.0", "kysely": "^0.28.5", "nanostores": "^1.0.1", - "zod": "^4.1.5" + "zod": "^4.1.12" + }, + "peerDependencies": { + "@lynx-js/react": "*", + "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", + "@sveltejs/kit": "^2.0.0", + "@tanstack/react-start": "^1.0.0", + "better-sqlite3": "^12.0.0", + "drizzle-kit": ">=0.31.4", + "drizzle-orm": ">=0.41.0", + "mongodb": "^6.0.0 || ^7.0.0", + "mysql2": "^3.0.0", + "next": "^14.0.0 || ^15.0.0 || ^16.0.0", + "pg": "^8.0.0", + "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0", + "solid-js": "^1.0.0", + "svelte": "^4.0.0 || ^5.0.0", + "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", + "vue": "^3.0.0" }, "peerDependenciesMeta": { "@lynx-js/react": { "optional": true }, + "@prisma/client": { + "optional": true + }, "@sveltejs/kit": { "optional": true }, + "@tanstack/react-start": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "drizzle-kit": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mysql2": { + "optional": true + }, "next": { "optional": true }, + "pg": { + "optional": true + }, + "prisma": { + "optional": true + }, "react": { "optional": true }, @@ -10091,6 +10316,9 @@ "svelte": { "optional": true }, + "vitest": { + "optional": true + }, "vue": { "optional": true } @@ -10104,13 +10332,23 @@ } }, "node_modules/better-call": { - "version": "1.0.19", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/better-call/-/better-call-1.1.7.tgz", + "integrity": "sha512-6gaJe1bBIEgVebQu/7q9saahVzvBsGaByEnE8aDVncZEDiJO7sdNB28ot9I6iXSbR25egGmmZ6aIURXyQHRraQ==", + "license": "MIT", "dependencies": { "@better-auth/utils": "^0.3.0", "@better-fetch/fetch": "^1.1.4", - "rou3": "^0.5.1", - "set-cookie-parser": "^2.7.1", - "uncrypto": "^0.1.3" + "rou3": "^0.7.10", + "set-cookie-parser": "^2.7.1" + }, + "peerDependencies": { + "zod": "^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, "node_modules/better-opn": { @@ -10452,7 +10690,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -11913,7 +12151,7 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/es-object-atoms": { @@ -12459,7 +12697,7 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -12496,7 +12734,7 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=12.0.0" @@ -12574,7 +12812,7 @@ }, "node_modules/fdir": { "version": "6.5.0", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -16225,7 +16463,7 @@ }, "node_modules/obug": { "version": "2.1.1", - "dev": true, + "devOptional": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -16461,7 +16699,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pathval": { @@ -16980,6 +17218,8 @@ }, "node_modules/pvtsutils": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "license": "MIT", "dependencies": { "tslib": "^2.8.1" @@ -16987,6 +17227,8 @@ }, "node_modules/pvutils": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -17176,7 +17418,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.71.0", + "version": "7.71.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", + "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -17386,6 +17630,8 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { @@ -17622,7 +17868,7 @@ }, "node_modules/rollup": { "version": "4.55.1", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -17668,7 +17914,9 @@ "license": "MIT" }, "node_modules/rou3": { - "version": "0.5.1", + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.7.12.tgz", + "integrity": "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==", "license": "MIT" }, "node_modules/run-applescript": { @@ -17827,6 +18075,8 @@ }, "node_modules/set-cookie-parser": { "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/set-function-length": { @@ -18008,7 +18258,7 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/signal-exit": { @@ -18131,12 +18381,12 @@ }, "node_modules/stackback": { "version": "0.0.2", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/std-env": { "version": "3.10.0", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/stop-iteration-iterator": { @@ -18587,12 +18837,12 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "1.0.2", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -18600,7 +18850,7 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -18615,7 +18865,7 @@ }, "node_modules/tinyrainbow": { "version": "3.0.3", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -18795,6 +19045,8 @@ }, "node_modules/tsyringe": { "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", "dependencies": { "tslib": "^1.9.3" @@ -18805,6 +19057,8 @@ }, "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/turbo": { @@ -19208,10 +19462,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uncrypto": { - "version": "0.1.3", - "license": "MIT" - }, "node_modules/underscore": { "version": "1.13.7", "license": "MIT" @@ -19553,7 +19803,7 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", @@ -19664,7 +19914,7 @@ "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -19706,7 +19956,7 @@ "version": "4.0.17", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@vitest/expect": "4.0.17", @@ -20071,7 +20321,7 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "siginfo": "^2.0.0", @@ -20362,7 +20612,7 @@ "@ai-sdk/provider-utils": "3.0.20", "@convex-dev/action-cache": "0.3.0", "@convex-dev/agent": "^0.3.2", - "@convex-dev/better-auth": "0.9.7", + "@convex-dev/better-auth": "0.10.10", "@convex-dev/persistent-text-streaming": "0.3.0", "@convex-dev/rate-limiter": "0.3.2", "@convex-dev/workflow": "0.3.2", @@ -20389,13 +20639,13 @@ "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-visually-hidden": "1.2.4", "@tailwindcss/postcss": "4.1.18", - "@tanstack/react-query": "5.90.16", + "@tanstack/react-query": "5.90.17", "@tanstack/react-query-devtools": "5.91.2", "@tanstack/react-table": "8.21.3", "@xyflow/react": "12.10.0", "ai": "5.0.121", "base64-arraybuffer": "1.0.2", - "better-auth": "1.3.27", + "better-auth": "1.4.9", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "convex": "1.29.3", @@ -20428,7 +20678,7 @@ "react-day-picker": "9.13.0", "react-dom": "19.2.3", "react-file-icon": "1.6.0", - "react-hook-form": "7.71.0", + "react-hook-form": "7.71.1", "react-markdown": "10.1.0", "rehype-raw": "7.0.0", "remark-gfm": "4.0.1", @@ -20471,6 +20721,7 @@ "@types/react-datepicker": "7.0.0", "@types/react-dom": "19.2.3", "@types/react-file-icon": "1.0.4", + "@types/striptags": "3.1.1", "@vitejs/plugin-react": "5.1.2", "convex-test": "0.0.40", "encoding": "0.1.13", @@ -20482,6 +20733,10 @@ "vite-tsconfig-paths": "6.0.4", "vitest-axe": "1.0.0-pre.5", "wait-on": "9.0.3" + }, + "optionalDependencies": { + "@parcel/watcher-linux-x64-glibc": "^2.5.4", + "@swc/core-linux-x64-gnu": "^1.15.8" } }, "services/platform/node_modules/date-fns": { diff --git a/package.json b/package.json index 9368f0431..6ccfa74af 100644 --- a/package.json +++ b/package.json @@ -37,5 +37,8 @@ "turbo": "2.7.4", "typescript": "5.9.3", "vitest": "4.0.17" + }, + "optionalDependencies": { + "@tailwindcss/oxide-linux-x64-gnu": "^4.1.18" } } diff --git a/services/platform/Dockerfile b/services/platform/Dockerfile index 7e565f3ad..f691e821c 100644 --- a/services/platform/Dockerfile +++ b/services/platform/Dockerfile @@ -28,8 +28,8 @@ WORKDIR /app COPY package.json package-lock.json ./ COPY services/platform/package.json ./services/platform/package.json -# Install only the platform workspace dependencies -RUN npm ci --legacy-peer-deps --fetch-timeout=600000 --fetch-retries=10 -w @tale/platform +# Install only the platform workspace dependencies (production only, skip devDependencies like Storybook) +RUN npm ci --omit=dev --fetch-timeout=600000 --fetch-retries=10 -w @tale/platform # ============================================================================ # Stage 2: Builder @@ -57,7 +57,6 @@ ENV NODE_ENV=production # Native binaries needed for Linux: @next/swc, @swc/core, @parcel/watcher, lightningcss, @tailwindcss/oxide # These are platform-specific and must be installed for Linux since package-lock.json was generated on macOS # Remove ALL platform-specific binaries first (macOS, Windows, wrong Linux arch), then install correct Linux variant -# Use --legacy-peer-deps to match the deps stage installation RUN rm -rf ./node_modules/@next/swc-* 2>/dev/null || true && \ rm -rf ./node_modules/@swc/core-* 2>/dev/null || true && \ rm -rf ./node_modules/lightningcss-* 2>/dev/null || true && \ @@ -65,14 +64,14 @@ RUN rm -rf ./node_modules/@next/swc-* 2>/dev/null || true && \ rm -rf ./node_modules/@tailwindcss/oxide-* 2>/dev/null || true && \ ARCH=$(uname -m) && \ if [ "$ARCH" = "x86_64" ]; then \ - npm install --no-save --legacy-peer-deps typescript \ + npm install --no-save typescript \ @parcel/watcher-linux-x64-glibc \ lightningcss-linux-x64-gnu \ @tailwindcss/oxide-linux-x64-gnu \ @swc/core-linux-x64-gnu \ next@16.1.1; \ elif [ "$ARCH" = "aarch64" ]; then \ - npm install --no-save --legacy-peer-deps typescript \ + npm install --no-save typescript \ @parcel/watcher-linux-arm64-glibc \ lightningcss-linux-arm64-gnu \ @tailwindcss/oxide-linux-arm64-gnu \ diff --git a/services/platform/package.json b/services/platform/package.json index 600d33b4c..3a6786142 100644 --- a/services/platform/package.json +++ b/services/platform/package.json @@ -24,7 +24,6 @@ "storybook:build": "storybook build -o storybook-static" }, "dependencies": { - "ai": "5.0.121", "@ai-sdk/openai": "2.0.89", "@ai-sdk/provider-utils": "3.0.20", "@convex-dev/action-cache": "0.3.0", @@ -37,7 +36,6 @@ "@dmitryrechkin/json-schema-to-zod": "1.0.1", "@hookform/resolvers": "5.2.2", "@microlink/react-json-view": "1.27.1", - "react-file-icon": "1.6.0", "@milkdown/crepe": "7.17.2", "@milkdown/react": "7.17.2", "@radix-ui/react-avatar": "1.1.11", @@ -61,6 +59,7 @@ "@tanstack/react-query-devtools": "5.91.2", "@tanstack/react-table": "8.21.3", "@xyflow/react": "12.10.0", + "ai": "5.0.121", "base64-arraybuffer": "1.0.2", "better-auth": "1.4.9", "class-variance-authority": "0.7.1", @@ -94,6 +93,7 @@ "react-datepicker": "9.1.0", "react-day-picker": "9.13.0", "react-dom": "19.2.3", + "react-file-icon": "1.6.0", "react-hook-form": "7.71.1", "react-markdown": "10.1.0", "rehype-raw": "7.0.0", @@ -102,29 +102,28 @@ "tailwind-merge": "3.4.0", "tailwindcss": "4.1.18", "tw-animate-css": "1.4.0", + "typescript": "5.9.3", "uuidv7": "1.1.0", - "xlsx": "0.18.5", - "typescript": "5.9.3" + "xlsx": "0.18.5" }, "devDependencies": { + "@convex-dev/eslint-plugin": "1.0.0", + "@edge-runtime/vm": "5.0.0", + "@next/bundle-analyzer": "16.1.1", "@storybook/addon-a11y": "8.6.15", "@storybook/addon-essentials": "8.6.14", "@storybook/addon-interactions": "8.6.14", "@storybook/addon-links": "8.6.15", "@storybook/addon-themes": "8.6.15", "@storybook/blocks": "8.6.14", - "@storybook/react-vite": "8.6.15", "@storybook/react": "8.6.15", + "@storybook/react-vite": "8.6.15", "@storybook/test": "8.6.15", "@storybook/theming": "8.6.14", "@testing-library/dom": "10.4.1", "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.1", "@testing-library/user-event": "14.6.1", - "@vitejs/plugin-react": "5.1.2", - "@convex-dev/eslint-plugin": "1.0.0", - "@edge-runtime/vm": "5.0.0", - "@next/bundle-analyzer": "16.1.1", "@types/dagre": "0.7.53", "@types/he": "1.2.3", "@types/jexl": "2.3.4", @@ -136,21 +135,26 @@ "@types/pg": "8.16.0", "@types/react": "19.2.8", "@types/react-datepicker": "7.0.0", - "@types/react-file-icon": "1.0.4", "@types/react-dom": "19.2.3", + "@types/react-file-icon": "1.0.4", "@types/striptags": "3.1.1", + "@vitejs/plugin-react": "5.1.2", "convex-test": "0.0.40", "encoding": "0.1.13", "eslint-config-next": "16.1.1", - "pdfjs-dist": "5.4.530", - "tree-kill": "1.2.2", "jsdom": "27.4.0", + "pdfjs-dist": "5.4.530", "storybook": "8.6.15", + "tree-kill": "1.2.2", "vite-tsconfig-paths": "6.0.4", "vitest-axe": "1.0.0-pre.5", "wait-on": "9.0.3" }, "overrides": { "react-is": "19.2.3" + }, + "optionalDependencies": { + "@parcel/watcher-linux-x64-glibc": "^2.5.4", + "@swc/core-linux-x64-gnu": "^1.15.8" } } From 7023c65254741cb7b4433f6bd5a31d8e16525db4 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 20:56:57 +0800 Subject: [PATCH 03/47] fix(review): use correct ptw command for pytest-watch Co-Authored-By: Claude Opus 4.5 --- services/crawler/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/crawler/package.json b/services/crawler/package.json index b5a719f1a..54e34985a 100644 --- a/services/crawler/package.json +++ b/services/crawler/package.json @@ -9,7 +9,7 @@ "lint": "uv run ruff check app", "lint:fix": "uv run ruff check --fix app", "test": "uv run pytest", - "test:watch": "uv run pytest-watch", + "test:watch": "uv run ptw", "test:coverage": "uv run pytest --cov=app --cov-report=html" } } From f62007db84ece31c23fbd942e67e3745d915d233 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 20:59:02 +0800 Subject: [PATCH 04/47] fix(review): show toast when files exceed size limit during upload Users now receive feedback when selected files are rejected due to exceeding the maximum file size limit. Co-Authored-By: Claude Opus 4.5 --- .../components/document-upload-dialog.tsx | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx index 0dc18a0c8..ef9483abc 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx @@ -11,6 +11,7 @@ import { useT } from '@/lib/i18n/client'; import { api } from '@/convex/_generated/api'; import { useDocumentUpload, MAX_FILE_SIZE_BYTES } from '../hooks/use-document-upload'; import { cn } from '@/lib/utils/cn'; +import { toast } from '@/hooks/use-toast'; interface DocumentUploadDialogProps { open: boolean; @@ -77,15 +78,41 @@ export function DocumentUploadDialog({ const files = Array.from(event.target.files || []); if (files.length === 0) return; - // Filter out files that are too large - const validFiles = files.filter((file) => file.size <= MAX_FILE_SIZE_BYTES); + // Filter out files that are too large and notify user + const maxSizeMB = MAX_FILE_SIZE_BYTES / (1024 * 1024); + const validFiles: File[] = []; + const rejectedFiles: File[] = []; + + for (const file of files) { + if (file.size <= MAX_FILE_SIZE_BYTES) { + validFiles.push(file); + } else { + rejectedFiles.push(file); + } + } + + if (rejectedFiles.length > 0) { + for (const file of rejectedFiles) { + const currentSizeMB = (file.size / (1024 * 1024)).toFixed(1); + toast({ + title: tDocuments('upload.fileTooLarge'), + description: tDocuments('upload.fileSizeExceeded', { + name: file.name, + maxSize: maxSizeMB.toString(), + currentSize: currentSizeMB, + }), + variant: 'destructive', + }); + } + } + setSelectedFiles((prev) => [...prev, ...validFiles]); // Reset the input if (event.target) { event.target.value = ''; } - }, []); + }, [tDocuments]); const handleRemoveFile = useCallback((index: number) => { setSelectedFiles((prev) => prev.filter((_, i) => i !== index)); From f713637e3cf02fdbdbae176dd69101c71f35fa98 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:00:44 +0800 Subject: [PATCH 05/47] fix(review): add keyboard accessibility to upload area Added tabIndex, role="button", onKeyDown handler for Enter/Space, and visible focus ring for keyboard navigation. Co-Authored-By: Claude Opus 4.5 --- .../components/document-upload-dialog.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx index ef9483abc..450a6cfc6 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useCallback, useRef, type ChangeEvent } from 'react'; +import { useState, useCallback, useRef, type ChangeEvent, type KeyboardEvent } from 'react'; import { useQuery } from 'convex/react'; import { FormDialog } from '@/components/ui/dialog/form-dialog'; import { Checkbox } from '@/components/ui/forms/checkbox'; @@ -74,6 +74,13 @@ export function DocumentUploadDialog({ fileInputRef.current?.click(); }, []); + const handleKeyDown = useCallback((event: KeyboardEvent) => { + if ((event.key === 'Enter' || event.key === ' ') && !isUploading) { + event.preventDefault(); + handleFileSelect(); + } + }, [handleFileSelect, isUploading]); + const handleFileChange = useCallback((event: ChangeEvent) => { const files = Array.from(event.target.files || []); if (files.length === 0) return; @@ -151,12 +158,17 @@ export function DocumentUploadDialog({ {/* File selection area */}

{tCommon('upload.clickToUpload')}

From fc7579c8bf778171a5ee840fb317c0fe9ccf0fa2 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:02:09 +0800 Subject: [PATCH 06/47] fix(review): convert RetryButton from nested function to JSX variable Defining components inside render causes React to treat them as new component types on every render, leading to unmount/remount cycles. Co-Authored-By: Claude Opus 4.5 --- .../documents/components/rag-status-badge.tsx | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx index 837fd6b07..061383369 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx @@ -102,25 +102,23 @@ export function RagStatusBadge({ const config = statusConfig[effectiveStatus]; - function RetryButton() { - return ( - - ); - } + const retryButton = ( + + ); // Show clickable dialog with indexed date for completed status if (effectiveStatus === 'completed') { @@ -189,7 +187,7 @@ export function RagStatusBadge({
- + {retryButton} ); } @@ -201,7 +199,7 @@ export function RagStatusBadge({ {t('rag.status.stale')} - + {retryButton} ); } @@ -213,7 +211,7 @@ export function RagStatusBadge({ {getStatusLabel(effectiveStatus)} - + {retryButton} ); } From 3af25868757f9df5c61b2aa671ccb53b0725c4b5 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:03:50 +0800 Subject: [PATCH 07/47] fix(review): associate labels with checkbox inputs for a11y Use Checkbox component's built-in label prop with explicit IDs instead of wrapping labels to satisfy a11y lint rules. Co-Authored-By: Claude Opus 4.5 --- .../documents/components/document-team-tags-dialog.tsx | 7 ++++--- .../documents/components/document-upload-dialog.tsx | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx index 6032b3ff4..e18bf6eeb 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-team-tags-dialog.tsx @@ -137,16 +137,17 @@ export function DocumentTeamTagsDialog({ ) : ( {teams.map((team) => ( - +
))} )} diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx index 450a6cfc6..d5b136eb0 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-upload-dialog.tsx @@ -247,17 +247,18 @@ export function DocumentUploadDialog({ ) : ( {teams.map((team) => ( - + ))} )} From b50720dc548241aff9058a927ed8c253147dcf5d Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:06:16 +0800 Subject: [PATCH 08/47] fix(review): replace non-English example text with English MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced Chinese text "请用中文回答" with English "Please respond in French" to comply with the repo's English-only requirement for user-facing content. Co-Authored-By: Claude Opus 4.5 --- services/platform/convex/lib/create_chat_agent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/platform/convex/lib/create_chat_agent.ts b/services/platform/convex/lib/create_chat_agent.ts index 61a635b4d..d31d08f27 100644 --- a/services/platform/convex/lib/create_chat_agent.ts +++ b/services/platform/convex/lib/create_chat_agent.ts @@ -74,7 +74,7 @@ translate the relevant portions to the user's language while keeping proper nouns, technical terms, or names as-is when appropriate. Exception: Only use a different language if the user explicitly requests it -(e.g., "Reply in English" or "请用中文回答"). +(e.g., "Reply in English" or "Please respond in French"). ==================== CONVERSATION CONTEXT From 8da593841287d9bc8cd9ba4f017cb28af6619df4 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:07:30 +0800 Subject: [PATCH 09/47] fix(review): require userId when updating teamTags Throw an error if teamTags is provided but userId is missing, preventing validation bypass. Co-Authored-By: Claude Opus 4.5 --- services/platform/convex/model/documents/update_document.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/platform/convex/model/documents/update_document.ts b/services/platform/convex/model/documents/update_document.ts index 291630005..5f2502d0e 100644 --- a/services/platform/convex/model/documents/update_document.ts +++ b/services/platform/convex/model/documents/update_document.ts @@ -30,7 +30,10 @@ export async function updateDocument( } // Validate teamTags: user can only assign document to teams they belong to - if (args.teamTags !== undefined && args.userId) { + if (args.teamTags !== undefined) { + if (!args.userId) { + throw new Error('userId is required when updating teamTags'); + } const userTeamIds = await getUserTeamIds(ctx, args.userId); const userTeamSet = new Set(userTeamIds); for (const tag of args.teamTags) { From 1413f004bb4b82b69f979681382cd25253fcc5d3 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:08:55 +0800 Subject: [PATCH 10/47] fix(review): guard resolveTeams against undefined/null input Make teams parameter optional and add null check to prevent TypeError when callers omit the teams field. Co-Authored-By: Claude Opus 4.5 --- .../model/trusted_headers_authenticate/resolve_team_names.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts b/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts index e020c6e57..b992f6766 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/resolve_team_names.ts @@ -16,7 +16,7 @@ export interface TeamEntry { } export interface ResolveTeamsArgs { - teams: TeamEntry[]; + teams?: TeamEntry[] | null; } export interface ResolveTeamsResult { @@ -27,7 +27,7 @@ export interface ResolveTeamsResult { export function resolveTeams(args: ResolveTeamsArgs): ResolveTeamsResult { const { teams } = args; - if (teams.length === 0) { + if (!teams || teams.length === 0) { return { teams: [] }; } From a34e5d039114a0b7c2baadc72c33b35b43c54c76 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:10:54 +0800 Subject: [PATCH 11/47] fix(review): add authorization checks to team member operations Added authentication and team membership verification to addMember and removeMember mutations to prevent unauthorized access. Co-Authored-By: Claude Opus 4.5 --- services/platform/convex/team_members.ts | 43 ++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/services/platform/convex/team_members.ts b/services/platform/convex/team_members.ts index 36116d8cf..d547daa88 100644 --- a/services/platform/convex/team_members.ts +++ b/services/platform/convex/team_members.ts @@ -6,6 +6,7 @@ import { v } from 'convex/values'; import { query, mutation } from './_generated/server'; import { components } from './_generated/api'; +import { getAuthenticatedUser } from './lib/rls'; // Type for Better Auth teamMember record interface BetterAuthTeamMember { @@ -60,6 +61,27 @@ export const addMember = mutation({ userId: v.string(), }, handler: async (ctx, args) => { + // Authorization: verify caller is authenticated and is a member of the team + const authUser = await getAuthenticatedUser(ctx); + if (!authUser) { + throw new Error('Not authenticated'); + } + + // Check if caller is a member of this team + const callerMembership: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1 }, + where: [ + { field: 'teamId', operator: 'eq', value: args.teamId }, + { field: 'userId', operator: 'eq', value: authUser.userId }, + ], + }); + + if (callerMembership.page.length === 0) { + throw new Error('You must be a member of the team to add members'); + } + // Check if member already exists in this team const existing: BetterAuthFindManyResult = await ctx.runQuery(components.betterAuth.adapter.findMany, { @@ -100,6 +122,27 @@ export const removeMember = mutation({ userId: v.string(), }, handler: async (ctx, args) => { + // Authorization: verify caller is authenticated and is a member of the team + const authUser = await getAuthenticatedUser(ctx); + if (!authUser) { + throw new Error('Not authenticated'); + } + + // Check if caller is a member of this team + const callerMembership: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor: null, numItems: 1 }, + where: [ + { field: 'teamId', operator: 'eq', value: args.teamId }, + { field: 'userId', operator: 'eq', value: authUser.userId }, + ], + }); + + if (callerMembership.page.length === 0) { + throw new Error('You must be a member of the team to remove members'); + } + // Find the member record const existing: BetterAuthFindManyResult = await ctx.runQuery(components.betterAuth.adapter.findMany, { From 392756f33d68814081bb3c575ea92a19a6e0f625 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:12:17 +0800 Subject: [PATCH 12/47] fix(review): remove PII logging in trusted headers auth Removed console.log that was logging the full user payload (email/name/teams) to avoid privacy/compliance risks. Co-Authored-By: Claude Opus 4.5 --- services/platform/lib/auth/trusted-headers-token.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/platform/lib/auth/trusted-headers-token.ts b/services/platform/lib/auth/trusted-headers-token.ts index eb1a69dea..8299d4732 100644 --- a/services/platform/lib/auth/trusted-headers-token.ts +++ b/services/platform/lib/auth/trusted-headers-token.ts @@ -105,8 +105,6 @@ export async function authenticateViaTrustedHeaders( // Extract user info from headers const headerUser = extractTrustedHeaders(request); - console.log('Trusted headers user:', JSON.stringify(headerUser, null, 2)); - if (!headerUser) { return null; } From 808f7c0c6f7886fd1388729a95c370da06b0e54e Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:13:43 +0800 Subject: [PATCH 13/47] fix(review): fix Promise resolution detection in concurrent test The previous implementation using Promise.race with Promise.resolve("pending") always returned "pending" since the immediate resolution wins the race. Changed to track settled state directly via a wrapper object. Co-Authored-By: Claude Opus 4.5 --- services/rag/tests/concurrent_read_test.ts | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/services/rag/tests/concurrent_read_test.ts b/services/rag/tests/concurrent_read_test.ts index 5f9846759..7082a27a1 100644 --- a/services/rag/tests/concurrent_read_test.ts +++ b/services/rag/tests/concurrent_read_test.ts @@ -143,34 +143,36 @@ async function runConcurrentTest( } }; - const pending: Promise[] = []; + interface TrackedPromise { + promise: Promise; + settled: boolean; + } + const pending: TrackedPromise[] = []; let nextIndex = 0; while (nextIndex < numRequests || pending.length > 0) { while (inFlight < concurrency && nextIndex < numRequests) { const index = nextIndex++; inFlight++; - const promise = executeRequest(index).finally(() => { + const tracked: TrackedPromise = { + promise: null as unknown as Promise, + settled: false, + }; + tracked.promise = executeRequest(index).finally(() => { inFlight--; + tracked.settled = true; }); - pending.push(promise); + pending.push(tracked); } if (pending.length > 0) { - await Promise.race(pending); - const resolvedIndices: number[] = []; - for (let i = 0; i < pending.length; i++) { - const status = await Promise.race([ - pending[i].then(() => "resolved" as const), - Promise.resolve("pending" as const), - ]); - if (status === "resolved") { - resolvedIndices.push(i); + await Promise.race(pending.map((t) => t.promise)); + // Remove all settled promises + for (let i = pending.length - 1; i >= 0; i--) { + if (pending[i].settled) { + pending.splice(i, 1); } } - for (let i = resolvedIndices.length - 1; i >= 0; i--) { - pending.splice(resolvedIndices[i], 1); - } } } From d8ba2440e25bd6748522d040eec3e4ace7f05c39 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:18:53 +0800 Subject: [PATCH 14/47] fix(review): use getStatusLabel for consistent stale status label Use getStatusLabel(effectiveStatus) instead of direct t('rag.status.stale') call for consistency with other status branches in the component. Co-Authored-By: Claude Opus 4.5 --- .../[id]/(knowledge)/documents/components/rag-status-badge.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx index 061383369..3367c7bd4 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx @@ -197,7 +197,7 @@ export function RagStatusBadge({ return ( - {t('rag.status.stale')} + {getStatusLabel(effectiveStatus)} {retryButton} From 183b28c7361efc52edaeb8a04212ccf40412110a Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:20:00 +0800 Subject: [PATCH 15/47] fix(review): add window resize listener for minimap breakpoint ResizeObserver only fires on element size changes. Adding window resize listener ensures minimap width updates when crossing the 768px mobile breakpoint even if the container dimensions don't change. Co-Authored-By: Claude Opus 4.5 --- .../[id]/automations/components/automation-steps.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx b/services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx index 888ac9487..82eb576ab 100644 --- a/services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx +++ b/services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx @@ -168,9 +168,13 @@ function AutomationStepsInner({ const resizeObserver = new ResizeObserver(updateMinimapSize); resizeObserver.observe(container); + window.addEventListener('resize', updateMinimapSize); updateMinimapSize(); // Initial calculation - return () => resizeObserver.disconnect(); + return () => { + resizeObserver.disconnect(); + window.removeEventListener('resize', updateMinimapSize); + }; }, []); // Reposition the view when sidepanel opens/closes (maintain zoom, just recenter) From 8812b2577cc8a1ccde1979022e2509e1587ab448 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:21:15 +0800 Subject: [PATCH 16/47] fix(review): implement cursor-based pagination for team memberships The getUserTeamIds function only fetched the first 1000 results without checking isDone or using continueCursor. Now properly loops through all pages to fetch complete team membership data. Co-Authored-By: Claude Opus 4.5 --- .../platform/convex/lib/get_user_teams.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/services/platform/convex/lib/get_user_teams.ts b/services/platform/convex/lib/get_user_teams.ts index 6d79bf8db..af25ef763 100644 --- a/services/platform/convex/lib/get_user_teams.ts +++ b/services/platform/convex/lib/get_user_teams.ts @@ -69,15 +69,25 @@ export async function getUserTeamIds( } } - // Normal auth mode: query teamMember table - const memberships: BetterAuthFindManyResult = - await ctx.runQuery(components.betterAuth.adapter.findMany, { - model: 'teamMember', - paginationOpts: { cursor: null, numItems: 1000 }, - where: [{ field: 'userId', operator: 'eq', value: userId }], - }); + // Normal auth mode: query teamMember table with pagination + const allTeamIds: string[] = []; + let cursor: string | null = null; + let isDone = false; - return memberships.page.map((m) => m.teamId); + while (!isDone) { + const memberships: BetterAuthFindManyResult = + await ctx.runQuery(components.betterAuth.adapter.findMany, { + model: 'teamMember', + paginationOpts: { cursor, numItems: 1000 }, + where: [{ field: 'userId', operator: 'eq', value: userId }], + }); + + allTeamIds.push(...memberships.page.map((m) => m.teamId)); + isDone = memberships.isDone ?? true; + cursor = memberships.continueCursor ?? null; + } + + return allTeamIds; } /** From af3128c30beb29769b7fe27fcaa993bf421c347e Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:22:56 +0800 Subject: [PATCH 17/47] fix(review): add model validators to enforce tenant scoping Added @model_validator to DocumentAddRequest, QueryRequest, and GenerateRequest to ensure dataset_name/datasets fields require user_id. This prevents callers from writing to or reading from arbitrary datasets without proper user context. Co-Authored-By: Claude Opus 4.5 --- services/rag/app/models.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/services/rag/app/models.py b/services/rag/app/models.py index 687f142c4..15c8a2958 100644 --- a/services/rag/app/models.py +++ b/services/rag/app/models.py @@ -2,7 +2,7 @@ from enum import Enum from typing import Any, Dict, List, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, model_validator # ============================================================================ @@ -67,6 +67,13 @@ class DocumentAddRequest(BaseModel): "creates a user-scoped dataset. Format: 'tale_team_{teamId}' for team datasets.", ) + @model_validator(mode="after") + def validate_tenant_scope(self): + """Ensure dataset_name is only used with user_id for proper tenant scoping.""" + if self.dataset_name and not self.user_id: + raise ValueError("dataset_name requires user_id for tenant scoping") + return self + class DocumentAddResponse(BaseModel): """Response after adding a document. @@ -232,6 +239,13 @@ class QueryRequest(BaseModel): "datasets accessible by the user. Format: ['tale_team_{teamId}', ...]", ) + @model_validator(mode="after") + def validate_tenant_scope(self): + """Ensure datasets is only used with user_id for proper tenant scoping.""" + if self.datasets and not self.user_id: + raise ValueError("datasets requires user_id for tenant scoping") + return self + class SearchResult(BaseModel): """A single search result.""" @@ -291,6 +305,13 @@ class GenerateRequest(BaseModel): "Format: ['tale_team_{teamId}', ...]", ) + @model_validator(mode="after") + def validate_tenant_scope(self): + """Ensure datasets is only used with user_id for proper tenant scoping.""" + if self.datasets and not self.user_id: + raise ValueError("datasets requires user_id for tenant scoping") + return self + class GenerateResponse(BaseModel): """Response from RAG generation.""" From bb5dbd9e1ef726874323f0d6239b2945e190a601 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:24:03 +0800 Subject: [PATCH 18/47] fix(review): use type guard instead of non-null assertion for identityId Added type predicate to filter function so TypeScript properly narrows identityId to string, eliminating the need for non-null assertion. Co-Authored-By: Claude Opus 4.5 --- .../[id]/settings/teams/components/team-members-dialog.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx index 5fb8523c2..71af1ec84 100644 --- a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx @@ -54,7 +54,10 @@ export function TeamMembersDialog({ const availableMembers = useMemo(() => { if (!orgMembers || !teamMembers) return []; const teamMemberIds = new Set(teamMembers.map((m) => m.userId)); - return orgMembers.filter((m) => m.identityId && !teamMemberIds.has(m.identityId)); + return orgMembers.filter( + (m): m is typeof m & { identityId: string } => + !!m.identityId && !teamMemberIds.has(m.identityId) + ); }, [orgMembers, teamMembers]); // Get member details for display @@ -129,7 +132,7 @@ export function TeamMembersDialog({ options={ availableMembers.length > 0 ? availableMembers.map((m) => ({ - value: m.identityId!, + value: m.identityId, label: m.displayName || m.email || 'Unknown', })) : [] From 17a20741fa398230f13c46dda43873a748a2d217 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:24:54 +0800 Subject: [PATCH 19/47] fix(review): handle files without extension in getExtension Files like "README" (no extension) or ".gitignore" (leading dot) now correctly return empty string instead of treating the filename as the extension. Co-Authored-By: Claude Opus 4.5 --- .../ui/data-display/document-icon.tsx | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/services/platform/components/ui/data-display/document-icon.tsx b/services/platform/components/ui/data-display/document-icon.tsx index a9786674a..0910c81ed 100644 --- a/services/platform/components/ui/data-display/document-icon.tsx +++ b/services/platform/components/ui/data-display/document-icon.tsx @@ -7,13 +7,47 @@ import { cn } from '@/lib/utils/cn'; interface DocumentIconProps { fileName: string; className?: string; + isFolder?: boolean; } function getExtension(fileName: string) { - return fileName.split('.').pop()?.toLowerCase() || ''; + const dotIndex = fileName.lastIndexOf('.'); + return dotIndex > 0 ? fileName.slice(dotIndex + 1).toLowerCase() : ''; } -export function DocumentIcon({ fileName, className = '' }: DocumentIconProps) { +function OneDriveFolderIcon({ className }: { className?: string }) { + return ( + + + + + ); +} + +export function DocumentIcon({ + fileName, + className = '', + isFolder = false, +}: DocumentIconProps) { + if (isFolder) { + return ( +
+ +
+ ); + } + const ext = getExtension(fileName); const styles = defaultStyles[ext as DefaultExtensionType] || {}; From 3430dce62512d021417dc7c01f7fd9b85e4d1293 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:26:03 +0800 Subject: [PATCH 20/47] fix(review): add ref guard to prevent double-click duplicate reindex Added synchronous ref-based guard to handleReindex to prevent duplicate reindex jobs when rapidly clicking before React state updates. Co-Authored-By: Claude Opus 4.5 --- .../documents/components/document-row-actions.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx index 5c7922957..4d65fe784 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useMemo, useCallback, useState } from 'react'; +import { useMemo, useCallback, useState, useRef } from 'react'; import { RefreshCw, Trash2, Users } from 'lucide-react'; import { EntityRowActions, @@ -41,6 +41,7 @@ export function DocumentRowActions({ const dialogs = useEntityRowDialogs(['delete', 'deleteFolder', 'teamTags']); const [isDeleting, setIsDeleting] = useState(false); const [isReindexing, setIsReindexing] = useState(false); + const reindexingRef = useRef(false); const deleteDocument = useDeleteDocument(); // Determine if delete action should be visible @@ -94,6 +95,8 @@ export function DocumentRowActions({ }, [itemType, dialogs.open]); const handleReindex = useCallback(async () => { + if (reindexingRef.current) return; + reindexingRef.current = true; setIsReindexing(true); try { const result = await retryRagIndexing(documentId); @@ -115,6 +118,7 @@ export function DocumentRowActions({ variant: 'destructive', }); } finally { + reindexingRef.current = false; setIsReindexing(false); } }, [documentId, tDocuments]); From 9d1287862aae270f57c62699f11318106402e071 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:26:53 +0800 Subject: [PATCH 21/47] fix(review): add onSuccess callback to DocumentUploadDialog Added onSuccess callback to close the dialog after successful upload, matching the pattern used by OneDriveImportDialog. Co-Authored-By: Claude Opus 4.5 --- .../(knowledge)/documents/components/import-documents-menu.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx index 6efa29dd5..ea4ed521f 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/import-documents-menu.tsx @@ -108,6 +108,7 @@ export function ImportDocumentsMenu({ open={isUploadDialogOpen} onOpenChange={setIsUploadDialogOpen} organizationId={organizationId} + onSuccess={() => setIsUploadDialogOpen(false)} /> )} From 921590ed03d7443c06992cc6ffef1a50d662de27 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:27:31 +0800 Subject: [PATCH 22/47] fix(review): complete error message for deleteFileFailed Changed from fragment "An unexpected error occurred while deleting" to complete sentence "An unexpected error occurred while deleting the file." Co-Authored-By: Claude Opus 4.5 --- services/platform/messages/en.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/platform/messages/en.json b/services/platform/messages/en.json index 7718e297a..1efabb7dd 100644 --- a/services/platform/messages/en.json +++ b/services/platform/messages/en.json @@ -1444,7 +1444,7 @@ "deleteDocument": "Delete document", "deleteSyncFolder": "Delete sync folder", "deleteFolderFailed": "Failed to delete folder", - "deleteFileFailed": "An unexpected error occurred while deleting", + "deleteFileFailed": "An unexpected error occurred while deleting the file.", "manageTeams": "Manage teams", "reindex": "Reindex" }, @@ -1525,7 +1525,7 @@ "syncImport": "Sync import", "syncDescription": "Keep files automatically synchronized", "importCount": "Import ({count})", - "importItem": "{type, select, one-time {Import} other {Sync}} {count} {count, plural, one {Item} other {Items}}", + "importItem": "{type, select, oneTime {Import} other {Sync}} {count} {count, plural, one {Item} other {Items}}", "importing": "Importing...", "syncing": "Syncing...", "importStarted": "Import started", @@ -1542,8 +1542,8 @@ "syncCancelled": "Sync cancelled", "importCancelledDescription": "File import was cancelled", "syncCancelledDescription": "File synchronization was cancelled", - "cancelledByUser": "{type, select, one-time {Import} other {Sync}} cancelled by user", - "failedToStart": "Failed to start {type, select, one-time {import} other {sync}}", + "cancelledByUser": "{type, select, oneTime {Import} other {Sync}} cancelled by user", + "failedToStart": "Failed to start {type, select, oneTime {import} other {sync}}", "failedToParseSSE": "Failed to parse SSE data", "failedToProcessStream": "Failed to process stream" }, From 92253a3f5b16c43d1a4ec3f4e75dee464f62f60d Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:30:50 +0800 Subject: [PATCH 23/47] fix(review): add runtime validation for trusted auth data - Validate trustedTeamIds is actually a string array after JSON.parse - Validate trustedRole is one of the allowed role literals - Fall back to 'member' role if invalid role provided Co-Authored-By: Claude Opus 4.5 --- .../lib/rls/auth/get_trusted_auth_data.ts | 9 ++++--- .../organization/get_user_organizations.ts | 26 ++++++++++++++----- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts b/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts index d4007a1b8..cf60cbc21 100644 --- a/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts +++ b/services/platform/convex/lib/rls/auth/get_trusted_auth_data.ts @@ -38,13 +38,16 @@ export async function getTrustedAuthData( return null; } - // Parse trustedTeamIds from JSON string - const trustedTeamIdsRaw = (identity as any).trustedTeamIds; + // Parse trustedTeamIds from JSON string with runtime validation + const trustedTeamIdsRaw = (identity as { trustedTeamIds?: string }).trustedTeamIds; let trustedTeamIds: string[] = []; if (trustedTeamIdsRaw) { try { - trustedTeamIds = JSON.parse(trustedTeamIdsRaw); + const parsed = JSON.parse(trustedTeamIdsRaw); + if (Array.isArray(parsed) && parsed.every((id) => typeof id === 'string')) { + trustedTeamIds = parsed; + } } catch { trustedTeamIds = []; } diff --git a/services/platform/convex/lib/rls/organization/get_user_organizations.ts b/services/platform/convex/lib/rls/organization/get_user_organizations.ts index 9b47eff5f..dd75204e8 100644 --- a/services/platform/convex/lib/rls/organization/get_user_organizations.ts +++ b/services/platform/convex/lib/rls/organization/get_user_organizations.ts @@ -8,6 +8,13 @@ import { requireAuthenticatedUser } from '../auth/require_authenticated_user'; import { getTrustedAuthData } from '../auth/get_trusted_auth_data'; import { components } from '../../../_generated/api'; +const VALID_ROLES = ['disabled', 'member', 'editor', 'developer', 'admin'] as const; +type ValidRole = (typeof VALID_ROLES)[number]; + +function isValidRole(role: string): role is ValidRole { + return VALID_ROLES.includes(role as ValidRole); +} + /** * Get all organizations user has access to from Better Auth's member table. * @@ -49,11 +56,16 @@ export async function getUserOrganizations( return []; } - return result.page.map((member: any) => ({ - organizationId: member.organizationId, - // Use JWT trustedRole if available (trusted headers mode), - // otherwise fall back to member.role from database (normal auth mode) - role: trustedData?.trustedRole || (member.role || 'member').toLowerCase(), - member, - })); + return result.page.map((member: any) => { + // Get role from trusted headers if available, otherwise from database + const rawRole = trustedData?.trustedRole || (member.role || 'member'); + const normalizedRole = rawRole.toLowerCase(); + const role: ValidRole = isValidRole(normalizedRole) ? normalizedRole : 'member'; + + return { + organizationId: member.organizationId, + role, + member, + }; + }); } From 2f8c5eb245832a4df0afe98ccd7089ce852fda36 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:32:29 +0800 Subject: [PATCH 24/47] fix(review): improve dev-tools.sh script - Remove unused PROJECT_ROOT variable - Preserve internal spaces in dataset names (use sed trim instead of tr -d) - Use get_latest_kuzu_database() for fallback selection Co-Authored-By: Claude Opus 4.5 --- scripts/dev-tools.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/dev-tools.sh b/scripts/dev-tools.sh index 693adc99e..a333d105b 100755 --- a/scripts/dev-tools.sh +++ b/scripts/dev-tools.sh @@ -33,7 +33,6 @@ set -euo pipefail # ============================================================================ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" # Container names KUZU_CONTAINER="tale-kuzu-explorer" @@ -112,7 +111,7 @@ get_dataset_name() { return fi docker exec "${PG_CONTAINER}" psql -U "${PG_USER}" -d "${PG_DATABASE}" -t -A \ - -c "SELECT name FROM datasets WHERE id = '${dataset_id}';" 2>/dev/null | tr -d '[:space:]' + -c "SELECT name FROM datasets WHERE id = '${dataset_id}';" 2>/dev/null | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' } get_user_email() { @@ -122,7 +121,7 @@ get_user_email() { return fi docker exec "${PG_CONTAINER}" psql -U "${PG_USER}" -d "${PG_DATABASE}" -t -A \ - -c "SELECT email FROM users WHERE id = '${user_id}';" 2>/dev/null | tr -d '[:space:]' + -c "SELECT email FROM users WHERE id = '${user_id}';" 2>/dev/null | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' } find_kuzu_databases() { @@ -200,7 +199,9 @@ select_kuzu_database() { # Validate selection if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt "$count" ]; then log_error "Invalid selection. Using most recent database." >&2 - echo "${databases[0]}" + local latest + latest=$(get_latest_kuzu_database) + echo "${latest:-${databases[0]}}" return fi From b65606a1ee6a9ef2779f6433d273a8995600bcc8 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:33:50 +0800 Subject: [PATCH 25/47] fix(review): trim whitespace in Zod schema for team name validation Move trim() to the Zod schema so whitespace-only input is rejected before submission, rather than passing validation and becoming empty after trim() in the handler. Co-Authored-By: Claude Opus 4.5 --- .../[id]/settings/teams/components/team-edit-dialog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-edit-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-edit-dialog.tsx index 7a3852b72..0dd71bb4e 100644 --- a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-edit-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-edit-dialog.tsx @@ -35,7 +35,7 @@ export function TeamEditDialog({ const schema = useMemo( () => z.object({ - name: z.string().min(1, tSettings('teams.teamNameRequired')), + name: z.string().trim().min(1, tSettings('teams.teamNameRequired')), }), [tSettings], ); @@ -61,7 +61,7 @@ export function TeamEditDialog({ try { const result = await authClient.organization.updateTeam({ teamId: team.id, - data: { name: data.name.trim() }, + data: { name: data.name }, }); if (result.error) { From 2beabe4f4f7592c542ba9c02cfced43e52bd6fd2 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:41:30 +0800 Subject: [PATCH 26/47] fix(review): clarify docstring about parallel queries Update the docstring in get_user_names_batch.ts to accurately describe that the implementation uses parallel individual queries (not a single query) due to Better Auth adapter limitations. Co-Authored-By: Claude Opus 4.5 --- .../platform/convex/model/documents/get_user_names_batch.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/platform/convex/model/documents/get_user_names_batch.ts b/services/platform/convex/model/documents/get_user_names_batch.ts index b860ff84a..b49eff39c 100644 --- a/services/platform/convex/model/documents/get_user_names_batch.ts +++ b/services/platform/convex/model/documents/get_user_names_batch.ts @@ -1,8 +1,9 @@ /** * Batch fetch user names from Better Auth user table * - * This helper efficiently fetches multiple user names in a single query, + * This helper efficiently fetches multiple user names in parallel queries, * avoiding the N+1 query problem when displaying creator names in document lists. + * Note: Uses parallel individual lookups since Better Auth adapter doesn't support IN queries. */ import type { QueryCtx } from '../../_generated/server'; From 3d5ce1416001afa3e77bc5e82a1938667a51ed70 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:47:04 +0800 Subject: [PATCH 27/47] fix(review): make dialog mounting consistent for Radix UI animations Co-Authored-By: Claude Opus 4.5 --- .../components/document-row-actions.tsx | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx index 4d65fe784..507faabb6 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-row-actions.tsx @@ -165,27 +165,23 @@ export function DocumentRowActions({ <> - {dialogs.isOpen.delete && ( - - )} + {/* Always mount dialogs to allow Radix UI to handle animation states properly */} + - {dialogs.isOpen.deleteFolder && ( - - )} + - {/* Always mount team tags dialog to allow Radix UI to handle animation states properly */} Date: Fri, 16 Jan 2026 21:48:08 +0800 Subject: [PATCH 28/47] fix(review): conditionally render DocumentUploadDialog for proper lazy-loading Co-Authored-By: Claude Opus 4.5 --- .../documents/components/documents-action-menu.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx index 20a1da1e1..20a47df4a 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/documents-action-menu.tsx @@ -70,11 +70,13 @@ export function DocumentsActionMenu({ menuItems={menuItems} /> - + {isUploadDialogOpen && ( + + )} {isOneDriveDialogOpen && ( Date: Fri, 16 Jan 2026 21:49:18 +0800 Subject: [PATCH 29/47] fix(review): stabilize schema memoization with extracted translation Co-Authored-By: Claude Opus 4.5 --- .../[id]/settings/teams/components/team-create-dialog.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-create-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-create-dialog.tsx index 9dbf31df0..904982fd0 100644 --- a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-create-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-create-dialog.tsx @@ -31,12 +31,13 @@ export function TeamCreateDialog({ const { t: tCommon } = useT('common'); const { toast } = useToast(); + const nameRequiredError = tSettings('teams.teamNameRequired'); const schema = useMemo( () => z.object({ - name: z.string().min(1, tSettings('teams.teamNameRequired')), + name: z.string().min(1, nameRequiredError).transform(val => val.trim()), }), - [tSettings], + [nameRequiredError], ); const [isSubmitting, setIsSubmitting] = useState(false); @@ -54,7 +55,7 @@ export function TeamCreateDialog({ setIsSubmitting(true); try { const result = await authClient.organization.createTeam({ - name: data.name.trim(), + name: data.name, organizationId, }); From 4f1075d1bbbcbc02fd0a6e2973e7f10ae840b605 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:50:56 +0800 Subject: [PATCH 30/47] fix(review): add loading state to prevent double-submission in TeamDeleteDialog Co-Authored-By: Claude Opus 4.5 --- .../[id]/settings/teams/components/team-delete-dialog.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-delete-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-delete-dialog.tsx index 434debd8c..96e14fe6f 100644 --- a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-delete-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-delete-dialog.tsx @@ -1,5 +1,6 @@ 'use client'; +import { useState } from 'react'; import { DeleteDialog } from '@/components/ui/dialog/delete-dialog'; import { toast } from '@/hooks/use-toast'; import { authClient } from '@/lib/auth-client'; @@ -20,8 +21,11 @@ export function TeamDeleteDialog({ onSuccess, }: TeamDeleteDialogProps) { const { t: tSettings } = useT('settings'); + const [isDeleting, setIsDeleting] = useState(false); const handleConfirm = async () => { + if (isDeleting) return; + setIsDeleting(true); try { const result = await authClient.organization.removeTeam({ teamId: team.id, @@ -43,6 +47,8 @@ export function TeamDeleteDialog({ title: tSettings('teams.teamDeleteFailed'), variant: 'destructive', }); + } finally { + setIsDeleting(false); } }; @@ -53,6 +59,7 @@ export function TeamDeleteDialog({ title={tSettings('teams.deleteTeam')} description={tSettings('teams.deleteConfirmation')} deleteText={tSettings('teams.deleteTeam')} + isDeleting={isDeleting} onDelete={handleConfirm} /> ); From 8d87fd1f7b519c5329d72e0332512cee505fec6d Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 21:55:01 +0800 Subject: [PATCH 31/47] fix(review): skip orgMembers query when dialog closed and optimize member lookup Co-Authored-By: Claude Opus 4.5 --- .../teams/components/team-members-dialog.tsx | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx index 71af1ec84..9b990ddf8 100644 --- a/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/settings/teams/components/team-members-dialog.tsx @@ -32,11 +32,11 @@ export function TeamMembersDialog({ const [isAdding, setIsAdding] = useState(false); const [removingMemberId, setRemovingMemberId] = useState(null); - // Fetch organization members from Convex - const orgMembers = useQuery(api.member.listByOrganization, { - organizationId, - sortOrder: 'asc', - }); + // Fetch organization members from Convex (skip when dialog is closed) + const orgMembers = useQuery( + api.member.listByOrganization, + open ? { organizationId, sortOrder: 'asc' } : 'skip' + ); // Fetch team members directly from Convex const teamMembers = useQuery( @@ -60,10 +60,11 @@ export function TeamMembersDialog({ ); }, [orgMembers, teamMembers]); - // Get member details for display - const getMemberDetails = (userId: string) => { - return orgMembers?.find((m) => m.identityId === userId); - }; + // Create a lookup map for member details + const memberDetailsMap = useMemo(() => { + if (!orgMembers) return new Map[number]>(); + return new Map(orgMembers.map((m) => [m.identityId, m])); + }, [orgMembers]); const handleAddMember = async () => { if (!selectedMemberId) return; @@ -172,7 +173,7 @@ export function TeamMembersDialog({ ) : ( teamMembers.map((member) => { - const details = getMemberDetails(member.userId); + const details = memberDetailsMap.get(member.userId); const hasDistinctName = details?.displayName && details.displayName !== details.email; return ( Date: Fri, 16 Jan 2026 21:57:25 +0800 Subject: [PATCH 32/47] fix(review): add composite index for teamMember lookups (teamId, userId) Co-Authored-By: Claude Opus 4.5 --- services/platform/convex/betterAuth/schema.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/platform/convex/betterAuth/schema.ts b/services/platform/convex/betterAuth/schema.ts index 749cd456c..2e0b2029a 100644 --- a/services/platform/convex/betterAuth/schema.ts +++ b/services/platform/convex/betterAuth/schema.ts @@ -19,6 +19,11 @@ export const tables = { 'organizationId', 'userId', ]), + // Add composite index for efficient membership lookups (teamId, userId) + teamMember: generatedTables.teamMember.index('teamId_userId', [ + 'teamId', + 'userId', + ]), }; const schema = defineSchema(tables); From 52090d5101a122985a1f44db02926109fd9a2cf3 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:04:27 +0800 Subject: [PATCH 33/47] fix(review): handle string input in litellm aembedding patch The litellm.aembedding API accepts both string and list inputs per the OpenAI Embeddings API spec. The patch was incorrectly typed as list-only which would cause string inputs to be iterated character-by-character. Co-Authored-By: Claude Opus 4.5 --- services/rag/app/services/cognee/config.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/services/rag/app/services/cognee/config.py b/services/rag/app/services/cognee/config.py index d4cbcc67d..ecc426e47 100644 --- a/services/rag/app/services/cognee/config.py +++ b/services/rag/app/services/cognee/config.py @@ -228,10 +228,22 @@ def _patch_litellm_aembedding() -> None: async def _patched_aembedding( model: str, - input: list, + input: list | str, **kwargs: Any, ) -> Any: - # Filter out empty or whitespace-only strings from input + # Handle string input (OpenAI-compatible APIs accept str or list[str]) + if isinstance(input, str): + if not input.strip(): + logger.warning("aembedding: Empty string input, returning empty response") + from litellm import EmbeddingResponse + return EmbeddingResponse( + model=model, + data=[], + usage={"prompt_tokens": 0, "total_tokens": 0}, + ) + return await _original_aembedding(model=model, input=input, **kwargs) + + # Filter out empty or whitespace-only strings from list input original_input_len = len(input) if input else 0 if input: filtered_input = [ From 268cf01c3bd0685db4566e66bab5854a5e99d880 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:06:23 +0800 Subject: [PATCH 34/47] fix(review): remove dead code checking for user in add_kwargs The cognify_kwargs was checking for "user" in add_kwargs, but add_kwargs only contains dataset_name and node_set, so this condition was always false. Co-Authored-By: Claude Opus 4.5 --- services/rag/app/services/cognee/service.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/rag/app/services/cognee/service.py b/services/rag/app/services/cognee/service.py index b98daf7a4..feb09ec13 100644 --- a/services/rag/app/services/cognee/service.py +++ b/services/rag/app/services/cognee/service.py @@ -382,7 +382,7 @@ async def add_document( ): with attempt: try: - # Build cognify kwargs, including user context if available + # Build cognify kwargs cognify_kwargs: dict[str, Any] = { "datasets": [effective_dataset_name], "incremental_loading": True, @@ -390,8 +390,6 @@ async def add_document( # Smaller chunks improve retrieval precision for RAG "chunk_size": settings.chunk_size, } - if "user" in add_kwargs: - cognify_kwargs["user"] = add_kwargs["user"] # Add custom prompt for English identifier enforcement # This helps FalkorDB compatibility (Cypher parser requires ASCII) From d4b7fe55ddf1cbda07b0ce79715dc68622edd35c Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:06:30 +0800 Subject: [PATCH 35/47] fix(review): add await to FalkorDB is_empty query and validate DB URL - Add missing await to self.query() in _patched_is_empty - Validate DATABASE_URL components before exporting DB_* env vars Co-Authored-By: Claude Opus 4.5 --- services/rag/app/services/cognee/config.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/services/rag/app/services/cognee/config.py b/services/rag/app/services/cognee/config.py index ecc426e47..5a4a1350d 100644 --- a/services/rag/app/services/cognee/config.py +++ b/services/rag/app/services/cognee/config.py @@ -91,6 +91,21 @@ def _pre_configure_database_env() -> None: parsed = urlparse(database_url) + # Validate URL components to avoid exporting misleading defaults + if parsed.scheme not in ("postgresql", "postgres"): + logger.warning( + f"Invalid DATABASE_URL scheme '{parsed.scheme}' for pre-configuration; skipping DB_* export" + ) + return + if not parsed.hostname or not parsed.username or not parsed.password: + logger.warning( + "DATABASE_URL missing required components (hostname/username/password); skipping DB_* export" + ) + return + if not parsed.path or parsed.path == "/": + logger.warning("DATABASE_URL missing database name; skipping DB_* export") + return + # Set PostgreSQL configuration for Cognee # These must be set BEFORE cognee imports os.environ["DB_PROVIDER"] = "postgres" @@ -460,7 +475,7 @@ async def _patched_is_empty(self: Any) -> bool: Upstream: https://github.com/topoteretes/cognee-community/issues/60 """ query = "MATCH (n) RETURN true LIMIT 1;" - result = self.query(query) + result = await self.query(query) # Original bug: result_set[0][0] fails with IndexError when graph is empty # because an empty graph returns an empty result_set if not result.result_set: From c83de1c3970ee57dc2154ae42225459259f8c942 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:06:34 +0800 Subject: [PATCH 36/47] fix(review): update comment to reflect FalkorDB instead of Neo4j Co-Authored-By: Claude Opus 4.5 --- scripts/deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 2903db538..f5eb30f23 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -67,7 +67,7 @@ ALL_IMAGES="tale-platform tale-rag tale-crawler tale-db tale-graph-db tale-proxy # Services NOT included (shared between blue/green, single instance only): # - db: TimescaleDB - single instance required for data consistency # - proxy: Caddy - single entry point for traffic routing -# - graph-db: Neo4j - single instance required for data consistency +# - graph-db: FalkorDB - single instance required for data consistency # # The actual service names in compose files are suffixed with color: # e.g., platform-blue, platform-green, rag-blue, rag-green, etc. From 6705ceb9d64285d3ffd0126320a0810823d270f2 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:06:39 +0800 Subject: [PATCH 37/47] fix(review): add build-system section to pyproject.toml Required for PEP 517/518 compliant builds to ensure proper installation. Co-Authored-By: Claude Opus 4.5 --- services/rag/pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/rag/pyproject.toml b/services/rag/pyproject.toml index aea3b1ef6..43d2cc2a5 100644 --- a/services/rag/pyproject.toml +++ b/services/rag/pyproject.toml @@ -1,3 +1,7 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + [project] name = "tale-rag" version = "0.1.0" From f19bf068c9da33393ef6e67adfa39552fcec998b Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:22:35 +0800 Subject: [PATCH 38/47] fix(review): remove unused kuzu dependency from graph-db The graph-db service now uses FalkorDB (Redis-based) instead of Kuzu. The kuzu dependency was unused as there are no Python files in the service. Also added build-system section for pyproject.toml compliance. Co-Authored-By: Claude Opus 4.5 --- services/graph-db/pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/graph-db/pyproject.toml b/services/graph-db/pyproject.toml index a59866c93..c0ce21a96 100644 --- a/services/graph-db/pyproject.toml +++ b/services/graph-db/pyproject.toml @@ -1,3 +1,7 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + [project] name = "tale-graph-db" version = "0.1.0" @@ -5,7 +9,6 @@ requires-python = ">=3.11" dependencies = [ "fastapi==0.128.0", "uvicorn==0.40.0", - "kuzu==0.11.3", "pydantic==2.12.5", "pydantic-settings==2.12.0", "loguru==0.7.3", From eb829e625b4133bf4350a957c7e34541585289d0 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:24:23 +0800 Subject: [PATCH 39/47] fix(review): add explicit auth validation for createdBy tracking Added defensive auth check in createDocumentFromUpload to ensure documents are never created without createdBy tracking. This is consistent with deleteDocument which already has explicit auth validation. Co-Authored-By: Claude Opus 4.5 --- services/platform/convex/documents.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/platform/convex/documents.ts b/services/platform/convex/documents.ts index 841998994..8a9bb31ce 100644 --- a/services/platform/convex/documents.ts +++ b/services/platform/convex/documents.ts @@ -76,6 +76,7 @@ export const createDocument = internalMutation({ metadata: v.optional(v.any()), sourceProvider: v.optional(sourceProviderValidator), externalItemId: v.optional(v.string()), + teamTags: v.optional(v.array(v.string())), createdBy: v.optional(v.string()), }, returns: v.object({ @@ -765,6 +766,7 @@ export const uploadFile = action({ fileData: v.bytes(), contentType: v.string(), metadata: v.optional(v.any()), + teamTags: v.optional(v.array(v.string())), }, returns: uploadFileResponseValidator, handler: async ( @@ -870,6 +872,7 @@ export const uploadFile = action({ mimeType: args.contentType, metadata: documentMetadata, createdBy: identity.subject, + teamTags: args.teamTags, }); return { @@ -900,6 +903,7 @@ export const createOneDriveSyncConfig = mutationWithRLS({ itemPath: v.optional(v.string()), targetBucket: v.string(), storagePrefix: v.optional(v.string()), + teamTags: v.optional(v.array(v.string())), }, returns: createOneDriveSyncConfigResponseValidator, handler: async (ctx, args) => { @@ -935,7 +939,10 @@ export const createDocumentFromUpload = mutationWithRLS({ try { // Get current authenticated user for createdBy tracking const authUser = await getAuthenticatedUser(ctx); - const createdBy = authUser?.userId; + if (!authUser) { + return { success: false, error: 'Not authenticated' }; + } + const createdBy = authUser.userId; // Check if a document with the same name already exists const existingDocument = await DocumentsModel.findDocumentByTitle(ctx, { @@ -977,7 +984,7 @@ export const createDocumentFromUpload = mutationWithRLS({ externalItemId, metadata: documentMetadata, teamTags: args.teamTags, - userId: authUser?.userId, + userId: authUser.userId, }); return { From 601d7db7794cf4b335c437c8388586bd2ea65a68 Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:48:10 +0800 Subject: [PATCH 40/47] fix(review): use consistent nullish coalescing for trustedRole/trustedTeams Update the create path to use ?? (nullish coalescing) instead of || (logical OR) for trustedRole and trustedTeams fields. This ensures consistent behavior between create and update paths - both now use ?? which preserves empty strings instead of treating them as falsy. Co-Authored-By: Claude Opus 4.5 --- .../create_session_for_trusted_user.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts b/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts index 062d505b8..cb7f88459 100644 --- a/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts +++ b/services/platform/convex/model/trusted_headers_authenticate/create_session_for_trusted_user.ts @@ -175,8 +175,8 @@ export async function createSessionForTrustedUser( updatedAt: now, ipAddress: args.ipAddress || null, userAgent: args.userAgent || null, - trustedRole: args.trustedRole || null, - trustedTeams: args.trustedTeams || null, + trustedRole: args.trustedRole ?? null, + trustedTeams: args.trustedTeams ?? null, }, }, }); From afcef48dc338ea62409a77372b0ac63980e384de Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 22:48:59 +0800 Subject: [PATCH 41/47] fix(review): pin cognee-community-hybrid-adapter-falkor version Pin the dependency to version 0.2.0 for consistency with other pinned dependencies in pyproject.toml and to ensure reproducible builds. Co-Authored-By: Claude Opus 4.5 --- services/rag/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rag/pyproject.toml b/services/rag/pyproject.toml index 43d2cc2a5..f53b6fcf5 100644 --- a/services/rag/pyproject.toml +++ b/services/rag/pyproject.toml @@ -8,7 +8,7 @@ version = "0.1.0" requires-python = ">=3.11" dependencies = [ "cognee[baml]==0.5.1", - "cognee-community-hybrid-adapter-falkor", + "cognee-community-hybrid-adapter-falkor==0.2.0", "unstructured[xlsx,docx,pptx]==0.18.27", "PyMuPDF==1.26.7", "asyncpg==0.31.0", From 5ce56150ccd69c05346fcbc23bf1781ed7b02f8e Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Fri, 16 Jan 2026 23:31:02 +0800 Subject: [PATCH 42/47] feat(onedrive): add team tag support for imported documents - Add team selection UI to OneDrive import dialog settings stage - Pass teamTags to backend API and validate user membership - Propagate teamTags through sync config creation for recurring syncs - Fix Radix Dialog "Maximum update depth exceeded" by unmounting content during close animation - Exclude Storybook files from Docker builds - Define local PDF.js interfaces to avoid type import issues - Add quickXorHash and optional parentReference fields to OneDrive validators - Fix BetterAuth adapter query to use _id field - Optimize Graph API calls with $select to reduce payload size Co-Authored-By: Claude Opus 4.5 --- .dockerignore | 12 ++- services/platform/.dockerignore | 8 +- .../components/document-preview-pdf.tsx | 43 +++++++-- .../documents/components/document-table.tsx | 7 +- .../components/document-team-tags-dialog.tsx | 95 +++++++++++++------ .../components/onedrive-import-dialog.tsx | 92 ++++++++++++++++-- .../app/api/documents/onedrive/route.ts | 35 +++++-- .../platform/components/ui/dialog/dialog.tsx | 40 +++++--- .../components/ui/dialog/form-dialog.tsx | 37 +++++--- .../documents/create_onedrive_sync_config.ts | 3 + .../convex/model/onedrive/validators.ts | 3 + services/platform/convex/onedrive.ts | 26 ++++- services/platform/convex/schema.ts | 1 + services/platform/types/dagre.d.ts | 53 +++++++++++ services/platform/types/he.d.ts | 22 +++++ services/platform/types/react-file-icon.d.ts | 43 +++++++++ services/platform/types/striptags.d.ts | 19 ++++ 17 files changed, 449 insertions(+), 90 deletions(-) create mode 100644 services/platform/types/dagre.d.ts create mode 100644 services/platform/types/he.d.ts create mode 100644 services/platform/types/react-file-icon.d.ts create mode 100644 services/platform/types/striptags.d.ts diff --git a/.dockerignore b/.dockerignore index 2d2807d51..3cd813ca1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -82,4 +82,14 @@ coverage/ *.tmp *.temp .cache/ - +# ============================================================================ +# Storybook +# ============================================================================ +# Development-only UI component documentation +.storybook/ +services/platform/.storybook/ +**/*.stories.tsx +**/*.stories.ts +**/*.stories.jsx +**/*.stories.js +storybook-static/ diff --git a/services/platform/.dockerignore b/services/platform/.dockerignore index ab7e2253c..0ed6db35d 100644 --- a/services/platform/.dockerignore +++ b/services/platform/.dockerignore @@ -56,4 +56,10 @@ docs/ # Convex local .convex/ - +# Storybook +.storybook/ +**/*.stories.tsx +**/*.stories.ts +**/*.stories.jsx +**/*.stories.js +storybook-static/ diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-preview-pdf.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-preview-pdf.tsx index 10e236064..2fd6316eb 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-preview-pdf.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-preview-pdf.tsx @@ -2,18 +2,41 @@ import React, { useState, useEffect, useRef } from 'react'; import { ChevronUp, ChevronDown, ZoomIn, ZoomOut } from 'lucide-react'; -import type { - PDFDocumentProxy, - PDFPageProxy, - RenderTask, - PageViewport, -} from 'pdfjs-dist/types/src/pdf'; import { useT } from '@/lib/i18n/client'; -type PdfJsLib = { - getDocument: typeof import('pdfjs-dist/types/src/pdf').getDocument; - GlobalWorkerOptions: typeof import('pdfjs-dist/types/src/pdf').GlobalWorkerOptions; -}; +interface PageViewport { + width: number; + height: number; +} + +interface RenderTask { + promise: Promise; + cancel: () => void; +} + +interface PDFPageProxy { + getViewport: (options: { scale: number }) => PageViewport; + render: (options: { + canvas: HTMLCanvasElement | null; + canvasContext: CanvasRenderingContext2D; + viewport: PageViewport; + intent: string; + }) => RenderTask; +} + +interface PDFDocumentProxy { + numPages: number; + getPage: (pageNumber: number) => Promise; +} + +interface PDFDocumentLoadingTask { + promise: Promise; +} + +interface PdfJsLib { + getDocument: (url: string) => PDFDocumentLoadingTask; + GlobalWorkerOptions: { workerSrc: string }; +} export const DocumentPreviewPDF = ({ url }: { url: string }) => { const { t } = useT('documents'); diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx index c6dae5c87..3bb833369 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/document-table.tsx @@ -192,11 +192,8 @@ export function DocumentTable({ cell: ({ row }) => ( + + + } > - {documentName && ( -

- {tDocuments('teamTags.description', { name: documentName })} -

- )} - {isLoading ? (
@@ -156,6 +171,28 @@ export function DocumentTeamTagsDialog({ {tDocuments('teamTags.hint')}

- + ); } + +/** + * Dialog for managing team tags on a document. + * + * CRITICAL: This wrapper pattern prevents "Maximum update depth exceeded" errors. + * Radix UI Dialog keeps components mounted during closing animations. When hooks + * (useQuery, useMutation) run during this phase, they trigger state updates that + * conflict with Radix's usePresence hook, causing infinite re-render loops. + * + * The fix: Return null when closed to fully unmount the content component, + * ensuring hooks don't execute during animations. + * + * DO NOT refactor this to render DocumentTeamTagsDialogContent unconditionally. + * See: https://github.com/radix-ui/primitives/issues/3675 + */ +export function DocumentTeamTagsDialog(props: DocumentTeamTagsDialogProps) { + if (!props.open) { + return null; + } + + return ; +} diff --git a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/onedrive-import-dialog.tsx b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/onedrive-import-dialog.tsx index 14c3fd02a..6c6b69954 100644 --- a/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/onedrive-import-dialog.tsx +++ b/services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/onedrive-import-dialog.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useMemo } from 'react'; +import { useState, useMemo, useCallback } from 'react'; import { Dialog } from '@/components/ui/dialog/dialog'; import { Button } from '@/components/ui/primitives/button'; import { RadioGroup, RadioGroupItem } from '@/components/ui/forms/radio-group'; @@ -10,7 +10,7 @@ import { DataTable } from '@/components/ui/data-table/data-table'; import { DataTableSkeleton } from '@/components/ui/data-table/data-table-skeleton'; import { Stack, HStack } from '@/components/ui/layout/layout'; import { toast } from '@/hooks/use-toast'; -import { Search, Home, Loader2, Database, X } from 'lucide-react'; +import { Search, Home, Loader2, Database, X, Users } from 'lucide-react'; import type { DriveItem } from '@/types/microsoft-graph'; import { isFolder, @@ -19,12 +19,13 @@ import { formatDate, } from '@/lib/utils/onedrive-helpers'; import { useQuery } from '@tanstack/react-query'; -import { useAction } from 'convex/react'; +import { useAction, useQuery as useConvexQuery } from 'convex/react'; import { api } from '@/convex/_generated/api'; import { useSyncStatus, type FileProcessingStatus } from './sync-status'; import { MicrosoftReauthButton } from './microsoft-reauth-button'; import { DocumentIcon } from '@/components/ui/data-display/document-icon'; import type { ColumnDef } from '@tanstack/react-table'; +import { camelCase } from 'lodash'; import { useT } from '@/lib/i18n/client'; interface OneDriveImportDialogProps { @@ -37,6 +38,8 @@ interface OneDriveImportDialogProps { type ImportType = 'one-time' | 'sync'; type Stage = 'picker' | 'settings'; +const noop = () => {}; + type OneDriveItem = { id: string; name: string; @@ -111,7 +114,7 @@ function OneDriveFileTable({ const item = row.original; return ( - +
('picker'); const [importType, setImportType] = useState('one-time'); + const [selectedTeams, setSelectedTeams] = useState>(new Set()); // Sync state management const [isSyncing, setIsSyncing] = useState(false); @@ -232,6 +236,26 @@ export function OneDriveImportDialog({ Array<{ id: string | undefined; name: string }> >([{ id: undefined, name: t('breadcrumb.oneDrive') }]); + // Fetch user's teams via Convex query (only in settings stage) + const teamsResult = useConvexQuery( + api.member.getMyTeams, + stage === 'settings' ? { organizationId } : 'skip', + ); + const teams = teamsResult?.teams ?? null; + const isLoadingTeams = teamsResult === undefined; + + const handleToggleTeam = useCallback((teamId: string) => { + setSelectedTeams((prev) => { + const next = new Set(prev); + if (next.has(teamId)) { + next.delete(teamId); + } else { + next.add(teamId); + } + return next; + }); + }, []); + // React Query for OneDrive files and folders const { data: itemsData, @@ -362,6 +386,7 @@ export function OneDriveImportDialog({ organizationId: string, abortController: AbortController, importType: ImportType, + teamTags?: string[], ): Promise => { return new Promise((resolve, reject) => { // Prepare request body with import type differentiation @@ -369,6 +394,7 @@ export function OneDriveImportDialog({ items, organizationId, importType, // Pass import type to backend + teamTags, // Pass team tags for access control }; // Create SSE connection with POST data and abort signal @@ -512,13 +538,13 @@ export function OneDriveImportDialog({ }); reject( new Error( - t('onedrive.cancelledByUser', { type: importType }), + t('onedrive.cancelledByUser', { type: camelCase(importType) }), ), ); } else { toast({ title: importType === 'one-time' ? t('onedrive.importFailed') : t('onedrive.syncFailed'), - description: t('onedrive.failedToStart', { type: importType }), + description: t('onedrive.failedToStart', { type: camelCase(importType) }), variant: 'destructive', }); reject(error); @@ -706,6 +732,7 @@ export function OneDriveImportDialog({ }); // Start import/sync with streaming + const teamTags = selectedTeams.size > 0 ? Array.from(selectedTeams) : undefined; await startSyncWithStream( allFiles.map((file) => ({ id: file.id, @@ -720,6 +747,7 @@ export function OneDriveImportDialog({ organizationId, abortController, importType, + teamTags, ); } catch (error) { const errorMessage = @@ -752,7 +780,7 @@ export function OneDriveImportDialog({ return ( {})} + onOpenChange={props.onOpenChange ?? noop} title={t('onedrive.selectFiles')} hideClose className="max-w-5xl p-0" @@ -880,7 +908,7 @@ export function OneDriveImportDialog({ ) : ( <> - {t('onedrive.importItem', { type: importType, count: selectedItems.size })} + {t('onedrive.importItem', { type: camelCase(importType), count: selectedItems.size })} )} @@ -890,7 +918,7 @@ export function OneDriveImportDialog({ return ( {})} + onOpenChange={props.onOpenChange ?? noop} title={t('onedrive.importSettings')} description={t('onedrive.settingsDescription', { count: selectedItems.size })} size="md" @@ -955,6 +983,52 @@ export function OneDriveImportDialog({
+ + {/* Team Selection */} +
+

+ {t('upload.selectTeams')} +

+

+ {t('upload.selectTeamsDescription')} +

+ + {isLoadingTeams ? ( +
+ + {tCommon('actions.loading')} + +
+ ) : !teams || teams.length === 0 ? ( +
+ +

+ {t('upload.noTeamsAvailable')} +

+
+ ) : ( + + {teams.map((team) => ( +
+ handleToggleTeam(team.id)} + disabled={isSyncing} + label={team.name} + /> +
+ ))} +
+ )} + +

+ {t('upload.allMembersHint')} +

+
); diff --git a/services/platform/app/api/documents/onedrive/route.ts b/services/platform/app/api/documents/onedrive/route.ts index b447a05a5..10bcaaa67 100644 --- a/services/platform/app/api/documents/onedrive/route.ts +++ b/services/platform/app/api/documents/onedrive/route.ts @@ -1,7 +1,7 @@ import { NextRequest } from 'next/server'; import { getCurrentUser, getAuthToken } from '@/lib/auth/auth-server'; import { Logger } from '@/lib/logger'; -import { fetchAction, fetchMutation } from '@/lib/convex-next-server'; +import { fetchAction, fetchMutation, fetchQuery } from '@/lib/convex-next-server'; import { api } from '@/convex/_generated/api'; import type { DriveItem } from '@/types/microsoft-graph'; import { isFile, sanitizeStoragePath } from '@/lib/utils/onedrive-helpers'; @@ -17,6 +17,13 @@ interface SyncRequestItem { selectedParentPath?: string; } +interface SyncRequestBody { + items: SyncRequestItem[]; + organizationId: string; + importType?: ImportType; + teamTags?: string[]; +} + type ImportType = 'one-time' | 'sync'; const logger = new Logger('documents-onedrive-stream'); @@ -37,6 +44,7 @@ async function importSingleFile( selectedParentName?: string, selectedParentPath?: string, syncConfigId?: string, + teamTags?: string[], ): Promise<{ success: boolean; error?: string; @@ -121,6 +129,7 @@ async function importSingleFile( fileData: readResult.data.content, contentType: readResult.data.mimeType, metadata, + teamTags, }, { token }, ); @@ -153,15 +162,12 @@ async function importSingleFile( export async function POST(request: NextRequest): Promise { try { - const body = await request.json(); + const body: SyncRequestBody = await request.json(); const { items, organizationId, importType = 'one-time', - }: { - items: SyncRequestItem[]; - organizationId: string; - importType?: ImportType; + teamTags, } = body; // Get the abort signal from the request @@ -196,6 +202,20 @@ export async function POST(request: NextRequest): Promise { return new Response('Authentication token not available', { status: 401 }); } + // Validate team tags if provided - user must belong to all specified teams + if (teamTags && teamTags.length > 0) { + const teamsResult = await fetchQuery( + api.member.getMyTeams, + { organizationId }, + { token }, + ); + const userTeamIds = new Set(teamsResult?.teams?.map((t: { id: string }) => t.id) ?? []); + const invalidTeams = teamTags.filter((tagId) => !userTeamIds.has(tagId)); + if (invalidTeams.length > 0) { + return new Response('Not authorized to assign to specified teams', { status: 403 }); + } + } + // Ensure the specified bucket exists logger.info('Creating/ensuring documents bucket exists', { organizationId, @@ -280,6 +300,7 @@ export async function POST(request: NextRequest): Promise { : item.name, targetBucket: 'documents', storagePrefix: `${organizationId}/onedrive`, + teamTags, }, { token }, ); @@ -304,6 +325,7 @@ export async function POST(request: NextRequest): Promise { itemPath: item.relativePath || '/', targetBucket: 'documents', storagePrefix: `${organizationId}/onedrive/${item.selectedParentName || 'OneDrive Folder'}`, + teamTags, }, { token }, ); @@ -428,6 +450,7 @@ export async function POST(request: NextRequest): Promise { item.selectedParentName, item.selectedParentPath, syncConfigMap.get(item.id), // Pass syncConfigId if available + teamTags, ); if (result.success) { diff --git a/services/platform/components/ui/dialog/dialog.tsx b/services/platform/components/ui/dialog/dialog.tsx index e0459ea6d..90470625f 100644 --- a/services/platform/components/ui/dialog/dialog.tsx +++ b/services/platform/components/ui/dialog/dialog.tsx @@ -7,7 +7,6 @@ import { X } from 'lucide-react'; import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '@/lib/utils/cn'; -import { IconButton } from '../primitives/icon-button'; import { useT } from '@/lib/i18n/client'; // ============================================================================= @@ -42,16 +41,17 @@ export type DialogSize = NonNullable< // Internal Components // ============================================================================= -const DialogCloseButton = React.forwardRef< - HTMLButtonElement, - React.ComponentPropsWithoutRef<'button'> ->((props, ref) => { +function DialogCloseButton() { const { t } = useT('common'); return ( - + + ); -}); -DialogCloseButton.displayName = 'DialogCloseButton'; +} // ============================================================================= // Dialog Wrapper Component @@ -93,6 +93,25 @@ export interface DialogProps { /** * Base dialog component that provides a consistent structure for all dialogs. * Use this as the foundation for more specific dialog types or directly for custom dialogs. + * + * IMPORTANT: If your dialog content uses hooks (useQuery, useMutation, useEffect, etc.), + * wrap the content in a conditional render pattern to prevent "Maximum update depth exceeded" + * errors. Radix UI keeps dialog content mounted during closing animations, and hooks + * running during this phase can conflict with Radix's usePresence hook. + * + * @example + * // Wrapper pattern for dialogs with hooks: + * function MyDialogContent(props) { + * const data = useQuery(...); // hooks here + * return ...; + * } + * + * export function MyDialog(props) { + * if (!props.open) return null; // Prevents hooks during close animation + * return ; + * } + * + * See: https://github.com/radix-ui/primitives/issues/3675 */ export function Dialog({ open, @@ -120,12 +139,11 @@ export function Dialog({ {!hideClose && !customHeader && (
- - - +
)} {customHeader ? ( diff --git a/services/platform/components/ui/dialog/form-dialog.tsx b/services/platform/components/ui/dialog/form-dialog.tsx index 3f329a49e..712ba30ab 100644 --- a/services/platform/components/ui/dialog/form-dialog.tsx +++ b/services/platform/components/ui/dialog/form-dialog.tsx @@ -1,15 +1,16 @@ 'use client'; -import * as React from 'react'; +import { useCallback, useRef } from 'react'; import { Dialog } from './dialog'; import { Button } from '../primitives/button'; -import { Form } from '../forms/form'; import { Stack } from '../layout/layout'; import { cn } from '@/lib/utils/cn'; import { useT } from '@/lib/i18n/client'; import { DialogErrorBoundary } from '@/components/error-boundaries/boundaries/dialog-error-boundary'; import { useOrganizationId } from '@/hooks/use-organization-id'; +const preventDefaultSubmit = (e: React.FormEvent) => e.preventDefault(); + export interface FormDialogProps { /** Whether the dialog is open */ open?: boolean; @@ -76,18 +77,31 @@ export function FormDialog({ const { t: tCommon } = useT('common'); const orgId = useOrganizationId(); - const handleClose = () => { - if (!isSubmitting) { - onOpenChange?.(false); + // Use refs to track values so handleClose has a stable reference + const isSubmittingRef = useRef(isSubmitting); + isSubmittingRef.current = isSubmitting; + const onOpenChangeRef = useRef(onOpenChange); + onOpenChangeRef.current = onOpenChange; + + const handleClose = useCallback((open: boolean) => { + // Block closing while submitting, but always allow opening + if (open || !isSubmittingRef.current) { + onOpenChangeRef.current?.(open); } - }; + }, []); + + // Memoize the error handler to prevent inline function recreation + const handleBoundaryError = useCallback((error: Error) => { + onError?.(error); + onOpenChangeRef.current?.(false); + }, [onError]); const footer = customFooter ?? ( <> -
- ), + cell: ({ row }) => { + const fullPath = row.original.name ?? ''; + const fileName = fullPath.split('/').pop() || fullPath; + + return ( + + + + + ); + }, }, { accessorKey: 'size', From 58b6e33678fc41508c826f364fe77bf00425cc8d Mon Sep 17 00:00:00 2001 From: larryro <371767072@qq.com> Date: Sat, 17 Jan 2026 17:04:02 +0800 Subject: [PATCH 47/47] fix(rag): improve logging, error handling, and file validation - Replace console.log/error with debug logger in document operations - Add comprehensive logging to RAG upload process with request details - Add file extension validation with supported formats list - Add UnicodeDecodeError handling with helpful error messages - Pre-download tiktoken encodings in Docker to support air-gapped environments - Disable telemetry to prevent SSL errors to external endpoints - Reduce embedding log verbosity in litellm patch Co-Authored-By: Claude Sonnet 4.5 --- services/platform/convex/documents.ts | 30 ++++++++++++----- .../actions/rag/helpers/upload_file_direct.ts | 32 ++++++++++++++++++- services/rag/Dockerfile | 15 ++++++++- services/rag/app/routers/documents.py | 28 +++++++++++++++- services/rag/app/services/cognee/config.py | 4 +-- services/rag/app/services/cognee/service.py | 8 +++++ 6 files changed, 104 insertions(+), 13 deletions(-) diff --git a/services/platform/convex/documents.ts b/services/platform/convex/documents.ts index 8a9bb31ce..95a3bce18 100644 --- a/services/platform/convex/documents.ts +++ b/services/platform/convex/documents.ts @@ -56,6 +56,9 @@ import { createDocumentFromUploadResponseValidator, } from './model/documents/validators'; import { ragAction } from './workflow/actions/rag/rag_action'; +import { createDebugLog } from './lib/debug_log'; + +const debugLog = createDebugLog('DEBUG_DOCUMENTS', '[Documents]'); // ============================================================================= // INTERNAL FUNCTIONS (no RLS) @@ -407,7 +410,7 @@ export const checkRagJobStatus = internalAction({ // Terminate: max attempts reached if (attempt > maxAttempts) { - console.warn( + debugLog( `[checkRagJobStatus] Max attempts (${maxAttempts}) reached for document ${args.documentId}`, ); await ctx.runMutation(internal.documents.updateDocumentRagInfo, { @@ -433,7 +436,7 @@ export const checkRagJobStatus = internalAction({ }); if (!response.ok) { - console.warn( + debugLog( `[checkRagJobStatus] RAG service returned ${response.status} for job ${document.ragInfo.jobId} (attempt ${attempt}/${maxAttempts})`, ); // Schedule next attempt on HTTP error @@ -487,7 +490,7 @@ export const checkRagJobStatus = internalAction({ { documentId: args.documentId, attempt: attempt + 1 }, ); } catch (error) { - console.error( + debugLog( `[checkRagJobStatus] Error checking job status (attempt ${attempt}/${maxAttempts}):`, error, ); @@ -532,7 +535,7 @@ export const deleteDocumentFromRagInternal = internalAction({ mode: args.mode || 'hard', }); - console.log('[documents] RAG deletion result:', { + debugLog('[documents] RAG deletion result:', { success: result.success, deletedCount: result.deletedCount, message: result.message, @@ -701,7 +704,7 @@ export const deleteDocument = mutationWithRLS({ ); } catch (error) { // Log error but don't fail the deletion - RAG cleanup is best-effort - console.error('[documents] Failed to schedule RAG cleanup:', { + debugLog('[documents] Failed to schedule RAG cleanup:', { documentId: args.documentId, error: error instanceof Error ? error.message : String(error), }); @@ -881,7 +884,7 @@ export const uploadFile = action({ documentId: result.documentId, }; } catch (error) { - console.error('Error uploading file:', error); + debugLog('Error uploading file:', error); return { success: false, error: error instanceof Error ? error.message : 'Upload failed', @@ -1011,7 +1014,7 @@ export const createDocumentFromUpload = mutationWithRLS({ documentId: result.documentId, }; } catch (error) { - console.error('Error creating document from upload:', error); + debugLog('Error creating document from upload:', error); return { success: false, error: error instanceof Error ? error.message : 'Failed to create document', @@ -1128,6 +1131,8 @@ export const retryRagIndexing = action({ return { success: false, error: 'Not authorized to access this document' }; } + debugLog('[retryRagIndexing] Starting RAG retry for document:', args.documentId); + type RagResult = { success: boolean; jobId?: string }; const result = (await ragAction.execute( ctx, @@ -1135,9 +1140,18 @@ export const retryRagIndexing = action({ {}, )) as RagResult; + debugLog('[retryRagIndexing] RAG retry completed:', { + success: result.success, + jobId: result.jobId, + }); + return { success: result.success, jobId: result.jobId }; } catch (error) { - console.error('[retryRagIndexing] Error:', error); + debugLog('[retryRagIndexing] Error:', { + error: error instanceof Error ? error.message : String(error), + stack: error instanceof Error ? error.stack : undefined, + documentId: args.documentId, + }); return { success: false, error: error instanceof Error ? error.message : 'Failed to retry RAG indexing', diff --git a/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts b/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts index c88a2df21..0663781d6 100644 --- a/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts +++ b/services/platform/convex/workflow/actions/rag/helpers/upload_file_direct.ts @@ -45,6 +45,11 @@ export async function uploadFileDirect({ const startTime = Date.now(); // Step 1: Download file from Convex storage + console.log('[uploadFileDirect] Downloading file from storage:', { + fileUrl: fileUrl.substring(0, 100) + '...', + filename, + }); + const fileResponse = await fetch(fileUrl); if (!fileResponse.ok) { throw new Error( @@ -53,6 +58,10 @@ export async function uploadFileDirect({ } const fileBlob = await fileResponse.blob(); + console.log('[uploadFileDirect] File downloaded:', { + size: fileBlob.size, + type: fileBlob.type, + }); // Step 2: Prepare multipart/form-data upload const formData = new FormData(); @@ -87,6 +96,18 @@ export async function uploadFileDirect({ // Step 3: Upload to RAG service const url = `${ragServiceUrl}/api/v1/documents/upload`; + console.log('[uploadFileDirect] Starting RAG upload:', { + url, + filename, + contentType, + fileSize: fileBlob.size, + timeoutMs, + hasMetadata: !!metadata, + hasDocumentId: !!recordIdFromMetadata, + hasUserId: !!userId, + datasetName, + }); + const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeoutMs); @@ -100,7 +121,16 @@ export async function uploadFileDirect({ if (!response.ok) { const errorText = await response.text(); - throw new Error(`RAG service error: ${response.status} ${errorText}`); + console.error('[uploadFileDirect] RAG service error:', { + status: response.status, + statusText: response.statusText, + url, + errorText: errorText || '(empty response)', + headers: Object.fromEntries(response.headers.entries()), + }); + throw new Error( + `RAG service error: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ''}`, + ); } const result = (await response.json()) as RagApiUploadResponse; diff --git a/services/rag/Dockerfile b/services/rag/Dockerfile index c6aaf5320..661dbe5b3 100644 --- a/services/rag/Dockerfile +++ b/services/rag/Dockerfile @@ -36,6 +36,17 @@ WORKDIR /app COPY services/rag/pyproject.toml /app/pyproject.toml RUN uv pip install --system . +# Pre-download tiktoken encoding files to avoid runtime network requests +# This ensures the container works in air-gapped environments +# Download all common encodings used by OpenAI models +RUN mkdir -p /root/.cache/tiktoken && \ + python3 -c "import tiktoken; \ + tiktoken.get_encoding('cl100k_base'); \ + tiktoken.get_encoding('p50k_base'); \ + tiktoken.get_encoding('r50k_base');" && \ + echo "Tiktoken encodings downloaded successfully" && \ + ls -la /root/.cache/tiktoken/ || echo "Warning: tiktoken cache directory is empty" + # ============================================================================ # Stage 3: Final # ============================================================================ @@ -94,7 +105,9 @@ ENV TALE_VERSION=${VERSION} \ # Cognee BaseConfig paths (pydantic_settings reads these env vars) # These override the default paths in cognee.base_config.BaseConfig DATA_ROOT_DIRECTORY=/app/data/.data_storage \ - SYSTEM_ROOT_DIRECTORY=/app/data/.cognee_system + SYSTEM_ROOT_DIRECTORY=/app/data/.cognee_system \ + # Disable telemetry to prevent SSL errors to external telemetry endpoint + TELEMETRY_DISABLED=true # Expose port EXPOSE 8001 diff --git a/services/rag/app/routers/documents.py b/services/rag/app/routers/documents.py index 1c52c45d0..8b95b3bec 100644 --- a/services/rag/app/routers/documents.py +++ b/services/rag/app/routers/documents.py @@ -160,8 +160,35 @@ async def upload_document( but heavy ingestion work is delegated to a background task so callers (including Convex workflows) don't block on cognee processing. """ + from pathlib import Path + + SUPPORTED_EXTENSIONS = { + ".pdf", ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".webp", + ".docx", ".doc", ".pptx", ".ppt", ".xlsx", ".xls", + ".txt", ".md", ".csv" + } + tmp_path: Optional[str] = None try: + if not file.filename: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Filename is required" + ) + + file_ext = Path(file.filename).suffix.lower() + if not file_ext: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"File must have an extension. Supported formats: {', '.join(sorted(SUPPORTED_EXTENSIONS))}" + ) + + if file_ext not in SUPPORTED_EXTENSIONS: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Unsupported file type: {file_ext}. Supported formats: {', '.join(sorted(SUPPORTED_EXTENSIONS))}" + ) + # Validate file size (50MB default limit from config) max_size_mb = ( settings.max_document_size_mb @@ -173,7 +200,6 @@ async def upload_document( # Create file on disk with original extension in the ingest directory ingest_dir = os.path.join(settings.cognee_data_dir, "ingest") os.makedirs(ingest_dir, exist_ok=True) - file_ext = os.path.splitext(file.filename)[1] if file.filename else "" tmp_path = os.path.join(ingest_dir, f"upload_{uuid4().hex}{file_ext}") # Stream file to disk in chunks to avoid loading entire file into memory diff --git a/services/rag/app/services/cognee/config.py b/services/rag/app/services/cognee/config.py index 5a4a1350d..dff8115c2 100644 --- a/services/rag/app/services/cognee/config.py +++ b/services/rag/app/services/cognee/config.py @@ -326,11 +326,11 @@ def _patched_embedding( aembedding: bool = False, **kwargs: Any, ) -> Any: - # Remove encoding_format for non-OpenAI endpoints base_url = api_base or os.environ.get("OPENAI_BASE_URL", "") if optional_params and "api.openai.com" not in base_url: optional_params.pop("encoding_format", None) - logger.debug("Removed encoding_format for non-OpenAI endpoint") + input_count = len(input) if isinstance(input, list) else 1 + logger.debug(f"Embedding {input_count} text(s) with {model}") return _original_embedding( self, diff --git a/services/rag/app/services/cognee/service.py b/services/rag/app/services/cognee/service.py index feb09ec13..b42eb5f08 100644 --- a/services/rag/app/services/cognee/service.py +++ b/services/rag/app/services/cognee/service.py @@ -426,6 +426,14 @@ async def add_document( except TimeoutError: # Re-raise timeout errors without wrapping raise + except UnicodeDecodeError as e: + error_msg = ( + f"Failed to decode file '{content}': {e}. " + "The file appears to be binary or uses an unsupported encoding. " + "Supported file types: PDF, images (PNG, JPG, etc.), DOCX, PPTX, XLSX, TXT, MD, CSV." + ) + logger.error(error_msg) + raise ValueError(error_msg) from e except Exception as e: logger.error(f"Failed to add document: {e}") raise