diff --git a/README.md b/README.md index 7d3a843..5edcf3b 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Want to see another Nextcloud app supported? [Open an issue](https://github.com/ ### Authentication Modes -The server supports two authentication modes: +The server supports three authentication modes: **Single-User Mode (BasicAuth):** - One set of credentials shared by all MCP clients @@ -113,6 +113,12 @@ The server supports two authentication modes: - More secure: tokens expire, credentials never shared with server - Best for: Teams, multi-user deployments, production environments with multiple users +**Hybrid Mode (Multi-User BasicAuth + OAuth):** +- MCP clients use BasicAuth (simple, stateless) +- Admin operations use OAuth (webhooks, background sync) +- Best for: Nextcloud deployments with admin-managed webhooks and semantic search +- Requires: `ENABLE_MULTI_USER_BASIC_AUTH=true` + `ENABLE_OFFLINE_ACCESS=true` + See [docs/authentication.md](docs/authentication.md) for detailed setup instructions. ## Semantic Search diff --git a/docs/authentication.md b/docs/authentication.md index cf6b9d4..271b795 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -140,6 +140,93 @@ Basic Authentication uses username and password credentials directly. - [Configuration](configuration.md#basic-authentication-legacy) - BasicAuth environment variables - [Running the Server](running.md#basicauth-mode-legacy) - BasicAuth examples +## Hybrid Authentication (Multi-User BasicAuth + OAuth) + +When running in multi-user BasicAuth mode with `ENABLE_OFFLINE_ACCESS=true`, the server operates in **hybrid authentication mode**. This provides the simplicity of BasicAuth for normal operations with the security of OAuth for administrative functions. + +### Authentication Domains + +**MCP Operations** (Tools, Resources): +- **Auth Method**: BasicAuth (HTTP Basic username/password) +- **Characteristics**: + - Stateless - no token storage + - Simple configuration + - Direct credential validation against Nextcloud + - Credentials passed per-request in Authorization header +- **Used For**: MCP tool calls from Claude, MCP client operations + +**Management APIs** (Webhooks, Admin UI): +- **Auth Method**: OAuth bearer tokens +- **Characteristics**: + - Per-user authorization via OAuth consent flow + - Refresh tokens stored for background operations + - Token validation via UnifiedTokenVerifier + - Explicit user consent required +- **Used For**: Astrolabe admin UI, webhook management, vector sync operations + +### Configuration + +```env +# Enable multi-user BasicAuth +ENABLE_MULTI_USER_BASIC_AUTH=true + +# Enable hybrid mode (OAuth provisioning for management APIs) +ENABLE_OFFLINE_ACCESS=true + +# Enable background sync (required for hybrid mode currently) +VECTOR_SYNC_ENABLED=true + +# Encryption key for refresh token storage +TOKEN_ENCRYPTION_KEY= + +# Nextcloud connection +NEXTCLOUD_HOST=https://cloud.example.com + +# OAuth credentials (optional - uses DCR if not set) +NEXTCLOUD_OIDC_CLIENT_ID= +NEXTCLOUD_OIDC_CLIENT_SECRET= +``` + +### OAuth Provisioning Flow + +1. Admin opens Astrolabe admin settings in Nextcloud +2. Clicks "Authorize" to enable webhook management +3. Redirected to `/oauth/authorize-nextcloud` on MCP server +4. MCP server redirects to Nextcloud OAuth consent page +5. Admin grants OAuth consent (scopes: `openid`, `profile`, `offline_access`) +6. Redirected back to `/oauth/callback` on MCP server +7. MCP server stores refresh token (encrypted) +8. Admin can now manage webhooks from Astrolabe UI + +### Benefits + +- **Simple MCP client setup**: Use BasicAuth (no OAuth complexity for end users) +- **Secure background operations**: Webhooks use per-user OAuth tokens (no shared credentials) +- **Explicit authorization**: Admins must explicitly grant OAuth consent for webhook operations +- **Per-user isolation**: Each admin's webhook operations use their own refresh token + +### Trade-offs + +- **Two auth systems**: More complex server configuration than pure BasicAuth or OAuth +- **OAuth setup required**: Admins must complete OAuth flow before managing webhooks +- **Token storage**: Requires database and encryption key for refresh tokens + +### Comparison + +| Feature | Pure BasicAuth | Hybrid Mode | Pure OAuth | +|---------|---------------|-------------|------------| +| MCP Operations | BasicAuth | BasicAuth | OAuth Bearer Token | +| Management API | N/A | OAuth Bearer Token | OAuth Bearer Token | +| Webhook Operations | N/A | OAuth Refresh Token | OAuth Refresh Token | +| MCP Client Setup | Simple | Simple | Complex (PKCE flow) | +| Admin UI Auth | N/A | OAuth Consent | OAuth Login | +| Token Storage | None | Refresh tokens only | All tokens | +| Deployment Complexity | Low | Medium | High | + +### See Also +- [OAuth Architecture](oauth-architecture.md) - Progressive Consent (Flow 2) details +- [Configuration](configuration.md#enable_offline_access) - Hybrid mode configuration + ## Mode Detection The server automatically detects the authentication mode: diff --git a/nextcloud_mcp_server/app.py b/nextcloud_mcp_server/app.py index 5895bab..62e63b6 100644 --- a/nextcloud_mcp_server/app.py +++ b/nextcloud_mcp_server/app.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import time @@ -42,6 +44,7 @@ from nextcloud_mcp_server.auth.unified_verifier import UnifiedTokenVerifier from nextcloud_mcp_server.client import NextcloudClient from nextcloud_mcp_server.config import ( DeploymentMode, + Settings, get_document_processor_config, get_settings, ) @@ -1012,6 +1015,160 @@ async def setup_oauth_config(): ) +async def setup_oauth_config_for_multi_user_basic( + settings: Settings, + client_id: str, + client_secret: str, +) -> tuple[UnifiedTokenVerifier, RefreshTokenStorage | None, str, str]: + """ + Setup minimal OAuth configuration for multi-user BasicAuth mode. + + This is a lightweight version of setup_oauth_config() that: + - Performs OIDC discovery to get endpoints + - Creates UnifiedTokenVerifier for management API token validation + - Creates RefreshTokenStorage for webhook token storage + - Skips OAuth client creation (not needed for BasicAuth background sync) + - Skips AuthSettings creation (not needed for BasicAuth MCP operations) + + This enables hybrid authentication mode where: + - MCP operations use BasicAuth (stateless, simple) + - Management APIs use OAuth bearer tokens (secure, per-user) + - Background operations use OAuth refresh tokens (webhook sync) + + Args: + settings: Application settings + client_id: OAuth client ID (from DCR or static config) + client_secret: OAuth client secret + + Returns: + Tuple of (token_verifier, refresh_token_storage, client_id, client_secret) + + Raises: + ValueError: If NEXTCLOUD_HOST is not set + httpx.HTTPError: If OIDC discovery fails + """ + nextcloud_host = settings.nextcloud_host + if not nextcloud_host: + raise ValueError("NEXTCLOUD_HOST is required for OAuth infrastructure setup") + + nextcloud_host = nextcloud_host.rstrip("/") + + # Get OIDC discovery URL (always Nextcloud integrated mode for multi-user BasicAuth) + discovery_url = os.getenv( + "OIDC_DISCOVERY_URL", + f"{nextcloud_host}/.well-known/openid-configuration", + ) + logger.info( + f"Performing OIDC discovery for multi-user BasicAuth hybrid mode: {discovery_url}" + ) + + # Perform OIDC discovery + async with httpx.AsyncClient() as http_client: + response = await http_client.get(discovery_url) + response.raise_for_status() + discovery = response.json() + + logger.info("✓ OIDC discovery successful (multi-user BasicAuth)") + + # Extract OIDC endpoints + issuer = discovery["issuer"] + userinfo_uri = discovery["userinfo_endpoint"] + jwks_uri = discovery.get("jwks_uri") + introspection_uri = discovery.get("introspection_endpoint") + + # For multi-user BasicAuth, always assume Nextcloud integrated mode + # and rewrite endpoints to use internal URL for backend access + if jwks_uri: + internal_jwks_uri = f"{nextcloud_host}/apps/oidc/jwks" + jwks_uri = internal_jwks_uri + if introspection_uri: + internal_introspection_uri = f"{nextcloud_host}/apps/oidc/introspect" + introspection_uri = internal_introspection_uri + if userinfo_uri: + internal_userinfo_uri = f"{nextcloud_host}/apps/oidc/userinfo" + userinfo_uri = internal_userinfo_uri + + logger.info("OIDC endpoints configured for management API:") + logger.info(f" Issuer: {issuer}") + logger.info(f" Userinfo: {userinfo_uri}") + logger.info(f" JWKS: {jwks_uri}") + logger.info(f" Introspection: {introspection_uri}") + + # Get MCP server URL for audience validation + mcp_server_url = os.getenv("NEXTCLOUD_MCP_SERVER_URL", "http://localhost:8000") + nextcloud_resource_uri = os.getenv("NEXTCLOUD_RESOURCE_URI", nextcloud_host) + + # Handle public issuer override (for JWT validation) + public_issuer = os.getenv("NEXTCLOUD_PUBLIC_ISSUER_URL") + if public_issuer: + public_issuer = public_issuer.rstrip("/") + logger.info( + f"Using public issuer URL override for JWT validation: {public_issuer}" + ) + client_issuer = public_issuer + else: + client_issuer = issuer + + # Update settings with discovered values for UnifiedTokenVerifier + if not settings.oidc_client_id: + settings.oidc_client_id = client_id + if not settings.oidc_client_secret: + settings.oidc_client_secret = client_secret + if not settings.jwks_uri: + settings.jwks_uri = jwks_uri + if not settings.introspection_uri: + settings.introspection_uri = introspection_uri + if not settings.userinfo_uri: + settings.userinfo_uri = userinfo_uri + if not settings.oidc_issuer: + settings.oidc_issuer = client_issuer + if not settings.nextcloud_mcp_server_url: + settings.nextcloud_mcp_server_url = mcp_server_url + if not settings.nextcloud_resource_uri: + settings.nextcloud_resource_uri = nextcloud_resource_uri + + # Create Unified Token Verifier for management API authentication + token_verifier = UnifiedTokenVerifier(settings) + logger.info("✓ Token verifier created for management API (hybrid mode)") + + if introspection_uri: + logger.info(" Opaque token introspection enabled (RFC 7662)") + if jwks_uri: + logger.info(" JWT signature verification enabled (JWKS)") + + # Initialize refresh token storage for background operations + refresh_token_storage = None + if settings.enable_offline_access: + try: + from nextcloud_mcp_server.auth.storage import RefreshTokenStorage + + encryption_key = os.getenv("TOKEN_ENCRYPTION_KEY") + if not encryption_key: + logger.warning( + "ENABLE_OFFLINE_ACCESS=true but TOKEN_ENCRYPTION_KEY not set. " + "Refresh tokens will NOT be stored. Generate a key with:\n" + ' python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"' + ) + else: + refresh_token_storage = RefreshTokenStorage.from_env() + await refresh_token_storage.initialize() + logger.info( + "✓ Refresh token storage initialized for background operations (hybrid mode)" + ) + except Exception as e: + logger.error(f"Failed to initialize refresh token storage: {e}") + logger.debug(f"Full traceback:\n{traceback.format_exc()}") + logger.warning( + "Continuing without refresh token storage - webhook management may be limited" + ) + + logger.info( + "OAuth infrastructure setup complete for multi-user BasicAuth hybrid mode" + ) + + return (token_verifier, refresh_token_storage, client_id, client_secret) + + def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = None): # Initialize observability (logging will be configured by uvicorn) settings = get_settings() @@ -1043,6 +1200,15 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = else DeploymentMode.SELF_HOSTED ) + # Log hybrid authentication status for multi-user BasicAuth with offline access + if mode == AuthMode.MULTI_USER_BASIC and settings.enable_offline_access: + logger.info( + "🔄 Hybrid authentication mode will be enabled:\n" + " - MCP operations: BasicAuth (stateless, credentials per-request)\n" + " - Management APIs: OAuth bearer tokens (secure, per-user)\n" + " - Background operations: OAuth refresh tokens (webhook sync)" + ) + # Setup Prometheus metrics (always enabled by default) if settings.metrics_enabled: setup_metrics(port=settings.metrics_port) @@ -1070,6 +1236,8 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = # This must happen BEFORE uvicorn starts (same lifecycle point as OAuth modes) # to avoid async context issues multi_user_basic_oauth_creds: tuple[str, str] | None = None + multi_user_token_verifier: UnifiedTokenVerifier | None = None + multi_user_refresh_storage: RefreshTokenStorage | None = None if ( mode == AuthMode.MULTI_USER_BASIC @@ -1135,6 +1303,42 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = # Run DCR synchronously before uvicorn starts multi_user_basic_oauth_creds = anyio.run(setup_multi_user_basic_dcr) + # Setup OAuth infrastructure for management APIs and background operations + # This creates the UnifiedTokenVerifier needed by management.py and + # RefreshTokenStorage for webhook token persistence + if multi_user_basic_oauth_creds: + sync_client_id, sync_client_secret = multi_user_basic_oauth_creds + + logger.info( + "Setting up OAuth infrastructure for management APIs (hybrid mode)..." + ) + + try: + ( + multi_user_token_verifier, + multi_user_refresh_storage, + _, + _, + ) = anyio.run( + setup_oauth_config_for_multi_user_basic, + settings, + sync_client_id, + sync_client_secret, + ) + logger.info( + "✓ OAuth infrastructure setup complete for multi-user BasicAuth hybrid mode" + ) + except Exception as e: + logger.error(f"Failed to setup OAuth infrastructure: {e}") + logger.debug(f"Full traceback:\n{traceback.format_exc()}") + logger.warning( + "Management API will be unavailable. " + "Webhook management from Astrolabe admin UI will not work." + ) + # Set to None to indicate failure + multi_user_token_verifier = None + multi_user_refresh_storage = None + # Create MCP server based on detected mode if mode in (AuthMode.OAUTH_SINGLE_AUDIENCE, AuthMode.OAUTH_TOKEN_EXCHANGE): logger.info("Configuring MCP server for OAuth mode") @@ -1410,11 +1614,14 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = # For multi-user BasicAuth with offline access, create oauth_context for management APIs # This allows Astrolabe to use management APIs with OAuth bearer tokens if settings.enable_multi_user_basic_auth and settings.enable_offline_access: - # Check if we have OAuth credentials from DCR - if multi_user_basic_oauth_creds: + # Check if we have OAuth credentials AND infrastructure from setup + if ( + multi_user_basic_oauth_creds + and multi_user_token_verifier is not None + ): sync_client_id, sync_client_secret = multi_user_basic_oauth_creds - # Create minimal oauth_context for management API authentication + # Create oauth_context for management API authentication nextcloud_host_for_context = settings.nextcloud_host mcp_server_url = os.getenv( "NEXTCLOUD_MCP_SERVER_URL", "http://localhost:8000" @@ -1425,9 +1632,10 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = ) oauth_context_dict = { - "storage": basic_auth_storage, + # Use OAuth refresh token storage if available, fallback to basic_auth_storage + "storage": multi_user_refresh_storage or basic_auth_storage, "oauth_client": None, # Not needed for management APIs - "token_verifier": None, # Will be set when token broker is created + "token_verifier": multi_user_token_verifier, # FIXED: Now has real verifier! "config": { "mcp_server_url": mcp_server_url, "discovery_url": discovery_url, @@ -1441,7 +1649,19 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = } app.state.oauth_context = oauth_context_dict logger.info( - f"OAuth context initialized for management APIs (multi-user BasicAuth, client_id={sync_client_id[:16]}...)" + f"✓ OAuth context initialized for management APIs (hybrid mode, client_id={sync_client_id[:16]}...)" + ) + elif multi_user_basic_oauth_creds and multi_user_token_verifier is None: + logger.warning( + "OAuth infrastructure setup failed - management API will be unavailable. " + "This is expected if OIDC discovery failed or token verifier creation failed. " + "Webhook management from Astrolabe admin UI will not work." + ) + else: + logger.warning( + "OAuth credentials not available - management API will be unavailable. " + "This is expected if DCR failed or static credentials were not provided. " + "Webhook management from Astrolabe admin UI will not work." ) # Also share with browser_app for webhook routes @@ -2028,7 +2248,21 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = # Note: Metrics endpoint is NOT exposed on main HTTP port for security reasons. # Metrics are served on dedicated port via setup_metrics() (default: 9090) - if oauth_enabled: + # Determine if OAuth provisioning is available + # This is true for: + # 1. OAuth modes (primary auth method for MCP operations) + # 2. Multi-user BasicAuth with offline access (hybrid mode) + oauth_provisioning_available = oauth_enabled or ( + mode == AuthMode.MULTI_USER_BASIC + and settings.enable_offline_access + and multi_user_token_verifier is not None # Ensure OAuth setup succeeded + ) + + if oauth_provisioning_available: + logger.info( + f"OAuth provisioning routes enabled for mode: {mode.value} " + f"(oauth_enabled={oauth_enabled}, hybrid_mode={not oauth_enabled})" + ) # Import OAuth routes (ADR-004 Progressive Consent) from nextcloud_mcp_server.auth.oauth_routes import oauth_authorize @@ -2091,10 +2325,6 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = "Protected Resource Metadata (PRM) endpoints enabled (path-based + root)" ) - # Add OAuth login routes (ADR-004 Progressive Consent Flow 1) - routes.append(Route("/oauth/authorize", oauth_authorize, methods=["GET"])) - logger.info("OAuth login routes enabled: /oauth/authorize (Flow 1)") - # Add unified OAuth callback endpoint supporting both flows from nextcloud_mcp_server.auth.oauth_routes import ( oauth_authorize_nextcloud, @@ -2124,9 +2354,17 @@ def get_app(transport: str = "streamable-http", enabled_apps: list[str] | None = ) ) logger.info( - "OAuth resource provisioning routes enabled: /oauth/authorize-nextcloud, /oauth/callback-nextcloud (Flow 2, legacy)" + "OAuth resource provisioning routes enabled: /oauth/authorize-nextcloud, /oauth/callback-nextcloud (Flow 2)" ) + # Add OAuth Flow 1 routes (MCP client login) - ONLY for OAuth modes + # Multi-user BasicAuth uses hybrid mode with only Flow 2 (resource provisioning) + if oauth_enabled: + from nextcloud_mcp_server.auth.oauth_routes import oauth_authorize + + routes.append(Route("/oauth/authorize", oauth_authorize, methods=["GET"])) + logger.info("OAuth login routes enabled: /oauth/authorize (Flow 1)") + # Add browser OAuth login routes (OAuth mode only) if oauth_enabled: from nextcloud_mcp_server.auth.browser_oauth_routes import ( diff --git a/third_party/astrolabe/appinfo/routes.php b/third_party/astrolabe/appinfo/routes.php index 37ca97f..60c2cc4 100644 --- a/third_party/astrolabe/appinfo/routes.php +++ b/third_party/astrolabe/appinfo/routes.php @@ -74,6 +74,16 @@ return [ ], // Admin settings routes + [ + 'name' => 'api#serverStatus', + 'url' => '/api/admin/server-status', + 'verb' => 'GET', + ], + [ + 'name' => 'api#adminVectorStatus', + 'url' => '/api/admin/vector-status', + 'verb' => 'GET', + ], [ 'name' => 'api#saveSearchSettings', 'url' => '/api/admin/search-settings', diff --git a/third_party/astrolabe/lib/Controller/ApiController.php b/third_party/astrolabe/lib/Controller/ApiController.php index af45f8c..78e856c 100644 --- a/third_party/astrolabe/lib/Controller/ApiController.php +++ b/third_party/astrolabe/lib/Controller/ApiController.php @@ -254,6 +254,54 @@ class ApiController extends Controller { ]); } + /** + * Get MCP server status. + * + * Admin-only endpoint for admin settings page. + * Returns server version, uptime, and vector sync availability. + * + * @return JSONResponse + */ + public function serverStatus(): JSONResponse { + $status = $this->client->getStatus(); + + if (isset($status['error'])) { + return new JSONResponse([ + 'success' => false, + 'error' => $status['error'] + ], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + return new JSONResponse([ + 'success' => true, + 'status' => $status + ]); + } + + /** + * Get vector sync status for admin. + * + * Admin-only endpoint for admin settings page. + * Returns indexing metrics and sync status. + * + * @return JSONResponse + */ + public function adminVectorStatus(): JSONResponse { + $status = $this->client->getVectorSyncStatus(); + + if (isset($status['error'])) { + return new JSONResponse([ + 'success' => false, + 'error' => $status['error'] + ], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + return new JSONResponse([ + 'success' => true, + 'status' => $status + ]); + } + /** * Save admin search settings. * diff --git a/third_party/astrolabe/lib/Settings/Admin.php b/third_party/astrolabe/lib/Settings/Admin.php index 529efd3..bcda1c6 100644 --- a/third_party/astrolabe/lib/Settings/Admin.php +++ b/third_party/astrolabe/lib/Settings/Admin.php @@ -47,11 +47,7 @@ class Admin implements ISettings { * @return TemplateResponse */ public function getForm(): TemplateResponse { - // Fetch data from MCP server - $serverStatus = $this->client->getStatus(); - $vectorSyncStatus = $this->client->getVectorSyncStatus(); - - // Get configuration from config.php + // Get configuration from config.php (local, fast) $serverUrl = $this->config->getSystemValue('mcp_server_url', ''); $apiKeyConfigured = !empty($this->config->getSystemValue('mcp_server_api_key', '')); $clientId = $this->config->getSystemValue('astrolabe_client_id', ''); @@ -59,21 +55,6 @@ class Admin implements ISettings { $clientSecret = $this->config->getSystemValue('astrolabe_client_secret', ''); $clientSecretConfigured = !empty($clientSecret); - // Check for server connection error - if (isset($serverStatus['error'])) { - return new TemplateResponse( - Application::APP_ID, - 'settings/error', - [ - 'error' => 'Cannot connect to MCP server', - 'details' => $serverStatus['error'], - 'server_url' => $serverUrl, - 'help_text' => 'Ensure MCP server is running and accessible. Check config.php for correct mcp_server_url.', - ], - TemplateResponse::RENDER_AS_BLANK - ); - } - // Load search settings from app config $searchSettings = [ 'algorithm' => $this->config->getAppValue( @@ -98,27 +79,19 @@ class Admin implements ISettings { ), ]; - // Provide initial state for Vue.js frontend (if needed) - $this->initialState->provideInitialState('server-data', [ - 'serverStatus' => $serverStatus, - 'vectorSyncStatus' => $vectorSyncStatus, + // Provide initial state for Vue.js frontend + // MCP server data will be fetched asynchronously by Vue component + $this->initialState->provideInitialState('admin-config', [ 'config' => [ 'serverUrl' => $serverUrl, 'apiKeyConfigured' => $apiKeyConfigured, + 'clientIdConfigured' => $clientIdConfigured, + 'clientSecretConfigured' => $clientSecretConfigured, ], 'searchSettings' => $searchSettings, ]); - $parameters = [ - 'serverStatus' => $serverStatus, - 'vectorSyncStatus' => $vectorSyncStatus, - 'serverUrl' => $serverUrl, - 'apiKeyConfigured' => $apiKeyConfigured, - 'clientIdConfigured' => $clientIdConfigured, - 'clientSecretConfigured' => $clientSecretConfigured, - 'vectorSyncEnabled' => $serverStatus['vector_sync_enabled'] ?? false, - 'searchSettings' => $searchSettings, - ]; + $parameters = []; return new TemplateResponse( Application::APP_ID, diff --git a/third_party/astrolabe/package-lock.json b/third_party/astrolabe/package-lock.json index 62b4e52..081dd54 100644 --- a/third_party/astrolabe/package-lock.json +++ b/third_party/astrolabe/package-lock.json @@ -10,6 +10,8 @@ "license": "AGPL-3.0-or-later", "dependencies": { "@nextcloud/axios": "^2.5.1", + "@nextcloud/dialogs": "^7.2.0", + "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.1.0", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0", @@ -23,8 +25,8 @@ "@nextcloud/browserslist-config": "3.1.2", "@nextcloud/eslint-config": "8.4.2", "@nextcloud/stylelint-config": "3.1.1", - "@nextcloud/vite-config": "1.7.2", "@vitejs/plugin-vue": "^6.0.3", + "sass-embedded": "^1.97.1", "terser": "5.44.1", "vite": "7.2.7" }, @@ -274,10 +276,16 @@ "node": ">=6.9.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@buttercup/fetch": { "version": "0.2.1", "license": "MIT", - "optional": true, "optionalDependencies": { "node-fetch": "^3.3.0" } @@ -1122,25 +1130,6 @@ "license": "BSD-3-Clause", "peer": true }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "dev": true, @@ -1196,131 +1185,11 @@ "license": "MIT", "peer": true }, - "node_modules/@microsoft/api-extractor": { - "version": "7.55.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.32.2", - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.1", - "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.5", - "@rushstack/ts-command-line": "5.1.5", - "diff": "~8.0.2", - "lodash": "~4.17.15", - "minimatch": "10.0.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.32.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.1" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "10.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.8.2", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.16.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" + "node_modules/@mdi/js": { + "version": "7.4.47", + "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz", + "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==", + "license": "Apache-2.0" }, "node_modules/@napi-rs/canvas": { "version": "0.1.84", @@ -1567,6 +1436,36 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, + "node_modules/@nextcloud/dialogs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-7.2.0.tgz", + "integrity": "sha512-seb2yYnGsP72t3aeK7WdcgfANpb/AHYc86Fz0kfzM11tvdqbs6Mz4Ja3bxccIJFXoyAp+NYS9UKpxA7bAQPywQ==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@mdi/js": "^7.4.47", + "@nextcloud/auth": "^2.5.3", + "@nextcloud/axios": "^2.5.2", + "@nextcloud/browser-storage": "^0.5.0", + "@nextcloud/event-bus": "^3.3.3", + "@nextcloud/files": "^3.12.2", + "@nextcloud/initial-state": "^3.0.0", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "@nextcloud/vue": "^9.3.1", + "@types/toastify-js": "^1.12.4", + "@vueuse/core": "^14.1.0", + "cancelable-promise": "^4.3.1", + "p-queue": "^9.0.1", + "toastify-js": "^1.12.0", + "vue": "^3.5.25", + "webdav": "^5.8.0" + }, + "engines": { + "node": "^20 || ^22 || ^24" + } + }, "node_modules/@nextcloud/eslint-config": { "version": "8.4.2", "dev": true, @@ -1644,15 +1543,16 @@ } }, "node_modules/@nextcloud/files": { - "version": "3.12.1", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", + "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", "license": "AGPL-3.0-or-later", - "optional": true, "dependencies": { "@nextcloud/auth": "^2.5.3", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^2.3.0", + "@nextcloud/paths": "^3.0.0", "@nextcloud/router": "^3.1.0", "@nextcloud/sharing": "^0.3.0", "cancelable-promise": "^4.3.1", @@ -1698,9 +1598,10 @@ } }, "node_modules/@nextcloud/paths": { - "version": "2.4.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-3.0.0.tgz", + "integrity": "sha512-+sTfTkIbVUa2Ue3bkz3R7F1mhddvHPOWUxkSNg7Q5dAsimVFBaTRgiBAJmsAag3JPsxyuS8kUgeb0zdEssRdTA==", "license": "GPL-3.0-or-later", - "optional": true, "engines": { "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } @@ -1755,76 +1656,6 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, - "node_modules/@nextcloud/vite-config": { - "version": "1.7.2", - "dev": true, - "license": "AGPL-3.0-or-later", - "dependencies": { - "@rollup/plugin-replace": "^6.0.2", - "@vitejs/plugin-vue2": "^2.3.4", - "browserslist-to-esbuild": "^2.1.1", - "magic-string": "^0.30.19", - "rollup-plugin-corejs": "^1.0.1", - "rollup-plugin-esbuild-minify": "^1.3.0", - "rollup-plugin-license": "^3.6.0", - "rollup-plugin-node-externals": "^8.1.1", - "spdx-expression-parse": "^4.0.0", - "vite-plugin-css-injected-by-js": "^3.5.2", - "vite-plugin-dts": "^4.5.4", - "vite-plugin-node-polyfills": "^0.24.0" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0", - "npm": "^10.5.1" - }, - "peerDependencies": { - "browserslist": ">=4.0", - "sass": ">=1.60", - "vite": "^7.1.10" - } - }, - "node_modules/@nextcloud/vite-config/node_modules/@vitejs/plugin-vue2": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.3.4.tgz", - "integrity": "sha512-LgqtRRedJb1KdmgcllwGX0gtlPvOvtR6pITXmqxGwQhBZaAysg0Hd7wvj3sjCsj4+PENWsqS7O+ceYSOgJ+H9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >= 16.0.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "vue": "^2.7.0-0" - } - }, - "node_modules/@nextcloud/vite-config/node_modules/@vue/compiler-sfc": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", - "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.23.5", - "postcss": "^8.4.14", - "source-map": "^0.6.1" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" - } - }, - "node_modules/@nextcloud/vite-config/node_modules/vue": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", - "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", - "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-sfc": "2.7.16", - "csstype": "^3.1.0" - } - }, "node_modules/@nextcloud/vue": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.3.1.tgz", @@ -1934,11 +1765,12 @@ }, "node_modules/@parcel/watcher": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -1981,7 +1813,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2003,7 +1834,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2025,7 +1855,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2047,7 +1876,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2069,7 +1897,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2091,7 +1918,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2113,7 +1939,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2135,7 +1960,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2146,6 +1970,8 @@ }, "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2155,7 +1981,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2166,6 +1991,8 @@ }, "node_modules/@parcel/watcher-linux-x64-musl": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2175,7 +2002,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2197,7 +2023,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2219,7 +2044,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2241,7 +2065,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -2257,68 +2080,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", @@ -2629,165 +2390,6 @@ "license": "MIT", "peer": true }, - "node_modules/@rushstack/node-core-library": { - "version": "5.19.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/terminal": { - "version": "0.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/node-core-library": "5.19.1", - "@rushstack/problem-matcher": "0.1.1", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/terminal/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "5.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/terminal": "0.19.5", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "license": "MIT" @@ -2804,11 +2406,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "dev": true, - "license": "MIT" - }, "node_modules/@types/debug": { "version": "4.1.12", "license": "MIT", @@ -2870,6 +2467,12 @@ "version": "2.3.10", "license": "MIT" }, + "node_modules/@types/toastify-js": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.4.tgz", + "integrity": "sha512-zfZHU4tKffPCnZRe7pjv/eFKzTVHozKewFCKaCjZ4gFinKgJRz/t0bkZiMCXJxPhv/ZoeDGNOeRD09R0kQZ/nw==", + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "license": "MIT", @@ -3399,29 +3002,6 @@ "vue": "^3.2.25" } }, - "node_modules/@volar/language-core": { - "version": "2.4.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.27" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.27", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.27", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.27", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, "node_modules/@vue/compiler-core": { "version": "3.5.26", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz", @@ -3484,15 +3064,6 @@ "@vue/shared": "3.5.26" } }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/@vue/devtools-api": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", @@ -3523,29 +3094,6 @@ } } }, - "node_modules/@vue/language-core": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@vue/reactivity": { "version": "3.5.26", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz", @@ -3698,47 +3246,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/alien-signals": { - "version": "0.4.14", - "dev": true, - "license": "MIT" - }, "node_modules/ansi-regex": { "version": "5.0.1", "dev": true, @@ -3792,14 +3299,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-includes": { "version": "3.1.9", "dev": true, @@ -3909,33 +3408,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1.js": { - "version": "4.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "dev": true, @@ -3962,6 +3434,7 @@ "version": "1.0.7", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3991,37 +3464,17 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "devOptional": true, "license": "MIT" }, "node_modules/base-64": { "version": "1.0.0", - "license": "MIT", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.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" - } - ], "license": "MIT" }, "node_modules/baseline-browser-mapping": { "version": "2.9.7", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "baseline-browser-mapping": "dist/cli.js" } @@ -4030,11 +3483,6 @@ "version": "2.0.5", "license": "MIT" }, - "node_modules/bn.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT" - }, "node_modules/boolbase": { "version": "1.0.0", "dev": true, @@ -4043,7 +3491,6 @@ }, "node_modules/brace-expansion": { "version": "2.0.2", - "devOptional": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4053,7 +3500,6 @@ "version": "3.0.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4061,130 +3507,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { "version": "4.28.1", "dev": true, @@ -4203,6 +3525,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4217,56 +3540,18 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserslist-to-esbuild": { - "version": "2.1.1", + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", "dev": true, - "license": "MIT", - "dependencies": { - "meow": "^13.0.0" - }, - "bin": { - "browserslist-to-esbuild": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "browserslist": "*" - } - }, - "node_modules/buffer": { - "version": "5.7.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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } + "license": "MIT/X11" }, "node_modules/buffer-from": { "version": "1.1.2", "dev": true, "license": "MIT" }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/builtin-modules": { "version": "3.3.0", "dev": true, @@ -4279,11 +3564,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/builtins": { "version": "5.1.0", "dev": true, @@ -4307,8 +3587,7 @@ }, "node_modules/byte-length": { "version": "1.0.2", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/cacheable": { "version": "2.3.0", @@ -4336,6 +3615,7 @@ "version": "1.0.8", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -4364,6 +3644,7 @@ "version": "1.0.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -4386,8 +3667,7 @@ }, "node_modules/cancelable-promise": { "version": "4.3.1", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/caniuse-lite": { "version": "1.0.30001760", @@ -4406,7 +3686,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "peer": true }, "node_modules/ccount": { "version": "2.0.1", @@ -4475,16 +3756,17 @@ "node_modules/charenc": { "version": "0.0.2", "license": "BSD-3-Clause", - "optional": true, "engines": { "node": "*" } }, "node_modules/chokidar": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -4495,19 +3777,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/cipher-base": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/clone": { "version": "2.1.2", "license": "MIT", @@ -4539,6 +3808,13 @@ "license": "MIT", "peer": true }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -4573,36 +3849,12 @@ "node": ">= 12.0.0" } }, - "node_modules/commenting": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, "license": "MIT", "peer": true }, - "node_modules/confbox": { - "version": "0.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "2.0.0", "dev": true, @@ -4618,23 +3870,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat": { - "version": "3.47.0", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "9.0.0", "dev": true, @@ -4661,50 +3896,6 @@ } } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "dev": true, @@ -4722,36 +3913,10 @@ "node_modules/crypt": { "version": "0.0.2", "license": "BSD-3-Clause", - "optional": true, "engines": { "node": "*" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/css-functions-list": { "version": "3.2.3", "dev": true, @@ -4795,7 +3960,6 @@ "node_modules/data-uri-to-buffer": { "version": "4.0.1", "license": "MIT", - "optional": true, "engines": { "node": ">= 12" } @@ -4861,11 +4025,6 @@ "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/de-indent": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/debounce": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", @@ -4914,6 +4073,7 @@ "version": "1.1.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4930,6 +4090,7 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -4956,21 +4117,13 @@ "node": ">=6" } }, - "node_modules/des.js": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/detect-libc": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, "license": "Apache-2.0", "optional": true, - "peer": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -4989,29 +4142,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/diff": { - "version": "8.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" - }, "node_modules/dir-glob": { "version": "3.0.1", "dev": true, @@ -5050,17 +4180,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/domain-browser": { - "version": "4.22.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "dev": true, @@ -5124,26 +4243,8 @@ "node_modules/electron-to-chromium": { "version": "1.5.267", "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" + "license": "ISC", + "peer": true }, "node_modules/emoji-mart-vue-fast": { "version": "15.0.5", @@ -5368,6 +4469,7 @@ "version": "3.2.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -5996,15 +5098,6 @@ "node": ">=4.0" } }, - "node_modules/estree-toolkit": { - "version": "1.7.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": ">=1.0.7", - "@types/estree-jsx": ">=1.0.5" - } - }, "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", @@ -6034,28 +5127,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, - "node_modules/events": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exsolve": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, "node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -6063,7 +5134,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-glob": { "version": "3.3.3", @@ -6118,11 +5190,11 @@ "url": "https://opencollective.com/fastify" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/fast-xml-parser": { "version": "4.5.3", - "devOptional": true, "funding": [ { "type": "github", @@ -6184,7 +5256,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -6209,7 +5280,6 @@ "version": "7.1.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6221,6 +5291,7 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6309,6 +5380,7 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-callable": "^1.2.7" }, @@ -6336,7 +5408,6 @@ "node_modules/formdata-polyfill": { "version": "4.0.10", "license": "MIT", - "optional": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -6344,19 +5415,6 @@ "node": ">=12.20.0" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6418,6 +5476,7 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -6652,11 +5711,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, "node_modules/graphemer": { "version": "1.4.0", "dev": true, @@ -6687,6 +5741,7 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -6732,27 +5787,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hashery": { "version": "1.3.0", "dev": true, @@ -6840,14 +5874,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/highlight.js": { "version": "11.11.1", "license": "BSD-3-Clause", @@ -6855,16 +5881,6 @@ "node": ">=12.0.0" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hookified": { "version": "1.14.0", "dev": true, @@ -6873,8 +5889,7 @@ }, "node_modules/hot-patcher": { "version": "2.0.1", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/html-tags": { "version": "3.3.1", @@ -6907,30 +5922,6 @@ "entities": "^4.4.0" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ieee754": { - "version": "1.2.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" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "dev": true, @@ -6942,9 +5933,10 @@ }, "node_modules/immutable": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", @@ -6962,14 +5954,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "dev": true, @@ -6992,7 +5976,8 @@ "node_modules/inherits": { "version": "2.0.4", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/ini": { "version": "1.3.8", @@ -7054,21 +6039,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "dev": true, @@ -7144,8 +6114,7 @@ }, "node_modules/is-buffer": { "version": "1.1.6", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/is-builtin-module": { "version": "3.2.1", @@ -7187,6 +6156,7 @@ "version": "1.2.7", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7198,6 +6168,7 @@ "version": "2.16.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -7255,7 +6226,6 @@ "version": "2.1.1", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -7288,6 +6258,7 @@ "version": "1.1.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", @@ -7306,7 +6277,6 @@ "version": "4.0.3", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7336,21 +6306,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.3", "dev": true, @@ -7367,7 +6322,6 @@ "version": "7.0.0", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.12.0" } @@ -7420,6 +6374,7 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -7510,6 +6465,7 @@ "version": "1.1.15", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "which-typed-array": "^1.1.16" }, @@ -7566,7 +6522,8 @@ "node_modules/isarray": { "version": "2.0.5", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/isexe": { "version": "2.0.0", @@ -7574,19 +6531,6 @@ "license": "ISC", "peer": true }, - "node_modules/isomorphic-timers-promises": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "dev": true, @@ -7662,17 +6606,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/keyv": { "version": "4.5.4", "dev": true, @@ -7697,15 +6630,9 @@ "license": "MIT", "peer": true }, - "node_modules/kolorist": { - "version": "1.8.0", - "dev": true, - "license": "MIT" - }, "node_modules/layerr": { "version": "3.0.0", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", @@ -7739,26 +6666,11 @@ "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", "license": "MIT" }, - "node_modules/local-pkg": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -7772,7 +6684,8 @@ "node_modules/lodash": { "version": "4.17.21", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -7866,23 +6779,12 @@ "node_modules/md5": { "version": "2.3.0", "license": "BSD-3-Clause", - "optional": true, "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/mdast-squeeze-paragraphs": { "version": "6.0.0", "license": "MIT", @@ -8092,6 +6994,7 @@ "version": "13.2.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -8512,7 +7415,6 @@ "version": "4.0.8", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8525,7 +7427,6 @@ "version": "2.3.1", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8.6" }, @@ -8533,23 +7434,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" - }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8567,19 +7451,8 @@ "node": ">= 0.6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/minimatch": { "version": "9.0.5", - "devOptional": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -8600,49 +7473,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mlly": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.1.3", "license": "MIT" }, - "node_modules/muggle-string": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.11", "funding": [ @@ -8682,15 +7516,15 @@ }, "node_modules/nested-property": { "version": "4.0.0", - "license": "MIT", - "optional": true + "license": "MIT" }, "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==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -8705,7 +7539,6 @@ } ], "license": "MIT", - "optional": true, "engines": { "node": ">=10.5.0" } @@ -8713,7 +7546,6 @@ "node_modules/node-fetch": { "version": "3.3.2", "license": "MIT", - "optional": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -8730,49 +7562,8 @@ "node_modules/node-releases": { "version": "2.0.27", "dev": true, - "license": "MIT" - }, - "node_modules/node-stdlib-browser": { - "version": "1.3.1", - "dev": true, "license": "MIT", - "dependencies": { - "assert": "^2.0.0", - "browser-resolve": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "create-require": "^1.1.1", - "crypto-browserify": "^3.12.1", - "domain-browser": "4.22.0", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "isomorphic-timers-promises": "^1.0.1", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "pkg-dir": "^5.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.1", - "url": "^0.11.4", - "util": "^0.12.4", - "vm-browserify": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-stdlib-browser/node_modules/punycode": { - "version": "1.4.1", - "dev": true, - "license": "MIT" + "peer": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -8799,21 +7590,7 @@ "version": "1.13.4", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8825,6 +7602,7 @@ "version": "1.1.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -8833,6 +7611,7 @@ "version": "4.1.7", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -8924,11 +7703,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "dev": true, - "license": "MIT" - }, "node_modules/own-keys": { "version": "1.0.1", "dev": true, @@ -8950,6 +7724,7 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8964,6 +7739,7 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -9002,22 +7778,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-name-regex": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/dword-design" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "dev": true, - "license": "(MIT AND Zlib)" - }, "node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -9030,21 +7790,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -9088,15 +7833,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9122,12 +7863,12 @@ "node_modules/path-parse": { "version": "1.0.7", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/path-posix": { "version": "1.0.0", - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/path-type": { "version": "4.0.0", @@ -9138,27 +7879,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/pdfjs-dist": { "version": "4.10.38", "license": "Apache-2.0", @@ -9184,27 +7904,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, "node_modules/plotly.js-dist-min": { "version": "2.35.3", "license": "MIT" @@ -9213,6 +7912,7 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -9346,37 +8046,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -9391,28 +8060,11 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "dev": true, - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9436,46 +8088,9 @@ "node": ">=20" } }, - "node_modules/qs": { - "version": "6.14.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -9497,41 +8112,13 @@ "license": "MIT", "peer": true }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "engines": { "node": ">= 14.18.0" }, @@ -9683,6 +8270,7 @@ "version": "2.0.2", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9698,13 +8286,13 @@ }, "node_modules/requires-port": { "version": "1.0.0", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.11", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -9772,69 +8360,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/rollup": { "version": "4.53.3", "dev": true, @@ -9875,80 +8400,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-corejs": { - "version": "1.0.2", - "dev": true, - "license": "EUPL-1.2", - "dependencies": { - "acorn": "^8.14.0", - "browserslist": "^4.26.3", - "core-js-compat": "^3.46.0", - "estree-toolkit": "^1.7.8", - "magic-string": "^0.30.19" - }, - "engines": { - "node": ">= 20.0.0" - }, - "peerDependencies": { - "rollup": "^3 || ^4" - } - }, - "node_modules/rollup-plugin-esbuild-minify": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.3" - }, - "engines": { - "node": ">= 14.18" - }, - "peerDependencies": { - "rollup": "^2 || ^3 || ^4" - } - }, - "node_modules/rollup-plugin-license": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commenting": "~1.1.0", - "fdir": "^6.4.3", - "lodash": "~4.17.21", - "magic-string": "~0.30.0", - "moment": "~2.30.1", - "package-name-regex": "~2.0.6", - "spdx-expression-validate": "~2.0.0", - "spdx-satisfies": "~5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/rollup-plugin-node-externals": { - "version": "8.1.2", - "dev": true, - "funding": [ - { - "type": "patreon", - "url": "https://patreon.com/Septh" - }, - { - "type": "paypal", - "url": "https://paypal.me/septh07" - } - ], - "license": "MIT", - "engines": { - "node": ">= 21 || ^20.6.0 || ^18.19.0" - }, - "peerDependencies": { - "rollup": "^4.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -9972,6 +8423,16 @@ "queue-microtask": "^1.2.2" } }, + "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": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.1.3", "dev": true, @@ -9991,25 +8452,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.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" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "dev": true, @@ -10030,6 +8472,7 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10043,10 +8486,12 @@ } }, "node_modules/sass": { - "version": "1.96.0", + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", + "integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -10062,6 +8507,371 @@ "@parcel/watcher": "^2.4.1" } }, + "node_modules/sass-embedded": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.1.tgz", + "integrity": "sha512-wH3CbOThHYGX0bUyqFf7laLKyhVWIFc2lHynitkqMIUCtX2ixH9mQh0bN7+hkUu5BFt/SXvEMjFbkEbBMpQiSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.97.1", + "sass-embedded-android-arm": "1.97.1", + "sass-embedded-android-arm64": "1.97.1", + "sass-embedded-android-riscv64": "1.97.1", + "sass-embedded-android-x64": "1.97.1", + "sass-embedded-darwin-arm64": "1.97.1", + "sass-embedded-darwin-x64": "1.97.1", + "sass-embedded-linux-arm": "1.97.1", + "sass-embedded-linux-arm64": "1.97.1", + "sass-embedded-linux-musl-arm": "1.97.1", + "sass-embedded-linux-musl-arm64": "1.97.1", + "sass-embedded-linux-musl-riscv64": "1.97.1", + "sass-embedded-linux-musl-x64": "1.97.1", + "sass-embedded-linux-riscv64": "1.97.1", + "sass-embedded-linux-x64": "1.97.1", + "sass-embedded-unknown-all": "1.97.1", + "sass-embedded-win32-arm64": "1.97.1", + "sass-embedded-win32-x64": "1.97.1" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.1.tgz", + "integrity": "sha512-0au5gUNibfob7W/g+ycBx74O22CL8vwHiZdEDY6J0uzMkHPiSJk//h0iRf5AUnMArFHJjFd3urIiQIaoRKYa1Q==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.97.1" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.1.tgz", + "integrity": "sha512-B5dlv4utJ+yC8ZpBeWTHwSZPVKRlqA8pcaD0FAzeNm/DelIFgQUQtt0UwgYoAI6wDIiie5uSVpMK9l2DaCbiBQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.1.tgz", + "integrity": "sha512-h62DmOiS2Jn87s8+8GhJcMerJnTKa1IsIa9iIKjLiqbAvBDKCGUs027RugZkM+Zx7I+vhPq86PUXBYZ9EkRxdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.1.tgz", + "integrity": "sha512-tGup88vgaXPnUHEgDMujrt5rfYadvkiVjRb/45FJTx2hQFoGVbmUXz5XqUFjIIbEjQ3kAJqp86A2jy11s43UiQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.1.tgz", + "integrity": "sha512-CAzKjjzu90LZduye2O9+UGX1oScMyF5/RVOa5CxACKALeIS+3XL3LVdV47kwKPoBv5B1aFUvGLscY0CR7jBAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.1.tgz", + "integrity": "sha512-tyDzspzh5PbqdAFGtVKUXuf0up6Lff3c1U8J7+4Y7jW6AWRBnq95vTzIIxfnNifGCTI2fW5e7GAZpYygKpNwcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.1.tgz", + "integrity": "sha512-FMrRuSPI2ICt2M2SYaLbiG4yxn86D6ae+XtrRdrrBMhWprAcB7Iyu67bgRzZkipMZNIKKeTR7EUvJHgZzi5ixQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.1.tgz", + "integrity": "sha512-48VxaTUApLyx1NXFdZhKqI/7FYLmz8Ju3Ki2V/p+mhn5raHgAiYeFgn8O1WGxTOh+hBb9y3FdSR5a8MNTbmKMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.1.tgz", + "integrity": "sha512-im80gfDWRivw9Su3r3YaZmJaCATcJgu3CsCSLodPk1b1R2+X/E12zEQayvrl05EGT9PDwTtuiqKgS4ND4xjwVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.1.tgz", + "integrity": "sha512-FUFs466t3PVViVOKY/60JgLLtl61Pf7OW+g5BeEfuqVcSvYUECVHeiYHtX1fT78PEVa0h9tHpM6XpWti+7WYFA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.1.tgz", + "integrity": "sha512-kD35WSD9o0279Ptwid3Jnbovo1FYnuG2mayYk9z4ZI4mweXEK6vTu+tlvCE/MdF/zFKSj11qaxaH+uzXe2cO5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.1.tgz", + "integrity": "sha512-ZgpYps5YHuhA2+KiLkPukRbS5298QObgUhPll/gm5i0LOZleKCwrFELpVPcbhsSBuxqji2uaag5OL+n3JRBVVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.1.tgz", + "integrity": "sha512-wcAigOyyvZ6o1zVypWV7QLZqpOEVnlBqJr9MbpnRIm74qFTSbAEmShoh8yMXBymzuVSmEbThxAwW01/TLf62tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.1.tgz", + "integrity": "sha512-9j1qE1ZrLMuGb+LUmBzw93Z4TNfqlRkkxjPVZy6u5vIggeSfvGbte7eRoYBNWX6SFew/yBCL90KXIirWFSGrlQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.1.tgz", + "integrity": "sha512-7nrLFYMH/UgvEgXR5JxQJ6y9N4IJmnFnYoDxN0nw0jUp+CQWQL4EJ4RqAKTGelneueRbccvt2sEyPK+X0KJ9Jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.1.tgz", + "integrity": "sha512-oPSeKc7vS2dx3ZJHiUhHKcyqNq0GWzAiR8zMVpPd/kVMl5ZfVyw+5HTCxxWDBGkX02lNpou27JkeBPCaneYGAQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.97.1" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.1.tgz", + "integrity": "sha512-L5j7J6CbZgHGwcfVedMVpM3z5MYeighcyZE8GF2DVmjWzZI3JtPKNY11wNTD/P9o1Uql10YPOKhGH0iWIXOT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.1.tgz", + "integrity": "sha512-rfaZAKXU8cW3E7gvdafyD6YtgbEcsDeT99OEiHXRT0UGFuXT8qCOjpAwIKaOA3XXr2d8S42xx6cXcaZ1a+1fgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/sax": { "version": "1.4.3", "license": "BlueOak-1.0.0" @@ -10079,6 +8889,7 @@ "version": "1.2.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -10120,30 +8931,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "dev": true, @@ -10169,6 +8956,7 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -10187,6 +8975,7 @@ "version": "1.0.0", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -10202,6 +8991,7 @@ "version": "1.0.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10219,6 +9009,7 @@ "version": "1.0.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10303,51 +9094,17 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-compare": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "node_modules/spdx-compare/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "dev": true, - "license": "CC-BY-3.0" + "license": "CC-BY-3.0", + "peer": true }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-expression-validate": { - "version": "2.0.0", - "dev": true, - "license": "(MIT AND CC-BY-3.0)", - "dependencies": { - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/spdx-expression-validate/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10356,31 +9113,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.22", "dev": true, - "license": "CC0-1.0" - }, - "node_modules/spdx-ranges": { - "version": "2.1.1", - "dev": true, - "license": "(MIT AND CC-BY-3.0)" - }, - "node_modules/spdx-satisfies": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "node_modules/spdx-satisfies/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } + "license": "CC0-1.0", + "peer": true }, "node_modules/splitpanes": { "version": "4.0.4", @@ -10394,11 +9128,6 @@ "vue": "^3.2.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/stable-hash": { "version": "0.0.5", "dev": true, @@ -10418,42 +9147,6 @@ "node": ">= 0.4" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -10563,6 +9256,7 @@ "version": "3.1.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -10576,7 +9270,6 @@ }, "node_modules/strnum": { "version": "1.1.2", - "devOptional": true, "funding": [ { "type": "github", @@ -10963,6 +9656,7 @@ "version": "1.0.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -10975,6 +9669,29 @@ "dev": true, "peer": true }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/tabbable": { "version": "6.3.0", "license": "MIT" @@ -11040,17 +9757,6 @@ "license": "MIT", "peer": true }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tinyglobby": { "version": "0.2.15", "dev": true, @@ -11066,24 +9772,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-buffer": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11091,6 +9783,12 @@ "node": ">=8.0" } }, + "node_modules/toastify-js": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", + "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==", + "license": "MIT" + }, "node_modules/tributejs": { "version": "5.1.3", "license": "MIT" @@ -11161,14 +9859,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "optional": true, - "peer": true - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "dev": true, - "license": "MIT" + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -11198,6 +9889,7 @@ "version": "1.0.3", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -11282,18 +9974,12 @@ }, "node_modules/typescript-event-target": { "version": "1.1.1", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/uc.micro": { "version": "2.1.0", "license": "MIT" }, - "node_modules/ufo": { - "version": "1.6.1", - "dev": true, - "license": "MIT" - }, "node_modules/unbox-primitive": { "version": "1.1.0", "dev": true, @@ -11410,14 +10096,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "dev": true, @@ -11470,6 +10148,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -11485,26 +10164,14 @@ "version": "4.4.1", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.4", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/url-join": { "version": "5.0.0", "license": "MIT", - "optional": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -11512,32 +10179,22 @@ "node_modules/url-parse": { "version": "1.5.10", "license": "MIT", - "optional": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, "license": "MIT" }, "node_modules/vfile": { @@ -11637,64 +10294,6 @@ } } }, - "node_modules/vite-plugin-css-injected-by-js": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vite": ">2.0.0-0" - } - }, - "node_modules/vite-plugin-dts": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor": "^7.50.1", - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.11", - "@vue/language-core": "2.2.0", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite-plugin-node-polyfills": { - "version": "0.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-inject": "^5.0.5", - "node-stdlib-browser": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/davidmyersdev" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/vue": { "version": "3.5.26", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", @@ -11829,7 +10428,6 @@ "node_modules/web-streams-polyfill": { "version": "3.3.3", "license": "MIT", - "optional": true, "engines": { "node": ">= 8" } @@ -11837,7 +10435,6 @@ "node_modules/webdav": { "version": "5.8.0", "license": "MIT", - "optional": true, "dependencies": { "@buttercup/fetch": "^0.2.1", "base-64": "^1.0.0", @@ -11861,7 +10458,6 @@ "node_modules/webdav/node_modules/entities": { "version": "6.0.1", "license": "BSD-2-Clause", - "optional": true, "engines": { "node": ">=0.12" }, @@ -11952,6 +10548,7 @@ "version": "1.1.19", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -12005,14 +10602,6 @@ "node": ">=12" } }, - "node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/yallist": { "version": "3.1.1", "dev": true, @@ -12023,6 +10612,7 @@ "version": "0.1.0", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, diff --git a/third_party/astrolabe/package.json b/third_party/astrolabe/package.json index a92c553..3afa91d 100644 --- a/third_party/astrolabe/package.json +++ b/third_party/astrolabe/package.json @@ -19,6 +19,8 @@ ], "dependencies": { "@nextcloud/axios": "^2.5.1", + "@nextcloud/dialogs": "^7.2.0", + "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.1.0", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^9.0.0", @@ -32,8 +34,8 @@ "@nextcloud/browserslist-config": "3.1.2", "@nextcloud/eslint-config": "8.4.2", "@nextcloud/stylelint-config": "3.1.1", - "@nextcloud/vite-config": "1.7.2", "@vitejs/plugin-vue": "^6.0.3", + "sass-embedded": "^1.97.1", "terser": "5.44.1", "vite": "7.2.7" } diff --git a/third_party/astrolabe/src/App.vue b/third_party/astrolabe/src/App.vue index f073912..2710539 100644 --- a/third_party/astrolabe/src/App.vue +++ b/third_party/astrolabe/src/App.vue @@ -48,10 +48,11 @@
+ :max="100" + @update:value="limit = Number($event)" />
@@ -152,9 +154,9 @@

{{ t('astrolabe', 'Vector Space Visualization') }}

+ @update:checked="showQueryPoint = $event; updatePlot()"> {{ t('astrolabe', 'Show query point') }}
diff --git a/third_party/astrolabe/src/adminSettings.js b/third_party/astrolabe/src/adminSettings.js index 84cde7f..ab2feed 100644 --- a/third_party/astrolabe/src/adminSettings.js +++ b/third_party/astrolabe/src/adminSettings.js @@ -1,245 +1,18 @@ /** - * Admin settings page JavaScript for Astrolabe. + * Admin settings page Vue app for Astrolabe. * - * Handles: - * - Loading webhook presets - * - Enabling/disabling webhook presets - * - Search settings form submission + * Mounts the AdminSettings Vue component for async loading + * and improved UX. */ -import { generateUrl } from '@nextcloud/router' -import axios from '@nextcloud/axios' -import './styles/settings.css' +import { createApp } from 'vue' +import { translate as t, translatePlural as n } from '@nextcloud/l10n' +import AdminSettings from './components/admin/AdminSettings.vue' -document.addEventListener('DOMContentLoaded', () => { - // Initialize search settings form - initSearchSettingsForm() +const app = createApp(AdminSettings) - // Initialize webhook management (only if webhook section exists) - if (document.getElementById('webhook-presets')) { - initWebhookManagement() - } -}) +// Add translation methods globally +app.config.globalProperties.t = t +app.config.globalProperties.n = n -/** - * Initialize search settings form handling. - */ -function initSearchSettingsForm() { - const form = document.getElementById('astrolabe-search-settings-form') - if (!form) return - - const scoreThresholdInput = document.getElementById('search-score-threshold') - const scoreThresholdValue = document.getElementById('score-threshold-value') - - // Update score threshold display when slider changes - if (scoreThresholdInput && scoreThresholdValue) { - scoreThresholdInput.addEventListener('input', (e) => { - scoreThresholdValue.textContent = e.target.value + '%' - }) - } - - // Handle form submission - form.addEventListener('submit', async (e) => { - e.preventDefault() - - const formData = new FormData(form) - const data = { - algorithm: formData.get('algorithm'), - fusion: formData.get('fusion'), - scoreThreshold: parseInt(formData.get('scoreThreshold')), - limit: parseInt(formData.get('limit')), - } - - const statusEl = document.getElementById('search-settings-status') - if (statusEl) { - statusEl.textContent = 'Saving...' - statusEl.className = 'mcp-status-message' - } - - try { - const response = await axios.post( - generateUrl('/apps/astrolabe/api/admin/search-settings'), - data, - { headers: { 'Content-Type': 'application/json' } }, - ) - - if (response.data.success) { - if (statusEl) { - statusEl.textContent = '✓ Settings saved' - statusEl.className = 'mcp-status-message success' - setTimeout(() => { - statusEl.textContent = '' - }, 3000) - } - } - } catch (error) { - console.error('Failed to save search settings:', error) - if (statusEl) { - statusEl.textContent = '✗ Failed to save' - statusEl.className = 'mcp-status-message error' - } - } - }) -} - -/** - * Initialize webhook management UI. - */ -async function initWebhookManagement() { - const container = document.getElementById('webhook-presets-container') - if (!container) return - - try { - // Load webhook presets from API - const response = await axios.get( - generateUrl('/apps/astrolabe/api/admin/webhooks/presets'), - ) - - if (!response.data.success) { - throw new Error(response.data.error || 'Failed to load presets') - } - - const presets = response.data.presets - renderWebhookPresets(container, presets) - } catch (error) { - console.error('Failed to load webhook presets:', error) - container.innerHTML = ` -
-

Error loading webhook presets:

-

${error.message || 'Unknown error'}

-
- ` - } -} - -/** - * Render webhook preset cards. - * - * @param {HTMLElement} container Container element - * @param {object} presets Preset configurations - */ -function renderWebhookPresets(container, presets) { - const presetIds = Object.keys(presets) - - if (presetIds.length === 0) { - container.innerHTML = ` -
-

No webhook presets available. Install supported apps (Notes, Calendar, Tables, Forms) to enable webhooks.

-
- ` - return - } - - // Create preset cards grid - const grid = document.createElement('div') - grid.className = 'mcp-preset-grid' - - presetIds.forEach(presetId => { - const preset = presets[presetId] - const card = createPresetCard(presetId, preset) - grid.appendChild(card) - }) - - container.innerHTML = '' - container.appendChild(grid) -} - -/** - * Create a webhook preset card. - * - * @param {string} presetId Preset ID - * @param {object} preset Preset configuration - * @return {HTMLElement} Card element - */ -function createPresetCard(presetId, preset) { - const card = document.createElement('div') - card.className = 'mcp-preset-card' - card.dataset.presetId = presetId - - const statusClass = preset.enabled ? 'enabled' : 'disabled' - const statusText = preset.enabled ? 'Enabled' : 'Disabled' - const buttonText = preset.enabled ? 'Disable' : 'Enable' - const buttonClass = preset.enabled ? 'secondary' : 'primary' - - card.innerHTML = ` -
-

${escapeHtml(preset.name)}

- ${statusText} -
-

${escapeHtml(preset.description)}

-
- App: ${escapeHtml(preset.app)} - ${preset.events.length} events -
-
- -
- ` - - // Attach event listener to toggle button - const toggleBtn = card.querySelector('.mcp-preset-toggle') - toggleBtn.addEventListener('click', () => togglePreset(presetId, preset.enabled)) - - return card -} - -/** - * Toggle a webhook preset (enable/disable). - * - * @param {string} presetId Preset ID - * @param {boolean} currentlyEnabled Current enabled state - */ -async function togglePreset(presetId, currentlyEnabled) { - const card = document.querySelector(`[data-preset-id="${presetId}"]`) - if (!card) return - - const toggleBtn = card.querySelector('.mcp-preset-toggle') - const originalText = toggleBtn.textContent - - // Disable button during request - toggleBtn.disabled = true - toggleBtn.textContent = currentlyEnabled ? 'Disabling...' : 'Enabling...' - - try { - const action = currentlyEnabled ? 'disable' : 'enable' - const url = generateUrl(`/apps/astrolabe/api/admin/webhooks/presets/${presetId}/${action}`) - - const response = await axios.post(url) - - if (!response.data.success) { - throw new Error(response.data.error || `Failed to ${action} preset`) - } - - // Reload presets to update UI - await initWebhookManagement() - - // Show success notification - OC.Notification.showTemporary(response.data.message || `Preset ${action}d successfully`) - } catch (error) { - console.error(`Failed to toggle preset ${presetId}:`, error) - - // Restore button state - toggleBtn.disabled = false - toggleBtn.textContent = originalText - - // Show error notification - OC.Notification.showTemporary( - error.message || 'Failed to toggle webhook preset', - { type: 'error' }, - ) - } -} - -/** - * Escape HTML to prevent XSS. - * - * @param {string} text Text to escape - * @return {string} Escaped text - */ -function escapeHtml(text) { - const div = document.createElement('div') - div.textContent = text - return div.innerHTML -} +app.mount('#astrolabe-admin-settings') diff --git a/third_party/astrolabe/src/components/MarkdownViewer.vue b/third_party/astrolabe/src/components/MarkdownViewer.vue index f25761d..3c0b36a 100644 --- a/third_party/astrolabe/src/components/MarkdownViewer.vue +++ b/third_party/astrolabe/src/components/MarkdownViewer.vue @@ -3,65 +3,52 @@
- diff --git a/third_party/astrolabe/templates/settings/admin.php b/third_party/astrolabe/templates/settings/admin.php index 64d4625..da80fd4 100644 --- a/third_party/astrolabe/templates/settings/admin.php +++ b/third_party/astrolabe/templates/settings/admin.php @@ -2,305 +2,14 @@ /** * Admin settings template for Astrolabe. * - * Displays semantic search service status, indexing metrics, configuration, - * and provides administrative controls. - * - * @var array $_ Template parameters - * @var array $_['serverStatus'] Server status from API - * @var array $_['vectorSyncStatus'] Vector sync metrics from API - * @var string $_['serverUrl'] Configured Astrolabe service URL - * @var bool $_['apiKeyConfigured'] Whether API key is set in config.php - * @var bool $_['vectorSyncEnabled'] Whether vector sync is enabled + * Mounts the Vue.js admin settings component for async loading + * and improved UX. */ script('astrolabe', 'astrolabe-adminSettings'); style('astrolabe', 'astrolabe-adminSettings'); ?> -
-

t('Astrolabe Administration')); ?>

- -
-

t('Monitor and configure the semantic search service for your Nextcloud instance.')); ?>

-

t('Use the "MCP Server Configuration" section above to configure the connection settings.')); ?>

-
- - -
-

t('Service Status')); ?>

- - - - - - - - - - - - - -
t('Version')); ?>
t('Uptime')); ?> - - - - t('Unknown')); ?> - -
t('Semantic Search')); ?> - - - - t('Enabled')); ?> - - - - t('Disabled')); ?> - - -
-
- - - -
-

t('Indexing Metrics')); ?>

- - - - - - - - - - - - - - - - - - - - - - - - - -
t('Status')); ?> - - - - -
t('Indexed Documents')); ?>
t('Pending Documents')); ?>
t('Last Sync')); ?>
t('Processing Rate')); ?>
t('Errors (24h)')); ?> - 0): ?> - - - - -
- -

- t('Metrics are updated in real-time. Refresh the page to see latest values.')); ?> -

-
- -
-

t('Indexing Metrics')); ?>

-
-

t('Failed to retrieve indexing status:')); ?>

-

-
-
- - - - -
-

t('AI Search Provider Settings')); ?>

-

- t('Configure the default search parameters for the AI Search provider in Nextcloud unified search.')); ?> -

- -
-
- - -

- t('Hybrid combines semantic understanding with keyword matching. Semantic finds conceptually similar content. BM25 matches exact keywords.')); ?> -

-
- -
- - -

- t('Only applies to hybrid search. RRF balances results well for most queries. DBSF may work better when keyword matches are over/under-weighted.')); ?> -

-
- -
- - -

- t('Filter out results below this relevance score. Set to 0 to show all results.')); ?> -

-
- -
- - -

- t('Maximum number of results to return per search query (5-100).')); ?> -

-
- -
- - -
-
-
- - - - - -
-

t('Webhook Management')); ?>

-

- t('Configure real-time synchronization for Nextcloud apps using webhooks. Webhooks provide instant updates to the MCP server when content changes.')); ?> -

- -
-
- t('Loading webhook presets...')); ?> -
-
- -
-

t('How Webhooks Work')); ?>

-
    -
  • t('Enable a preset to register webhooks for that app with the MCP server')); ?>
  • -
  • t('When content changes in Nextcloud, webhooks notify the MCP server instantly')); ?>
  • -
  • t('The MCP server updates its vector index in real-time for semantic search')); ?>
  • -
  • t('Disable a preset to stop receiving updates for that app')); ?>
  • -
-
- -
-

t('Requirements')); ?>

-
    -
  • t('The webhook_listeners app must be installed and enabled in Nextcloud')); ?>
  • -
  • t('The MCP server must be reachable from your Nextcloud instance')); ?>
  • -
  • t('You must have authorized Astrolabe with the MCP server (see Personal Settings)')); ?>
  • -
-
-
- - - -
-

t('Capabilities')); ?>

-
    -
  • - - t('Semantic Search')); ?> -

    t('Search by meaning across Notes, Files, Calendar, and Deck using natural language queries.')); ?>

    -
  • - -
  • - - t('Vector Visualization')); ?> -

    t('Explore content relationships in an interactive 2D visualization.')); ?>

    -
  • - -
  • - - t('Per-User Indexing')); ?> -

    t('Users control their own content indexing via Personal Settings.')); ?>

    -
  • -
  • - - t('Hybrid Search')); ?> -

    t('Combines semantic understanding with keyword matching for optimal results.')); ?>

    -
  • -
-
- - - +
+
diff --git a/third_party/astrolabe/vite.config.js b/third_party/astrolabe/vite.config.js index c294b43..4c579ae 100644 --- a/third_party/astrolabe/vite.config.js +++ b/third_party/astrolabe/vite.config.js @@ -5,7 +5,7 @@ import { resolve } from 'path' export default defineConfig({ plugins: [vue()], build: { - outDir: 'js', + outDir: '.', emptyOutDir: false, rollupOptions: { input: { @@ -14,9 +14,15 @@ export default defineConfig({ 'astrolabe-personalSettings': resolve(__dirname, 'src/personalSettings.js'), }, output: { - entryFileNames: '[name].mjs', - chunkFileNames: '[name]-[hash].chunk.mjs', - assetFileNames: '[name][extname]', + entryFileNames: 'js/[name].mjs', + chunkFileNames: 'js/[name]-[hash].chunk.mjs', + assetFileNames: (assetInfo) => { + // Output CSS to css/ directory, JS/other assets to js/ + if (assetInfo.name && assetInfo.name.endsWith('.css')) { + return 'css/[name][extname]'; + } + return 'js/[name][extname]'; + }, }, }, sourcemap: true,