@cryptotaxi247 / CoPilot / commits / 495dcb48

Copilot mcp (#479)

* feat: Add Copilot MCP integration with query endpoint and response models * feat: Implement example questions service and add endpoints for retrieving example questions and categories * feat: Add endpoints to retrieve available MCP servers and their details * chore: update frontend dependencies * feat: add copilot mcp api/types * chore: update frontend dependencies * feat: add chatbot components * feat: update chatbot components * refactor: secure LocalStorage * feat: update chatbot components * refactor: Healthcheck Store * feat: update chatbot components * feat: update chatbot components * refactor: chat bubble * refactor: markdown * refactor: highlighter * feat: update chatbot components * feat: implement MCP service for modular query handling and add Velociraptor server type * feat: add example questions and server info for Velociraptor integration * fix: update base URL for copilot-mcp service to correct endpoint testing * feat: add chat questions * fix: update shufflepy to version 0.1.8 and add singul version 0.1.8 to requirements * fix: add environment parameter to Singul integration execution * fix: update environment parameter in Singul integration to placeholder value * feat: add copilot-mcp service and configuration to docker-compose and environment files * chore: update frontend dependencies * lint * refactor: chat questions * refactor: chat query * feat: add edit message * lint * precommit-fixes * fix: update Docker image tags to use 'test' instead of 'latest' --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Jul 23, 2025 at 13:08 UTC 495dcb48f4dee057be12c3245668f4dc89355d68
57 files changed +2962 -1061
.env.example
+56
@@ -72,3 +72,59 @@ PORTAINER_URL=http://127.1.1.1:9000
72 PORTAINER_USERNAME=admin
73 PORTAINER_PASSWORD=admin
74 PORTAINER_ENDPOINT_ID=2
75 +
76 +# ! CoPilot MCP
77 +
78 +# OpenAI Configuration
79 +OPENAI_API_KEY=REPLACE_ME
80 +OPENAI_MODEL=gpt-4o
81 +
82 +# Application Configuration
83 +LOG_LEVEL=INFO
84 +
85 +# MCP Server Process Management
86 +MCP_SERVER_ENABLED=true
87 +
88 +# External OpenSearch Configuration
89 +OPENSEARCH_URL=https://your-wazuh-indexer-url:9200
90 +OPENSEARCH_USERNAME=YOUR_WAZUH_INDEXER_USERNAME
91 +OPENSEARCH_PASSWORD=YOUR_WAZUH_INDEXER_PASSWORD
92 +OPENSEARCH_SSL_VERIFY=false
93 +OPENSEARCH_SSL_SHOW_WARN=false
94 +
95 +# OpenSearch MCP Server Configuration
96 +MCP_OPENSEARCH_AUTH_TOKEN=secret-token
97 +
98 +# External MySQL Configuration
99 +MYSQL_ENABLED=true
100 +MYSQL_HOST=copilot-mysql
101 +MYSQL_PORT=3306
102 +MYSQL_USER=copilot
103 +MYSQL_PASSWORD=REPLACE_WITH_PASSWORD
104 +MYSQL_DATABASE=copilot
105 +
106 +# MySQL MCP Server Configuration
107 +MCP_MYSQL_AUTH_TOKEN=mysql-token
108 +MCP_MYSQL_SERVER_ENABLED=true
109 +
110 +# External Wazuh Configuration
111 +WAZUH_PROD_URL=https://your-wazuh-manager:55000
112 +WAZUH_PROD_USERNAME=wazuh-wui
113 +WAZUH_PROD_PASSWORD=wazuh-wui
114 +WAZUH_PROD_SSL_VERIFY=false
115 +WAZUH_PROD_TIMEOUT=30
116 +
117 +# Wazuh MCP Server Configuration
118 +MCP_WAZUH_AUTH_TOKEN=wazuh-token
119 +MCP_WAZUH_SERVER_ENABLED=true
120 +
121 +# External Velociraptor Configuration
122 +VELOCIRAPTOR_API_KEY=/app/velociraptor-config.yaml # Dont change this
123 +VELOCIRAPTOR_SSL_VERIFY=false
124 +VELOCIRAPTOR_TIMEOUT=30
125 +
126 +# Velociraptor MCP Server Configuration
127 +MCP_VELOCIRAPTOR_AUTH_TOKEN=velociraptor-token
128 +MCP_VELOCIRAPTOR_SERVER_ENABLED=true
129 +MCP_VELOCIRAPTOR_HOST=0.0.0.0
130 +MCP_VELOCIRAPTOR_PORT=8001
.github/workflows/docker.yml
+2 -2
@@ -27,7 +27,7 @@ jobs:
27 with:
28 context: ./backend
29 push: true
30 - tags: ghcr.io/socfortress/copilot-backend:latest
30 + tags: ghcr.io/socfortress/copilot-backend:test
31 build-args: |
32 COPILOT_API_KEY=${{ secrets.COPILOT_API_KEY }}
33
@@ -60,7 +60,7 @@ jobs:
60 with:
61 context: ./frontend
62 push: true
63 - tags: ghcr.io/socfortress/copilot-frontend:latest
63 + tags: ghcr.io/socfortress/copilot-frontend:test
64
65 - name: Notify Discord
66 uses: appleboy/discord-action@v1.0.0
.vscode/settings.json
+1
@@ -57,6 +57,7 @@
57 "SIEM",
58 "signin",
59 "Singul",
60 + "singulio",
61 "Socfortress",
62 "sparkline",
63 "Sysmon",
README.md
+3
@@ -92,6 +92,9 @@ wget https://raw.githubusercontent.com/socfortress/CoPilot/v0.1.2/docker-compose
92 # Create the path for storing your data
93 mkdir data
94
95 +# Create the path for copilot-mcp configuration
96 +mkdir -p data/copilot-mcp
97 +
98 # Create the .env file based on the .env.example
99 nano .env
100
backend/app/connectors/shuffle/services/singul.py
+1
@@ -27,6 +27,7 @@ async def execute_singul(
27 app=request.app,
28 action="send_message",
29 org_id=await get_shuffle_org_id(),
30 + environment="REPLACE_ME",
31 fields=[
32 {"key": "to", "value": "walton.taylor23@gmail.com"},
33 {"key": "subject", "value": "Test Email from Singul"},
backend/app/integrations/copilot_mcp/routes/copilot_mcp.py new
+207
@@ -0,0 +1,207 @@
1 +from typing import Optional
2 +
3 +from fastapi import APIRouter
4 +from fastapi import Query
5 +from fastapi import Security
6 +from loguru import logger
7 +
8 +from app.auth.routes.auth import AuthHandler
9 +from app.integrations.copilot_mcp.schema.copilot_mcp import AvailableMCPServersResponse
10 +from app.integrations.copilot_mcp.schema.copilot_mcp import ExampleQuestionsResponse
11 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPQueryRequest
12 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPQueryResponse
13 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPServerType
14 +from app.integrations.copilot_mcp.services.copilot_mcp import MCPService
15 +from app.integrations.copilot_mcp.services.example_questions import (
16 + ExampleQuestionsService,
17 +)
18 +
19 +copilot_mcp_router = APIRouter()
20 +auth_handler = AuthHandler()
21 +
22 +
23 +@copilot_mcp_router.get(
24 + "/servers",
25 + response_model=AvailableMCPServersResponse,
26 + description="Get list of available MCP servers",
27 + dependencies=[Security(AuthHandler().get_current_user, scopes=["admin"])],
28 +)
29 +async def get_available_mcp_servers() -> AvailableMCPServersResponse:
30 + """
31 + Retrieve a list of all available MCP servers with their capabilities.
32 +
33 + This endpoint provides information about all MCP servers that can be
34 + queried, including their descriptions and capabilities to help users
35 + understand what each server can do.
36 +
37 + Returns:
38 + AvailableMCPServersResponse: List of available MCP servers with metadata
39 + """
40 + logger.info("Fetching available MCP servers")
41 +
42 + try:
43 + servers = ExampleQuestionsService.get_available_servers()
44 +
45 + logger.info(f"Found {len(servers)} available MCP servers")
46 +
47 + return AvailableMCPServersResponse(
48 + servers=servers,
49 + total_servers=len(servers),
50 + message="Successfully retrieved available MCP servers",
51 + success=True,
52 + )
53 +
54 + except Exception as e:
55 + logger.error(f"Error fetching available MCP servers: {str(e)}")
56 + return AvailableMCPServersResponse(servers=[], total_servers=0, message=f"Error retrieving MCP servers: {str(e)}", success=False)
57 +
58 +
59 +@copilot_mcp_router.get(
60 + "/servers/{mcp_server}",
61 + response_model=dict,
62 + description="Get detailed information about a specific MCP server",
63 + dependencies=[Security(AuthHandler().get_current_user, scopes=["admin"])],
64 +)
65 +async def get_mcp_server_details(mcp_server: MCPServerType) -> dict:
66 + """
67 + Get detailed information about a specific MCP server.
68 +
69 + Args:
70 + mcp_server: The MCP server to get details for
71 +
72 + Returns:
73 + Dictionary containing detailed server information
74 + """
75 + logger.info(f"Fetching details for MCP server: {mcp_server.value}")
76 +
77 + try:
78 + server_info = ExampleQuestionsService.get_server_info(mcp_server)
79 +
80 + if not server_info:
81 + return {"server": mcp_server.value, "message": f"Server information not found for {mcp_server.value}", "success": False}
82 +
83 + # Get additional context like available categories and question count
84 + categories = ExampleQuestionsService.get_available_categories(mcp_server)
85 + total_questions = len(ExampleQuestionsService.get_example_questions(mcp_server))
86 +
87 + return {
88 + "server": server_info.dict(),
89 + "available_categories": categories,
90 + "total_example_questions": total_questions,
91 + "message": f"Successfully retrieved details for {mcp_server.value}",
92 + "success": True,
93 + }
94 +
95 + except Exception as e:
96 + logger.error(f"Error fetching details for {mcp_server.value}: {str(e)}")
97 + return {"server": mcp_server.value, "message": f"Error retrieving server details: {str(e)}", "success": False}
98 +
99 +
100 +@copilot_mcp_router.get(
101 + "/example-questions",
102 + response_model=ExampleQuestionsResponse,
103 + description="Get example questions for a specific MCP server",
104 + dependencies=[Security(AuthHandler().get_current_user, scopes=["admin"])],
105 +)
106 +async def get_example_questions(
107 + mcp_server: MCPServerType = Query(..., description="MCP server to get example questions for"),
108 + category: Optional[str] = Query(None, description="Filter questions by category"),
109 +) -> ExampleQuestionsResponse:
110 + """
111 + Retrieve example questions that users can ask for a specific MCP server.
112 +
113 + This endpoint provides users with sample queries they can use to interact
114 + with different MCP servers, helping them understand the capabilities and
115 + available operations for each server type.
116 +
117 + Args:
118 + mcp_server: The MCP server type to get questions for
119 + category: Optional category filter (e.g., 'alerts', 'agents', 'health')
120 +
121 + Returns:
122 + ExampleQuestionsResponse: List of example questions with metadata
123 + """
124 + logger.info(f"Fetching example questions for MCP server: {mcp_server.value}")
125 +
126 + try:
127 + # Get questions, optionally filtered by category
128 + if category:
129 + questions = ExampleQuestionsService.get_questions_by_category(mcp_server, category)
130 + logger.info(f"Found {len(questions)} questions in category '{category}' for {mcp_server.value}")
131 + else:
132 + questions = ExampleQuestionsService.get_example_questions(mcp_server)
133 + logger.info(f"Found {len(questions)} total questions for {mcp_server.value}")
134 +
135 + return ExampleQuestionsResponse(
136 + mcp_server=mcp_server,
137 + questions=questions,
138 + total_questions=len(questions),
139 + message=f"Successfully retrieved example questions for {mcp_server.value}",
140 + success=True,
141 + )
142 +
143 + except Exception as e:
144 + logger.error(f"Error fetching example questions for {mcp_server.value}: {str(e)}")
145 + return ExampleQuestionsResponse(
146 + mcp_server=mcp_server,
147 + questions=[],
148 + total_questions=0,
149 + message=f"Error retrieving example questions: {str(e)}",
150 + success=False,
151 + )
152 +
153 +
154 +@copilot_mcp_router.get(
155 + "/categories",
156 + description="Get available question categories for a specific MCP server",
157 + dependencies=[Security(AuthHandler().get_current_user, scopes=["admin"])],
158 +)
159 +async def get_question_categories(mcp_server: MCPServerType = Query(..., description="MCP server to get categories for")) -> dict:
160 + """
161 + Get available question categories for a specific MCP server.
162 +
163 + Args:
164 + mcp_server: The MCP server type to get categories for
165 +
166 + Returns:
167 + Dictionary containing the available categories
168 + """
169 + logger.info(f"Fetching question categories for MCP server: {mcp_server.value}")
170 +
171 + try:
172 + categories = ExampleQuestionsService.get_available_categories(mcp_server)
173 +
174 + return {
175 + "mcp_server": mcp_server.value,
176 + "categories": categories,
177 + "total_categories": len(categories),
178 + "message": f"Successfully retrieved categories for {mcp_server.value}",
179 + "success": True,
180 + }
181 +
182 + except Exception as e:
183 + logger.error(f"Error fetching categories for {mcp_server.value}: {str(e)}")
184 + return {
185 + "mcp_server": mcp_server.value,
186 + "categories": [],
187 + "total_categories": 0,
188 + "message": f"Error retrieving categories: {str(e)}",
189 + "success": False,
190 + }
191 +
192 +
193 +@copilot_mcp_router.post(
194 + "/query",
195 + description="Get all disabled rules",
196 + dependencies=[Security(AuthHandler().get_current_user, scopes=["admin"])],
197 +)
198 +async def query_mcp(request: MCPQueryRequest) -> MCPQueryResponse:
199 + """
200 + Process a query to the MCP agent and return structured response.
201 + """
202 + logger.info("Processing MCP query.")
203 +
204 + logger.info(f"Processing MCP query for server: {request.mcp_server.value}")
205 +
206 + # Use the modular service to execute the query
207 + return await MCPService.execute_query(request)
backend/app/integrations/copilot_mcp/schema/copilot_mcp.py new
+184
@@ -0,0 +1,184 @@
1 +from enum import Enum
2 +from typing import Any
3 +from typing import Dict
4 +from typing import List
5 +from typing import Optional
6 +
7 +from fastapi import HTTPException
8 +from pydantic import BaseModel
9 +from pydantic import Field
10 +from pydantic import validator
11 +
12 +
13 +class MCPServerType(str, Enum):
14 + """Enumeration of available MCP servers"""
15 +
16 + WAZUH_INDEXER = "wazuh-indexer"
17 + WAZUH_MANAGER = "wazuh-manager"
18 + COPILOT = "copilot"
19 + VELOCIRAPTOR = "velociraptor"
20 +
21 +
22 +class MCPServerConfig(BaseModel):
23 + """Configuration for MCP server connection"""
24 +
25 + name: str = Field(..., description="Name of the MCP server")
26 + transport: str = Field(default="sse", description="Transport type (sse, stdio)")
27 + url: Optional[str] = Field(
28 + default=None,
29 + description="URL for the MCP server endpoint (for sse transport)",
30 + )
31 + command: Optional[str] = Field(
32 + default=None,
33 + description="Command to run (for stdio transport)",
34 + )
35 + args: Optional[List[str]] = Field(
36 + default=None,
37 + description="Arguments for the command (for stdio transport)",
38 + )
39 + headers: Optional[Dict[str, str]] = Field(
40 + default=None,
41 + description="Headers for authentication",
42 + )
43 + env: Optional[Dict[str, str]] = Field(
44 + default=None,
45 + description="Environment variables for the process",
46 + )
47 +
48 +
49 +class MCPQuery(BaseModel):
50 + """Query request for MCP server"""
51 +
52 + input: str = Field(..., description="The query/input to send to the MCP server")
53 + server_name: str = Field(
54 + default="opensearch-mcp-server",
55 + description="Name of the MCP server to use",
56 + )
57 + verbose: bool = Field(default=True, description="Enable verbose output")
58 +
59 +
60 +class MCPQueryRequest(BaseModel):
61 + """Complete MCP query request"""
62 +
63 + input: str = Field(..., description="The query/input to send to the MCP server")
64 + mcp_server: MCPServerType = Field(..., description="MCP server to use for the query")
65 + verbose: Optional[bool] = Field(default=True, description="Enable verbose output")
66 +
67 + @validator("mcp_server", pre=True)
68 + def validate_mcp_server(cls, v):
69 + """Validate that the MCP server type is one of the allowed values"""
70 + if isinstance(v, str):
71 + # Check if the string value is valid
72 + valid_values = [server.value for server in MCPServerType]
73 + if v not in valid_values:
74 + raise HTTPException(status_code=400, detail=f"Invalid MCP server type: '{v}'. Must be one of: {', '.join(valid_values)}")
75 + return v
76 +
77 +
78 +class VulnerabilityInfo(BaseModel):
79 + """Structured vulnerability information"""
80 +
81 + agent_name: Optional[str] = Field(None, description="Name of the agent")
82 + vulnerability_id: Optional[str] = Field(
83 + None,
84 + description="Vulnerability identifier",
85 + )
86 + score: Optional[float] = Field(None, description="Vulnerability score")
87 + severity: Optional[str] = Field(None, description="Vulnerability severity level")
88 + description: Optional[str] = Field(None, description="Vulnerability description")
89 + cve_id: Optional[str] = Field(None, description="CVE identifier if available")
90 +
91 +
92 +class ClusterHealthInfo(BaseModel):
93 + """Structured cluster health information"""
94 +
95 + status: Optional[str] = Field(
96 + None,
97 + description="Cluster status (green, yellow, red)",
98 + )
99 + number_of_nodes: Optional[int] = Field(None, description="Total number of nodes")
100 + active_primary_shards: Optional[int] = Field(
101 + None,
102 + description="Number of active primary shards",
103 + )
104 + active_shards: Optional[int] = Field(
105 + None,
106 + description="Total number of active shards",
107 + )
108 + relocating_shards: Optional[int] = Field(
109 + None,
110 + description="Number of relocating shards",
111 + )
112 + initializing_shards: Optional[int] = Field(
113 + None,
114 + description="Number of initializing shards",
115 + )
116 + unassigned_shards: Optional[int] = Field(
117 + None,
118 + description="Number of unassigned shards",
119 + )
120 +
121 +
122 +class StructuredAgentResponse(BaseModel):
123 + """Structured response from the MCP agent with consistent format"""
124 +
125 + response: str = Field(
126 + ...,
127 + description="Human-readable response in markdown format - the main answer to the user's query",
128 + )
129 + thinking_process: Optional[str] = Field(
130 + None,
131 + description="Agent's step-by-step reasoning and exploration process",
132 + )
133 +
134 +
135 +class MCPQueryResponse(BaseModel):
136 + """Response from MCP query"""
137 +
138 + message: str
139 + success: bool
140 + result: Optional[Any] = Field(None, description="The result from the MCP agent")
141 + structured_result: Optional[StructuredAgentResponse] = Field(
142 + None,
143 + description="Structured response from agent",
144 + )
145 + execution_time: Optional[float] = Field(
146 + None,
147 + description="Time taken to execute the query",
148 + )
149 +
150 +
151 +class MCPServerInfo(BaseModel):
152 + """Information about an available MCP server"""
153 +
154 + name: str = Field(..., description="The server name/identifier")
155 + value: str = Field(..., description="The server enum value")
156 + description: str = Field(..., description="Description of what this server does")
157 + capabilities: List[str] = Field(default=[], description="List of server capabilities")
158 +
159 +
160 +class AvailableMCPServersResponse(BaseModel):
161 + """Response containing available MCP servers"""
162 +
163 + servers: List[MCPServerInfo] = Field(..., description="List of available MCP servers")
164 + total_servers: int = Field(..., description="Total number of available servers")
165 + message: str = Field(..., description="Response message")
166 + success: bool = Field(default=True, description="Whether the request was successful")
167 +
168 +
169 +class ExampleQuestion(BaseModel):
170 + """Single example question with metadata"""
171 +
172 + question: str = Field(..., description="The example question text")
173 + description: Optional[str] = Field(None, description="Brief description of what this question does")
174 + category: Optional[str] = Field(None, description="Category of the question (e.g., 'alerts', 'agents', 'health')")
175 +
176 +
177 +class ExampleQuestionsResponse(BaseModel):
178 + """Response containing example questions for a specific MCP server"""
179 +
180 + mcp_server: MCPServerType = Field(..., description="The MCP server these questions are for")
181 + questions: List[ExampleQuestion] = Field(..., description="List of example questions")
182 + total_questions: int = Field(..., description="Total number of example questions")
183 + message: str = Field(..., description="Response message")
184 + success: bool = Field(default=True, description="Whether the request was successful")
backend/app/integrations/copilot_mcp/services/copilot_mcp.py new
+131
@@ -0,0 +1,131 @@
1 +from typing import Dict
2 +
3 +import httpx
4 +from loguru import logger
5 +
6 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPQueryRequest
7 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPQueryResponse
8 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPServerType
9 +
10 +
11 +class MCPService:
12 + """Service for handling MCP queries with modular server routing"""
13 +
14 + # Define the mapping of MCP server types to their endpoint paths
15 + _SERVER_ENDPOINTS: Dict[MCPServerType, str] = {
16 + MCPServerType.WAZUH_INDEXER: "opensearch-query",
17 + MCPServerType.WAZUH_MANAGER: "wazuh-query",
18 + MCPServerType.COPILOT: "mysql-query",
19 + MCPServerType.VELOCIRAPTOR: "velociraptor-query",
20 + }
21 +
22 + # Base URL for the copilot-mcp service
23 + _BASE_URL = "http://copilot-mcp/mcp"
24 +
25 + @classmethod
26 + def get_endpoint_for_server(cls, mcp_server: MCPServerType) -> str:
27 + """
28 + Get the endpoint path for a specific MCP server type.
29 +
30 + Args:
31 + mcp_server: The MCP server type
32 +
33 + Returns:
34 + str: The endpoint path for the server
35 +
36 + Raises:
37 + ValueError: If the server type is not supported
38 + """
39 + endpoint = cls._SERVER_ENDPOINTS.get(mcp_server)
40 + if not endpoint:
41 + raise ValueError(f"Unsupported MCP server type: {mcp_server}")
42 + return endpoint
43 +
44 + @classmethod
45 + def build_full_url(cls, mcp_server: MCPServerType) -> str:
46 + """
47 + Build the full URL for a specific MCP server type.
48 +
49 + Args:
50 + mcp_server: The MCP server type
51 +
52 + Returns:
53 + str: The full URL for the server endpoint
54 + """
55 + endpoint = cls.get_endpoint_for_server(mcp_server)
56 + return f"{cls._BASE_URL}/{endpoint}"
57 +
58 + @classmethod
59 + async def execute_query(cls, data: MCPQueryRequest) -> MCPQueryResponse:
60 + """
61 + Execute a query on the appropriate MCP server based on the request.
62 +
63 + Args:
64 + data: The MCP query request containing the server type and query
65 +
66 + Returns:
67 + MCPQueryResponse: The response from the MCP server
68 +
69 + Raises:
70 + httpx.HTTPError: If the HTTP request fails
71 + ValueError: If the server type is not supported
72 + """
73 + try:
74 + # Get the full URL for the specified server
75 + full_url = cls.build_full_url(data.mcp_server)
76 +
77 + logger.info(f"Sending MCP query to {data.mcp_server.value} at {full_url}")
78 + logger.debug(f"Query data: {data.dict()}")
79 +
80 + async with httpx.AsyncClient() as client:
81 + response = await client.post(
82 + full_url,
83 + json=data.dict(),
84 + timeout=120,
85 + )
86 +
87 + # Raise an exception for HTTP error status codes
88 + response.raise_for_status()
89 +
90 + logger.info(f"Successfully received response from {data.mcp_server.value}")
91 + return MCPQueryResponse(**response.json())
92 +
93 + except ValueError as e:
94 + logger.error(f"Invalid server type: {str(e)}")
95 + return MCPQueryResponse(message=f"Error: {str(e)}", success=False, result=None, structured_result=None, execution_time=0.0)
96 +
97 + except httpx.HTTPError as e:
98 + logger.error(f"HTTP error when querying {data.mcp_server.value}: {str(e)}")
99 + return MCPQueryResponse(
100 + message=f"HTTP error when querying {data.mcp_server.value}: {str(e)}",
101 + success=False,
102 + result=None,
103 + structured_result=None,
104 + execution_time=0.0,
105 + )
106 +
107 + except Exception as e:
108 + logger.error(f"Unexpected error when querying {data.mcp_server.value}: {str(e)}")
109 + return MCPQueryResponse(
110 + message=f"Unexpected error: {str(e)}",
111 + success=False,
112 + result=None,
113 + structured_result=None,
114 + execution_time=0.0,
115 + )
116 +
117 +
118 +# Convenience function to maintain backward compatibility
119 +async def post_to_copilot_mcp(data: MCPQueryRequest) -> MCPQueryResponse:
120 + """
121 + Send a POST request to the appropriate copilot-mcp endpoint based on server type.
122 +
123 + This function maintains backward compatibility while using the new modular service.
124 +
125 + Args:
126 + data: The MCP query request
127 +
128 + Returns:
129 + MCPQueryResponse: The response from the MCP server
130 + """
131 + return await MCPService.execute_query(data)
backend/app/integrations/copilot_mcp/services/example_questions.py new
+315
@@ -0,0 +1,315 @@
1 +from typing import Dict
2 +from typing import List
3 +
4 +from app.integrations.copilot_mcp.schema.copilot_mcp import ExampleQuestion
5 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPServerInfo
6 +from app.integrations.copilot_mcp.schema.copilot_mcp import MCPServerType
7 +
8 +
9 +class ExampleQuestionsService:
10 + """Service for managing example questions for different MCP servers"""
11 +
12 + # Define example questions for each MCP server type
13 + _EXAMPLE_QUESTIONS: Dict[MCPServerType, List[ExampleQuestion]] = {
14 + MCPServerType.COPILOT: [
15 + ExampleQuestion(
16 + question="How many alerts do I have for customerA?",
17 + description="Get the total count of alerts for a specific customer",
18 + category="alerts",
19 + ),
20 + ExampleQuestion(
21 + question="What customer has the highest number of alerts?",
22 + description="Find the customer with the most alerts in the system",
23 + category="alerts",
24 + ),
25 + ExampleQuestion(
26 + question="Show me the latest critical alerts from the past 24 hours",
27 + description="Retrieve recent high-priority security alerts",
28 + category="alerts",
29 + ),
30 + ExampleQuestion(
31 + question="What are the top 5 most common alert types?",
32 + description="Analyze alert patterns to identify frequent security events",
33 + category="analytics",
34 + ),
35 + ExampleQuestion(
36 + question="How many active customers do we have?",
37 + description="Get the count of currently active customers in the system",
38 + category="customers",
39 + ),
40 + ExampleQuestion(
41 + question="Show me incident trends for the past week",
42 + description="Display incident statistics and trends over time",
43 + category="incidents",
44 + ),
45 + ],
46 + MCPServerType.WAZUH_MANAGER: [
47 + ExampleQuestion(
48 + question="What is the status of agent endpoint123?",
49 + description="Check the current operational status of a specific Wazuh agent",
50 + category="agents",
51 + ),
52 + ExampleQuestion(
53 + question="What are the open ports on endpoint123?",
54 + description="List all open network ports detected on a specific endpoint",
55 + category="network",
56 + ),
57 + ExampleQuestion(
58 + question="What software is installed on endpoint123?",
59 + description="Get inventory of installed software packages on an endpoint",
60 + category="inventory",
61 + ),
62 + ExampleQuestion(
63 + question="Show me all disconnected agents",
64 + description="List agents that are currently offline or disconnected",
65 + category="agents",
66 + ),
67 + ExampleQuestion(
68 + question="What are the latest security events from agent endpoint123?",
69 + description="Retrieve recent security events and alerts from a specific agent",
70 + category="security",
71 + ),
72 + ExampleQuestion(
73 + question="How many agents are currently online?",
74 + description="Get the count of active and connected Wazuh agents",
75 + category="agents",
76 + ),
77 + ExampleQuestion(
78 + question="What vulnerabilities were detected on endpoint123?",
79 + description="List security vulnerabilities found during scans",
80 + category="vulnerabilities",
81 + ),
82 + ],
83 + MCPServerType.WAZUH_INDEXER: [
84 + ExampleQuestion(
85 + question="What is the cluster health status?",
86 + description="Check the overall health and status of the Wazuh indexer cluster",
87 + category="health",
88 + ),
89 + ExampleQuestion(
90 + question="How many documents are indexed today?",
91 + description="Get the count of new documents added to the index",
92 + category="indexing",
93 + ),
94 + ExampleQuestion(
95 + question="What are the most frequent log sources?",
96 + description="Analyze which systems are generating the most log data",
97 + category="analytics",
98 + ),
99 + ExampleQuestion(
100 + question="Show me index storage usage statistics",
101 + description="Display disk usage and storage metrics for indices",
102 + category="storage",
103 + ),
104 + ExampleQuestion(
105 + question="What indices have the highest document count?",
106 + description="List indices sorted by number of documents",
107 + category="indexing",
108 + ),
109 + ExampleQuestion(
110 + question="Are there any failed index operations?",
111 + description="Check for indexing errors or failed operations",
112 + category="errors",
113 + ),
114 + ],
115 + MCPServerType.VELOCIRAPTOR: [
116 + ExampleQuestion(
117 + question="Show me all running processes on endpoint DESKTOP-ABC123",
118 + description="List all currently running processes on a specific endpoint",
119 + category="processes",
120 + ),
121 + ExampleQuestion(
122 + question="What files were created in the last 24 hours on endpoint DESKTOP-ABC123?",
123 + description="Find recently created files on a specific endpoint for forensic analysis",
124 + category="filesystem",
125 + ),
126 + ExampleQuestion(
127 + question="List all network connections on endpoint DESKTOP-ABC123",
128 + description="Display active and recent network connections from an endpoint",
129 + category="network",
130 + ),
131 + ExampleQuestion(
132 + question="What artifacts are available for Windows.System.Users?",
133 + description="Show available user account artifacts and information",
134 + category="artifacts",
135 + ),
136 + ExampleQuestion(
137 + question="Hunt for suspicious PowerShell executions across all endpoints",
138 + description="Search for potentially malicious PowerShell activity across the fleet",
139 + category="hunting",
140 + ),
141 + ExampleQuestion(
142 + question="Show me the registry keys modified in the last week on endpoint DESKTOP-ABC123",
143 + description="Track registry changes for security investigation",
144 + category="registry",
145 + ),
146 + ExampleQuestion(
147 + question="What scheduled tasks exist on endpoint DESKTOP-ABC123?",
148 + description="List all scheduled tasks for persistence analysis",
149 + category="persistence",
150 + ),
151 + ExampleQuestion(
152 + question="Find all executables in the Downloads folder across all endpoints",
153 + description="Hunt for potentially suspicious executable files in user download directories",
154 + category="hunting",
155 + ),
156 + ExampleQuestion(
157 + question="Show me the startup programs on endpoint DESKTOP-ABC123",
158 + description="List programs that start automatically with the system",
159 + category="persistence",
160 + ),
161 + ExampleQuestion(
162 + question="What browser artifacts can I collect from endpoint DESKTOP-ABC123?",
163 + description="Gather web browser history, downloads, and other forensic artifacts",
164 + category="artifacts",
165 + ),
166 + ExampleQuestion(
167 + question="Hunt for indicators of lateral movement across the network",
168 + description="Search for signs of attackers moving between systems",
169 + category="hunting",
170 + ),
171 + ExampleQuestion(
172 + question="Show me all USB devices connected to endpoint DESKTOP-ABC123",
173 + description="List USB device connection history for investigation",
174 + category="hardware",
175 + ),
176 + ],
177 + }
178 +
179 + # Define server information with descriptions and capabilities
180 + _SERVER_INFO: Dict[MCPServerType, MCPServerInfo] = {
181 + MCPServerType.COPILOT: MCPServerInfo(
182 + name="CoPilot",
183 + value=MCPServerType.COPILOT.value,
184 + description="Query customer data, alerts, incidents, and analytics from the CoPilot platform",
185 + capabilities=[
186 + "Customer management queries",
187 + "Alert analysis and filtering",
188 + "Incident tracking and trends",
189 + "Security analytics and reporting",
190 + "Dashboard data retrieval",
191 + ],
192 + ),
193 + MCPServerType.WAZUH_MANAGER: MCPServerInfo(
194 + name="Wazuh Manager",
195 + value=MCPServerType.WAZUH_MANAGER.value,
196 + description="Interact with Wazuh Manager for agent management, security monitoring, and endpoint analysis",
197 + capabilities=[
198 + "Agent status monitoring",
199 + "Endpoint security scanning",
200 + "Software inventory management",
201 + "Network port analysis",
202 + "Vulnerability assessment",
203 + "Security event investigation",
204 + ],
205 + ),
206 + MCPServerType.WAZUH_INDEXER: MCPServerInfo(
207 + name="Wazuh Indexer",
208 + value=MCPServerType.WAZUH_INDEXER.value,
209 + description="Query the Wazuh Indexer for log analysis, search operations, and cluster health monitoring",
210 + capabilities=[
211 + "Log data search and analysis",
212 + "Index management and statistics",
213 + "Cluster health monitoring",
214 + "Document count and storage metrics",
215 + "Search performance analysis",
216 + "Data source analytics",
217 + ],
218 + ),
219 + MCPServerType.VELOCIRAPTOR: MCPServerInfo(
220 + name="Velociraptor",
221 + value=MCPServerType.VELOCIRAPTOR.value,
222 + description="Digital forensics and incident response platform for endpoint monitoring and threat hunting",
223 + capabilities=[
224 + "Live endpoint forensics",
225 + "Artifact collection and analysis",
226 + "Threat hunting across endpoints",
227 + "Process and network monitoring",
228 + "File system analysis",
229 + "Registry investigation",
230 + "Persistence mechanism detection",
231 + "Lateral movement hunting",
232 + "Browser artifact collection",
233 + "Hardware device tracking",
234 + ],
235 + ),
236 + }
237 +
238 + @classmethod
239 + def get_example_questions(cls, mcp_server: MCPServerType) -> List[ExampleQuestion]:
240 + """
241 + Get example questions for a specific MCP server type.
242 +
243 + Args:
244 + mcp_server: The MCP server type to get questions for
245 +
246 + Returns:
247 + List of example questions for the specified server
248 + """
249 + return cls._EXAMPLE_QUESTIONS.get(mcp_server, [])
250 +
251 + @classmethod
252 + def get_questions_by_category(cls, mcp_server: MCPServerType, category: str) -> List[ExampleQuestion]:
253 + """
254 + Get example questions for a specific MCP server type filtered by category.
255 +
256 + Args:
257 + mcp_server: The MCP server type to get questions for
258 + category: The category to filter by
259 +
260 + Returns:
261 + List of example questions filtered by category
262 + """
263 + all_questions = cls.get_example_questions(mcp_server)
264 + return [q for q in all_questions if q.category == category]
265 +
266 + @classmethod
267 + def get_available_categories(cls, mcp_server: MCPServerType) -> List[str]:
268 + """
269 + Get available categories for a specific MCP server type.
270 +
271 + Args:
272 + mcp_server: The MCP server type to get categories for
273 +
274 + Returns:
275 + List of unique categories available for the server
276 + """
277 + questions = cls.get_example_questions(mcp_server)
278 + categories = {q.category for q in questions if q.category}
279 + return sorted(list(categories))
280 +
281 + @classmethod
282 + def add_example_question(cls, mcp_server: MCPServerType, question: ExampleQuestion) -> None:
283 + """
284 + Add a new example question to a specific MCP server type.
285 +
286 + Args:
287 + mcp_server: The MCP server type to add the question to
288 + question: The example question to add
289 + """
290 + if mcp_server not in cls._EXAMPLE_QUESTIONS:
291 + cls._EXAMPLE_QUESTIONS[mcp_server] = []
292 + cls._EXAMPLE_QUESTIONS[mcp_server].append(question)
293 +
294 + @classmethod
295 + def get_available_servers(cls) -> List[MCPServerInfo]:
296 + """
297 + Get information about all available MCP servers.
298 +
299 + Returns:
300 + List of MCPServerInfo objects containing server details
301 + """
302 + return list(cls._SERVER_INFO.values())
303 +
304 + @classmethod
305 + def get_server_info(cls, mcp_server: MCPServerType) -> MCPServerInfo:
306 + """
307 + Get detailed information about a specific MCP server.
308 +
309 + Args:
310 + mcp_server: The MCP server type to get information for
311 +
312 + Returns:
313 + MCPServerInfo object with server details
314 + """
315 + return cls._SERVER_INFO.get(mcp_server)
backend/app/routers/copilot_mcp.py new
+13
@@ -0,0 +1,13 @@
1 +from fastapi import APIRouter
2 +
3 +from app.integrations.copilot_mcp.routes.copilot_mcp import copilot_mcp_router
4 +
5 +# Instantiate the APIRouter
6 +router = APIRouter()
7 +
8 +# Include the Crowdstrike related routes
9 +router.include_router(
10 + copilot_mcp_router,
11 + prefix="/copilot_mcp",
12 + tags=["Copilot MCP"],
13 +)
backend/copilot.py
+2
@@ -38,6 +38,7 @@ from app.routers import bitdefender
38 from app.routers import carbonblack
39 from app.routers import cato
40 from app.routers import connectors
41 +from app.routers import copilot_mcp
42 from app.routers import cortex
43 from app.routers import crowdstrike
44 from app.routers import customer_provisioning
@@ -144,6 +145,7 @@ api_router.include_router(threat_intel.router)
145 api_router.include_router(alert_creation_settings.router)
146 api_router.include_router(integrations.router)
147 api_router.include_router(office365.router)
148 +api_router.include_router(copilot_mcp.router)
149 api_router.include_router(mimecast.router)
150 api_router.include_router(scheduler.router)
151 api_router.include_router(monitoring_alert.router)
backend/requirements.txt
+2 -1
@@ -145,8 +145,9 @@ rich==13.6.0
145 rsa==4.9
146 ScoutSuite==5.14.0
147 setuptools==65.5.0
148 -shufflepy==0.1.6
148 +shufflepy==0.1.8
149 simplejson==3.19.1
150 +singul==0.1.8
151 six==1.16.0
152 sniffio==1.3.0
153 SQLAlchemy==1.4.41
docker-compose.yml
+77
@@ -13,6 +13,7 @@ services:
13 env_file: .env
14 depends_on:
15 - copilot-mysql
16 + - copilot-mcp
17 restart: always
18
19 copilot-frontend:
@@ -53,6 +54,82 @@ services:
54 image: ghcr.io/socfortress/copilot-nuclei-module:latest
55 restart: always
56
57 + copilot-mcp:
58 + image: ghcr.io/socfortress/copilot-mcp:latest
59 + volumes:
60 + # Mount the Velociraptor config file from host into container
61 + - ./data/copilot-mcp/api.config.yaml:/app/velociraptor-config.yaml:ro
62 + environment:
63 + # Core OpenAI Configuration
64 + - OPENAI_API_KEY=${OPENAI_API_KEY}
65 + - OPENAI_MODEL=${OPENAI_MODEL:-gpt-4o}
66 +
67 + # Application Configuration
68 + - APP_HOST=0.0.0.0
69 + - APP_PORT=80
70 + - LOG_LEVEL=${LOG_LEVEL:-INFO}
71 +
72 + # MCP Server Process Management
73 + - MCP_SERVER_ENABLED=${MCP_SERVER_ENABLED:-true}
74 + - MCP_SERVER_HOST=0.0.0.0
75 + - MCP_SERVER_PORT=9900
76 +
77 + # External OpenSearch Configuration
78 + - OPENSEARCH_URL=${OPENSEARCH_URL:-${WAZUH_INDEXER_URL}}
79 + - OPENSEARCH_USERNAME=${OPENSEARCH_USERNAME:-${WAZUH_INDEXER_USERNAME}}
80 + - OPENSEARCH_PASSWORD=${OPENSEARCH_PASSWORD:-${WAZUH_INDEXER_PASSWORD}}
81 + - OPENSEARCH_SSL_VERIFY=${OPENSEARCH_SSL_VERIFY:-false}
82 + - OPENSEARCH_SSL_SHOW_WARN=${OPENSEARCH_SSL_SHOW_WARN:-false}
83 +
84 + # OpenSearch MCP Server Configuration
85 + - MCP_OPENSEARCH_URL=http://copilot-mcp:9900/sse
86 + - MCP_OPENSEARCH_AUTH_TOKEN=${MCP_OPENSEARCH_AUTH_TOKEN:-secret-token}
87 +
88 + # External MySQL Configuration
89 + - MYSQL_ENABLED=${MYSQL_ENABLED:-true}
90 + - MYSQL_HOST=${MYSQL_HOST:-copilot-mysql}
91 + - MYSQL_PORT=${MYSQL_PORT:-3306}
92 + - MYSQL_USER=${MYSQL_USER}
93 + - MYSQL_PASSWORD=${MYSQL_PASSWORD}
94 + - MYSQL_DATABASE=${MYSQL_DATABASE:-copilot}
95 +
96 + # MySQL MCP Server Configuration
97 + - MCP_MYSQL_URL=http://copilot-mcp:9901/sse
98 + - MCP_MYSQL_AUTH_TOKEN=${MCP_MYSQL_AUTH_TOKEN:-mysql-token}
99 + - MCP_MYSQL_SERVER_ENABLED=${MCP_MYSQL_SERVER_ENABLED:-true}
100 + - MCP_MYSQL_SERVER_HOST=0.0.0.0
101 + - MCP_MYSQL_SERVER_PORT=9901
102 +
103 + # External Wazuh Configuration
104 + - WAZUH_PROD_URL=${WAZUH_PROD_URL:-${WAZUH_MANAGER_URL}}
105 + - WAZUH_PROD_USERNAME=${WAZUH_PROD_USERNAME:-${WAZUH_MANAGER_USERNAME}}
106 + - WAZUH_PROD_PASSWORD=${WAZUH_PROD_PASSWORD:-${WAZUH_MANAGER_PASSWORD}}
107 + - WAZUH_PROD_SSL_VERIFY=${WAZUH_PROD_SSL_VERIFY:-false}
108 + - WAZUH_PROD_TIMEOUT=${WAZUH_PROD_TIMEOUT:-30}
109 +
110 + # Wazuh MCP Server Configuration
111 + - MCP_WAZUH_URL=http://copilot-mcp:8000/sse
112 + - MCP_WAZUH_AUTH_TOKEN=${MCP_WAZUH_AUTH_TOKEN:-wazuh-token}
113 + - MCP_WAZUH_SERVER_ENABLED=${MCP_WAZUH_SERVER_ENABLED:-true}
114 + - MCP_WAZUH_HOST=0.0.0.0
115 + - MCP_WAZUH_PORT=8000
116 +
117 + # External Velociraptor Configuration
118 + - VELOCIRAPTOR_API_KEY=/app/velociraptor-config.yaml
119 + - VELOCIRAPTOR_SSL_VERIFY=${VELOCIRAPTOR_SSL_VERIFY:-false}
120 + - VELOCIRAPTOR_TIMEOUT=${VELOCIRAPTOR_TIMEOUT:-30}
121 +
122 + # Velociraptor MCP Server Configuration
123 + - MCP_VELOCIRAPTOR_URL=http://copilot-mcp:8001/sse
124 + - MCP_VELOCIRAPTOR_AUTH_TOKEN=${MCP_VELOCIRAPTOR_AUTH_TOKEN:-velociraptor-token}
125 + - MCP_VELOCIRAPTOR_SERVER_ENABLED=${MCP_VELOCIRAPTOR_SERVER_ENABLED:-true}
126 + - MCP_VELOCIRAPTOR_HOST=0.0.0.0
127 + - MCP_VELOCIRAPTOR_PORT=8001
128 +
129 + depends_on:
130 + - copilot-mysql
131 + restart: always
132 +
133 volumes:
134 mysql-data:
135
frontend/package.json
+13 -13
@@ -42,17 +42,17 @@
42 "@codemirror/lang-xml": "^6.1.0",
43 "@codemirror/lint": "^6.8.5",
44 "@codemirror/theme-one-dark": "^6.1.3",
45 - "@codemirror/view": "^6.38.0",
45 + "@codemirror/view": "^6.38.1",
46 "@f3ve/vue-markdown-it": "^0.2.3",
47 "@fontsource/jetbrains-mono": "^5.2.6",
48 "@fontsource/lexend": "^5.2.9",
49 "@fontsource/public-sans": "^5.2.6",
50 - "@shikijs/markdown-it": "^3.7.0",
50 + "@shikijs/markdown-it": "^3.8.1",
51 "@singulio/app-auth-search": "^0.0.3",
52 "@types/codemirror": "^5.60.16",
53 "@vueuse/core": "^13.5.0",
54 "@vueuse/motion": "^3.0.3",
55 - "axios": "^1.10.0",
55 + "axios": "^1.11.0",
56 "bytes": "^3.1.2",
57 "codemirror": "~6.0.2",
58 "colord": "^2.9.3",
@@ -62,7 +62,7 @@
62 "fast-xml-parser": "^5.2.5",
63 "file-saver": "^2.0.5",
64 "html-entities": "^2.6.0",
65 - "jose": "^6.0.11",
65 + "jose": "^6.0.12",
66 "js-md5": "^0.8.3",
67 "lodash": "^4.17.21",
68 "mitt": "^3.0.1",
@@ -72,14 +72,14 @@
72 "pinia": "^3.0.3",
73 "pinia-plugin-persistedstate": "^4.4.1",
74 "secure-ls": "^2.0.0",
75 - "shiki": "^3.7.0",
75 + "shiki": "^3.8.1",
76 "thememirror": "^2.0.1",
77 "validator": "^13.15.15",
78 - "vue": "^3.5.17",
78 + "vue": "^3.5.18",
79 "vue-advanced-cropper": "^2.8.9",
80 "vue-codemirror": "^6.1.1",
81 "vue-highlight-words": "^3.0.1",
82 - "vue-i18n": "^11.1.9",
82 + "vue-i18n": "^11.1.11",
83 "vue-router": "^4.5.1",
84 "vue-sjv": "^0.0.6",
85 "vue3-apexcharts": "^1.8.0",
@@ -89,12 +89,12 @@
89 "xmllint-wasm": "^5.0.0"
90 },
91 "optionalDependencies": {
92 - "@rollup/rollup-linux-x64-gnu": "^4.44.2",
92 + "@rollup/rollup-linux-x64-gnu": "^4.45.1",
93 "treemate": "^0.3.11",
94 "vueuc": "^0.4.64"
95 },
96 "devDependencies": {
97 - "@antfu/eslint-config": "^4.16.2",
97 + "@antfu/eslint-config": "^4.18.0",
98 "@clack/prompts": "^0.11.0",
99 "@iconify/vue": "^5.0.0",
100 "@tailwindcss/vite": "^4.1.11",
@@ -105,13 +105,13 @@
105 "@types/jsdom": "^21.1.7",
106 "@types/lodash": "^4.17.20",
107 "@types/markdown-it": "^14.1.2",
108 - "@types/node": "^24.0.13",
108 + "@types/node": "^24.1.0",
109 "@types/validator": "^13.15.2",
110 "@vitejs/plugin-vue": "^6.0.0",
111 "@vitejs/plugin-vue-jsx": "^5.0.1",
112 "@vue/test-utils": "^2.4.6",
113 "@vue/tsconfig": "^0.7.0",
114 - "cypress": "^14.5.1",
114 + "cypress": "^14.5.2",
115 "depcheck": "^1.4.7",
116 "eslint": "^9.31.0",
117 "flourite": "^1.3.0",
@@ -126,13 +126,13 @@
126 "taze": "^19.1.0",
127 "type-fest": "^4.41.0",
128 "typescript": "~5.8.3",
129 - "vite": "^7.0.4",
129 + "vite": "^7.0.5",
130 "vite-bundle-visualizer": "^1.2.1",
131 "vite-plugin-inspect": "^11.3.0",
132 "vite-plugin-vue-devtools": "^7.7.7",
133 "vite-svg-loader": "^5.1.0",
134 "vitest": "^3.2.4",
135 - "vue-tsc": "^3.0.1"
135 + "vue-tsc": "^3.0.3"
136 },
137 "pnpm": {
138 "overrides": {
frontend/pnpm-lock.yaml
+921 -946
@@ -6,7 +6,7 @@ settings:
6
7 overrides:
8 vite-plugin-checker>vite-plugin-inspect: ^11.3.0
9 - vite-plugin-inspect>vite: ^7.0.4
9 + vite-plugin-inspect>vite: ^7.0.5
10
11 importers:
12
@@ -31,11 +31,11 @@ importers:
31 specifier: ^6.1.3
32 version: 6.1.3
33 '@codemirror/view':
34 - specifier: ^6.38.0
35 - version: 6.38.0
34 + specifier: ^6.38.1
35 + version: 6.38.1
36 '@f3ve/vue-markdown-it':
37 specifier: ^0.2.3
38 - version: 0.2.3(vue@3.5.17(typescript@5.8.3))
38 + version: 0.2.3(vue@3.5.18(typescript@5.8.3))
39 '@fontsource/jetbrains-mono':
40 specifier: ^5.2.6
41 version: 5.2.6
@@ -46,8 +46,8 @@ importers:
46 specifier: ^5.2.6
47 version: 5.2.6
48 '@shikijs/markdown-it':
49 - specifier: ^3.7.0
50 - version: 3.7.0
49 + specifier: ^3.8.1
50 + version: 3.8.1
51 '@singulio/app-auth-search':
52 specifier: ^0.0.3
53 version: 0.0.3
@@ -56,13 +56,13 @@ importers:
56 version: 5.60.16
57 '@vueuse/core':
58 specifier: ^13.5.0
59 - version: 13.5.0(vue@3.5.17(typescript@5.8.3))
59 + version: 13.5.0(vue@3.5.18(typescript@5.8.3))
60 '@vueuse/motion':
61 specifier: ^3.0.3
62 - version: 3.0.3(vue@3.5.17(typescript@5.8.3))
62 + version: 3.0.3(vue@3.5.18(typescript@5.8.3))
63 axios:
64 - specifier: ^1.10.0
65 - version: 1.10.0(debug@4.4.1)
64 + specifier: ^1.11.0
65 + version: 1.11.0(debug@4.4.1)
66 bytes:
67 specifier: ^3.1.2
68 version: 3.1.2
@@ -91,8 +91,8 @@ importers:
91 specifier: ^2.6.0
92 version: 2.6.0
93 jose:
94 - specifier: ^6.0.11
95 - version: 6.0.11
94 + specifier: ^6.0.12
95 + version: 6.0.12
96 js-md5:
97 specifier: ^0.8.3
98 version: 0.8.3
@@ -104,7 +104,7 @@ importers:
104 version: 3.0.1
105 naive-ui:
106 specifier: ^2.42.0
107 - version: 2.42.0(vue@3.5.17(typescript@5.8.3))
107 + version: 2.42.0(vue@3.5.18(typescript@5.8.3))
108 nanoid:
109 specifier: ^5.1.5
110 version: 5.1.5
@@ -113,71 +113,71 @@ importers:
113 version: 5.3.0
114 pinia:
115 specifier: ^3.0.3
116 - version: 3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
116 + version: 3.0.3(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3))
117 pinia-plugin-persistedstate:
118 specifier: ^4.4.1
119 - version: 4.4.1(@nuxt/kit@3.17.6)(pinia@3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)))
119 + version: 4.4.1(@nuxt/kit@3.17.7)(pinia@3.0.3(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3)))
120 secure-ls:
121 specifier: ^2.0.0
122 version: 2.0.0
123 shiki:
124 - specifier: ^3.7.0
125 - version: 3.7.0
124 + specifier: ^3.8.1
125 + version: 3.8.1
126 thememirror:
127 specifier: ^2.0.1
128 - version: 2.0.1(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.0)
128 + version: 2.0.1(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)
129 validator:
130 specifier: ^13.15.15
131 version: 13.15.15
132 vue:
133 - specifier: ^3.5.17
134 - version: 3.5.17(typescript@5.8.3)
133 + specifier: ^3.5.18
134 + version: 3.5.18(typescript@5.8.3)
135 vue-advanced-cropper:
136 specifier: ^2.8.9
137 - version: 2.8.9(vue@3.5.17(typescript@5.8.3))
137 + version: 2.8.9(vue@3.5.18(typescript@5.8.3))
138 vue-codemirror:
139 specifier: ^6.1.1
140 - version: 6.1.1(codemirror@6.0.2)(vue@3.5.17(typescript@5.8.3))
140 + version: 6.1.1(codemirror@6.0.2)(vue@3.5.18(typescript@5.8.3))
141 vue-highlight-words:
142 specifier: ^3.0.1
143 - version: 3.0.1(vue@3.5.17(typescript@5.8.3))
143 + version: 3.0.1(vue@3.5.18(typescript@5.8.3))
144 vue-i18n:
145 - specifier: ^11.1.9
146 - version: 11.1.9(vue@3.5.17(typescript@5.8.3))
145 + specifier: ^11.1.11
146 + version: 11.1.11(vue@3.5.18(typescript@5.8.3))
147 vue-router:
148 specifier: ^4.5.1
149 - version: 4.5.1(vue@3.5.17(typescript@5.8.3))
149 + version: 4.5.1(vue@3.5.18(typescript@5.8.3))
150 vue-sjv:
151 specifier: ^0.0.6
152 - version: 0.0.6(vue@3.5.17(typescript@5.8.3))
152 + version: 0.0.6(vue@3.5.18(typescript@5.8.3))
153 vue3-apexcharts:
154 specifier: ^1.8.0
155 - version: 1.8.0(apexcharts@5.2.0)(vue@3.5.17(typescript@5.8.3))
155 + version: 1.8.0(apexcharts@5.3.1)(vue@3.5.18(typescript@5.8.3))
156 vue3-marquee:
157 specifier: ^4.2.2
158 - version: 4.2.2(vue@3.5.17(typescript@5.8.3))
158 + version: 4.2.2(vue@3.5.18(typescript@5.8.3))
159 vuedraggable:
160 specifier: ^4.1.0
161 - version: 4.1.0(vue@3.5.17(typescript@5.8.3))
161 + version: 4.1.0(vue@3.5.18(typescript@5.8.3))
162 xmllint:
163 specifier: ^0.1.1
164 version: 0.1.1
165 xmllint-wasm:
166 specifier: ^5.0.0
167 - version: 5.0.0(@types/node@24.0.13)
167 + version: 5.0.0(@types/node@24.1.0)
168 devDependencies:
169 '@antfu/eslint-config':
170 - specifier: ^4.16.2
171 - version: 4.16.2(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
170 + specifier: ^4.18.0
171 + version: 4.18.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
172 '@clack/prompts':
173 specifier: ^0.11.0
174 version: 0.11.0
175 '@iconify/vue':
176 specifier: ^5.0.0
177 - version: 5.0.0(vue@3.5.17(typescript@5.8.3))
177 + version: 5.0.0(vue@3.5.18(typescript@5.8.3))
178 '@tailwindcss/vite':
179 specifier: ^4.1.11
180 - version: 4.1.11(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
180 + version: 4.1.11(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
181 '@tsconfig/node20':
182 specifier: ^20.1.6
183 version: 20.1.6
@@ -200,32 +200,32 @@ importers:
200 specifier: ^14.1.2
201 version: 14.1.2
202 '@types/node':
203 - specifier: ^24.0.13
204 - version: 24.0.13
203 + specifier: ^24.1.0
204 + version: 24.1.0
205 '@types/validator':
206 specifier: ^13.15.2
207 version: 13.15.2
208 '@vitejs/plugin-vue':
209 specifier: ^6.0.0
210 - version: 6.0.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))
210 + version: 6.0.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))
211 '@vitejs/plugin-vue-jsx':
212 specifier: ^5.0.1
213 - version: 5.0.1(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))
213 + version: 5.0.1(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))
214 '@vue/test-utils':
215 specifier: ^2.4.6
216 version: 2.4.6
217 '@vue/tsconfig':
218 specifier: ^0.7.0
219 - version: 0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
219 + version: 0.7.0(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3))
220 cypress:
221 - specifier: ^14.5.1
222 - version: 14.5.1
221 + specifier: ^14.5.2
222 + version: 14.5.2
223 depcheck:
224 specifier: ^1.4.7
225 version: 1.4.7
226 eslint:
227 - specifier: ^9.30.1
228 - version: 9.30.1(jiti@2.4.2)
227 + specifier: ^9.31.0
228 + version: 9.31.0(jiti@2.4.2)
229 flourite:
230 specifier: ^1.3.0
231 version: 1.3.0
@@ -263,100 +263,100 @@ importers:
263 specifier: ~5.8.3
264 version: 5.8.3
265 vite:
266 - specifier: ^7.0.4
267 - version: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
266 + specifier: ^7.0.5
267 + version: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
268 vite-bundle-visualizer:
269 specifier: ^1.2.1
270 - version: 1.2.1(rollup@4.44.2)
270 + version: 1.2.1(rollup@4.45.1)
271 vite-plugin-inspect:
272 specifier: ^11.3.0
273 - version: 11.3.0(@nuxt/kit@3.17.6)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
273 + version: 11.3.0(@nuxt/kit@3.17.7)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
274 vite-plugin-vue-devtools:
275 specifier: ^7.7.7
276 - version: 7.7.7(@nuxt/kit@3.17.6)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))
276 + version: 7.7.7(@nuxt/kit@3.17.7)(rollup@4.45.1)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))
277 vite-svg-loader:
278 specifier: ^5.1.0
279 - version: 5.1.0(vue@3.5.17(typescript@5.8.3))
279 + version: 5.1.0(vue@3.5.18(typescript@5.8.3))
280 vitest:
281 specifier: ^3.2.4
282 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
282 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
283 vue-tsc:
284 - specifier: ^3.0.1
285 - version: 3.0.1(typescript@5.8.3)
284 + specifier: ^3.0.3
285 + version: 3.0.3(typescript@5.8.3)
286 optionalDependencies:
287 '@rollup/rollup-linux-x64-gnu':
288 - specifier: ^4.44.2
289 - version: 4.44.2
288 + specifier: ^4.45.1
289 + version: 4.45.1
290 treemate:
291 specifier: ^0.3.11
292 version: 0.3.11
293 vueuc:
294 specifier: ^0.4.64
295 - version: 0.4.64(vue@3.5.17(typescript@5.8.3))
295 + version: 0.4.64(vue@3.5.18(typescript@5.8.3))
296
297 packages:
298
299 '@ajoelp/json-to-formdata@1.5.0':
300 resolution: {integrity: sha512-nrlfeTSL0X0dtx5r2KpzPiqLSIQquiiJjUKsQAKzWaCmO2QoYZCyb5ENZwF3YoffKronOCJr25mxaD8JRJmK8w==}
301
302 - '@algolia/client-abtesting@5.32.0':
303 - resolution: {integrity: sha512-HG/6Eib6DnJYm/B2ijWFXr4txca/YOuA4K7AsEU0JBrOZSB+RU7oeDyNBPi3c0v0UDDqlkBqM3vBU/auwZlglA==}
302 + '@algolia/client-abtesting@5.34.1':
303 + resolution: {integrity: sha512-M4zb6J7q+pg9V9Xk0k1WDgvupfCtXcxjKGTrNVYemiredLVGOmvVIPAUjg2rx4QmK7DWNApWLsieYwk7PAaOXw==}
304 engines: {node: '>= 14.0.0'}
305
306 - '@algolia/client-analytics@5.32.0':
307 - resolution: {integrity: sha512-8Y9MLU72WFQOW3HArYv16+Wvm6eGmsqbxxM1qxtm0hvSASJbxCm+zQAZe5stqysTlcWo4BJ82KEH1PfgHbJAmQ==}
306 + '@algolia/client-analytics@5.34.1':
307 + resolution: {integrity: sha512-h18zlL+bVUlbNE92olo1d/r6HQPkxhmP7yCpA1osERwpgC6F058kWm0O0aYdrHJIHtWBcs9aRqq7IkQSkpjPJg==}
308 engines: {node: '>= 14.0.0'}
309
310 - '@algolia/client-common@5.32.0':
311 - resolution: {integrity: sha512-w8L+rgyXMCPBKmEdOT+RfgMrF0mT6HK60vPYWLz8DBs/P7yFdGo7urn99XCJvVLMSKXrIbZ2FMZ/i50nZTXnuQ==}
310 + '@algolia/client-common@5.34.1':
311 + resolution: {integrity: sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA==}
312 engines: {node: '>= 14.0.0'}
313
314 - '@algolia/client-insights@5.32.0':
315 - resolution: {integrity: sha512-AdWfynhUeX7jz/LTiFU3wwzJembTbdLkQIOLs4n7PyBuxZ3jz4azV1CWbIP8AjUOFmul6uXbmYza+KqyS5CzOA==}
314 + '@algolia/client-insights@5.34.1':
315 + resolution: {integrity: sha512-SNDb5wuEpQFM6S5Shk2iytLMusvGycm9uTuYh7cGa1h3U7O65OjjjIgQ0lLY5HPybHNtmXr4Zh/EZ23pZvAJHg==}
316 engines: {node: '>= 14.0.0'}
317
318 - '@algolia/client-personalization@5.32.0':
319 - resolution: {integrity: sha512-bTupJY4xzGZYI4cEQcPlSjjIEzMvv80h7zXGrXY1Y0KC/n/SLiMv84v7Uy+B6AG1Kiy9FQm2ADChBLo1uEhGtQ==}
318 + '@algolia/client-personalization@5.34.1':
319 + resolution: {integrity: sha512-T8z9KqYJOup83Hw0mgICYWfJoLh//FNWbf4roFd95ZJzZ4v1cN/hvr7Eqml1qWMoCkJb4y/XQjrXsJ6Y9XnMLw==}
320 engines: {node: '>= 14.0.0'}
321
322 - '@algolia/client-query-suggestions@5.32.0':
323 - resolution: {integrity: sha512-if+YTJw1G3nDKL2omSBjQltCHUQzbaHADkcPQrGFnIGhVyHU3Dzq4g46uEv8mrL5sxL8FjiS9LvekeUlL2NRqw==}
322 + '@algolia/client-query-suggestions@5.34.1':
323 + resolution: {integrity: sha512-YA0kC4CwO1mc1dliNgbFgToweRa7Uihjz3izEaV4cXninF1v4SaOrPkQUsiFPprAffjMzOUoT7vahQZ/HZyiKQ==}
324 engines: {node: '>= 14.0.0'}
325
326 - '@algolia/client-search@5.32.0':
327 - resolution: {integrity: sha512-kmK5nVkKb4DSUgwbveMKe4X3xHdMsPsOVJeEzBvFJ+oS7CkBPmpfHAEq+CcmiPJs20YMv6yVtUT9yPWL5WgAhg==}
326 + '@algolia/client-search@5.34.1':
327 + resolution: {integrity: sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg==}
328 engines: {node: '>= 14.0.0'}
329
330 - '@algolia/ingestion@1.32.0':
331 - resolution: {integrity: sha512-PZTqjJbx+fmPuT2ud1n4vYDSF1yrT//vOGI9HNYKNA0PM0xGUBWigf5gRivHsXa3oBnUlTyHV9j7Kqx5BHbVHQ==}
330 + '@algolia/ingestion@1.34.1':
331 + resolution: {integrity: sha512-QLxiBskQxFGzPqKZvBNEvNN95kgDCbBd2X29ZGfh6Sr2QOSU34US6Z9x2duiF4o9FwsB0i6eQ2c9vHfuH0lAQg==}
332 engines: {node: '>= 14.0.0'}
333
334 - '@algolia/monitoring@1.32.0':
335 - resolution: {integrity: sha512-kYYoOGjvNQAmHDS1v5sBj+0uEL9RzYqH/TAdq8wmcV+/22weKt/fjh+6LfiqkS1SCZFYYrwGnirrUhUM36lBIQ==}
334 + '@algolia/monitoring@1.34.1':
335 + resolution: {integrity: sha512-NteCvWcWXXdnPGyZH8rXHslcf2pM1WGDNMGNZFXLFtOt1Gf1Tjy2t0NZLp+Mxap3JMV4mbYmactbXrvpQf/lLA==}
336 engines: {node: '>= 14.0.0'}
337
338 - '@algolia/recommend@5.32.0':
339 - resolution: {integrity: sha512-jyIBLdskjPAL7T1g57UMfUNx+PzvYbxKslwRUKBrBA6sNEsYCFdxJAtZSLUMmw6MC98RDt4ksmEl5zVMT5bsuw==}
338 + '@algolia/recommend@5.34.1':
339 + resolution: {integrity: sha512-UdgDSrunLIBAAAxQlYLXYLnYFN4wkzkrAYx+wMLEk/pzASWyza3BkecbUFVqoYOBIgwo7Mt4iymzVtFkzL2uCQ==}
340 engines: {node: '>= 14.0.0'}
341
342 - '@algolia/requester-browser-xhr@5.32.0':
343 - resolution: {integrity: sha512-eDp14z92Gt6JlFgiexImcWWH+Lk07s/FtxcoDaGrE4UVBgpwqOO6AfQM6dXh1pvHxlDFbMJihHc/vj3gBhPjqQ==}
342 + '@algolia/requester-browser-xhr@5.34.1':
343 + resolution: {integrity: sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg==}
344 engines: {node: '>= 14.0.0'}
345
346 - '@algolia/requester-fetch@5.32.0':
347 - resolution: {integrity: sha512-rnWVglh/K75hnaLbwSc2t7gCkbq1ldbPgeIKDUiEJxZ4mlguFgcltWjzpDQ/t1LQgxk9HdIFcQfM17Hid3aQ6Q==}
346 + '@algolia/requester-fetch@5.34.1':
347 + resolution: {integrity: sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw==}
348 engines: {node: '>= 14.0.0'}
349
350 - '@algolia/requester-node-http@5.32.0':
351 - resolution: {integrity: sha512-LbzQ04+VLkzXY4LuOzgyjqEv/46Gwrk55PldaglMJ4i4eDXSRXGKkwJpXFwsoU+c1HMQlHIyjJBhrfsfdyRmyQ==}
350 + '@algolia/requester-node-http@5.34.1':
351 + resolution: {integrity: sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA==}
352 engines: {node: '>= 14.0.0'}
353
354 '@ampproject/remapping@2.3.0':
355 resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
356 engines: {node: '>=6.0.0'}
357
358 - '@antfu/eslint-config@4.16.2':
359 - resolution: {integrity: sha512-5KHZR+7ne+HZnOJUKeTTdHKYA/yOygPssaJ7TZOMoBqjSMtVAa7FO5Wvu2dEtkibM6v3emYyKnQnia1S8NHQeA==}
358 + '@antfu/eslint-config@4.18.0':
359 + resolution: {integrity: sha512-NjzC2VS0UU45xMPN7FJcIF/hhfYHb/ILVp8T6JdfPKel5QToC4bjC8P0v1tp+cy0/F+5jRJdaGrnH31s7Ku4jw==}
360 hasBin: true
361 peerDependencies:
362 '@eslint-react/eslint-plugin': ^1.38.4
@@ -553,8 +553,8 @@ packages:
553 resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==}
554 engines: {node: '>=6.9.0'}
555
556 - '@babel/types@7.28.0':
557 - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==}
556 + '@babel/types@7.28.1':
557 + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==}
558 engines: {node: '>=6.9.0'}
559
560 '@clack/core@0.5.0':
@@ -590,8 +590,8 @@ packages:
590 '@codemirror/theme-one-dark@6.1.3':
591 resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==}
592
593 - '@codemirror/view@6.38.0':
594 - resolution: {integrity: sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg==}
593 + '@codemirror/view@6.38.1':
594 + resolution: {integrity: sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==}
595
596 '@css-render/plugin-bem@0.15.14':
597 resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
@@ -649,158 +649,158 @@ packages:
649 resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==}
650 engines: {node: '>=20.11.0'}
651
652 - '@esbuild/aix-ppc64@0.25.6':
653 - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==}
652 + '@esbuild/aix-ppc64@0.25.8':
653 + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==}
654 engines: {node: '>=18'}
655 cpu: [ppc64]
656 os: [aix]
657
658 - '@esbuild/android-arm64@0.25.6':
659 - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==}
658 + '@esbuild/android-arm64@0.25.8':
659 + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==}
660 engines: {node: '>=18'}
661 cpu: [arm64]
662 os: [android]
663
664 - '@esbuild/android-arm@0.25.6':
665 - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==}
664 + '@esbuild/android-arm@0.25.8':
665 + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==}
666 engines: {node: '>=18'}
667 cpu: [arm]
668 os: [android]
669
670 - '@esbuild/android-x64@0.25.6':
671 - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==}
670 + '@esbuild/android-x64@0.25.8':
671 + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==}
672 engines: {node: '>=18'}
673 cpu: [x64]
674 os: [android]
675
676 - '@esbuild/darwin-arm64@0.25.6':
677 - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==}
676 + '@esbuild/darwin-arm64@0.25.8':
677 + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==}
678 engines: {node: '>=18'}
679 cpu: [arm64]
680 os: [darwin]
681
682 - '@esbuild/darwin-x64@0.25.6':
683 - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==}
682 + '@esbuild/darwin-x64@0.25.8':
683 + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==}
684 engines: {node: '>=18'}
685 cpu: [x64]
686 os: [darwin]
687
688 - '@esbuild/freebsd-arm64@0.25.6':
689 - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==}
688 + '@esbuild/freebsd-arm64@0.25.8':
689 + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==}
690 engines: {node: '>=18'}
691 cpu: [arm64]
692 os: [freebsd]
693
694 - '@esbuild/freebsd-x64@0.25.6':
695 - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==}
694 + '@esbuild/freebsd-x64@0.25.8':
695 + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==}
696 engines: {node: '>=18'}
697 cpu: [x64]
698 os: [freebsd]
699
700 - '@esbuild/linux-arm64@0.25.6':
701 - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==}
700 + '@esbuild/linux-arm64@0.25.8':
701 + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==}
702 engines: {node: '>=18'}
703 cpu: [arm64]
704 os: [linux]
705
706 - '@esbuild/linux-arm@0.25.6':
707 - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==}
706 + '@esbuild/linux-arm@0.25.8':
707 + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==}
708 engines: {node: '>=18'}
709 cpu: [arm]
710 os: [linux]
711
712 - '@esbuild/linux-ia32@0.25.6':
713 - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==}
712 + '@esbuild/linux-ia32@0.25.8':
713 + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==}
714 engines: {node: '>=18'}
715 cpu: [ia32]
716 os: [linux]
717
718 - '@esbuild/linux-loong64@0.25.6':
719 - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==}
718 + '@esbuild/linux-loong64@0.25.8':
719 + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==}
720 engines: {node: '>=18'}
721 cpu: [loong64]
722 os: [linux]
723
724 - '@esbuild/linux-mips64el@0.25.6':
725 - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==}
724 + '@esbuild/linux-mips64el@0.25.8':
725 + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==}
726 engines: {node: '>=18'}
727 cpu: [mips64el]
728 os: [linux]
729
730 - '@esbuild/linux-ppc64@0.25.6':
731 - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==}
730 + '@esbuild/linux-ppc64@0.25.8':
731 + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==}
732 engines: {node: '>=18'}
733 cpu: [ppc64]
734 os: [linux]
735
736 - '@esbuild/linux-riscv64@0.25.6':
737 - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==}
736 + '@esbuild/linux-riscv64@0.25.8':
737 + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==}
738 engines: {node: '>=18'}
739 cpu: [riscv64]
740 os: [linux]
741
742 - '@esbuild/linux-s390x@0.25.6':
743 - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==}
742 + '@esbuild/linux-s390x@0.25.8':
743 + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==}
744 engines: {node: '>=18'}
745 cpu: [s390x]
746 os: [linux]
747
748 - '@esbuild/linux-x64@0.25.6':
749 - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==}
748 + '@esbuild/linux-x64@0.25.8':
749 + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==}
750 engines: {node: '>=18'}
751 cpu: [x64]
752 os: [linux]
753
754 - '@esbuild/netbsd-arm64@0.25.6':
755 - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==}
754 + '@esbuild/netbsd-arm64@0.25.8':
755 + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==}
756 engines: {node: '>=18'}
757 cpu: [arm64]
758 os: [netbsd]
759
760 - '@esbuild/netbsd-x64@0.25.6':
761 - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==}
760 + '@esbuild/netbsd-x64@0.25.8':
761 + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==}
762 engines: {node: '>=18'}
763 cpu: [x64]
764 os: [netbsd]
765
766 - '@esbuild/openbsd-arm64@0.25.6':
767 - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==}
766 + '@esbuild/openbsd-arm64@0.25.8':
767 + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==}
768 engines: {node: '>=18'}
769 cpu: [arm64]
770 os: [openbsd]
771
772 - '@esbuild/openbsd-x64@0.25.6':
773 - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==}
772 + '@esbuild/openbsd-x64@0.25.8':
773 + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==}
774 engines: {node: '>=18'}
775 cpu: [x64]
776 os: [openbsd]
777
778 - '@esbuild/openharmony-arm64@0.25.6':
779 - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==}
778 + '@esbuild/openharmony-arm64@0.25.8':
779 + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==}
780 engines: {node: '>=18'}
781 cpu: [arm64]
782 os: [openharmony]
783
784 - '@esbuild/sunos-x64@0.25.6':
785 - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==}
784 + '@esbuild/sunos-x64@0.25.8':
785 + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==}
786 engines: {node: '>=18'}
787 cpu: [x64]
788 os: [sunos]
789
790 - '@esbuild/win32-arm64@0.25.6':
791 - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==}
790 + '@esbuild/win32-arm64@0.25.8':
791 + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==}
792 engines: {node: '>=18'}
793 cpu: [arm64]
794 os: [win32]
795
796 - '@esbuild/win32-ia32@0.25.6':
797 - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==}
796 + '@esbuild/win32-ia32@0.25.8':
797 + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==}
798 engines: {node: '>=18'}
799 cpu: [ia32]
800 os: [win32]
801
802 - '@esbuild/win32-x64@0.25.6':
803 - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==}
802 + '@esbuild/win32-x64@0.25.8':
803 + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==}
804 engines: {node: '>=18'}
805 cpu: [x64]
806 os: [win32]
@@ -838,14 +838,6 @@ packages:
838 resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==}
839 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
840
841 - '@eslint/core@0.13.0':
842 - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==}
843 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
844 -
845 - '@eslint/core@0.14.0':
846 - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==}
847 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
848 -
841 '@eslint/core@0.15.1':
842 resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==}
843 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -854,24 +846,20 @@ packages:
846 resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
847 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
848
857 - '@eslint/js@9.30.1':
858 - resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==}
849 + '@eslint/js@9.31.0':
850 + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==}
851 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
852
861 - '@eslint/markdown@6.6.0':
862 - resolution: {integrity: sha512-IsWPy2jU3gaQDlioDC4sT4I4kG1hX1OMWs/q2sWwJrPoMASHW/Z4SDw+6Aql6EsHejGbagYuJbFq9Zvx+Y1b1Q==}
853 + '@eslint/markdown@7.1.0':
854 + resolution: {integrity: sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==}
855 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
856
857 '@eslint/object-schema@2.1.6':
858 resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
859 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
860
869 - '@eslint/plugin-kit@0.2.8':
870 - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
871 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
872 -
873 - '@eslint/plugin-kit@0.3.3':
874 - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==}
861 + '@eslint/plugin-kit@0.3.4':
862 + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==}
863 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
864
865 '@f3ve/vue-markdown-it@0.2.3':
@@ -922,26 +910,18 @@ packages:
910 peerDependencies:
911 vue: '>=3'
912
925 - '@intlify/core-base@11.1.9':
926 - resolution: {integrity: sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==}
913 + '@intlify/core-base@11.1.11':
914 + resolution: {integrity: sha512-1Z0N8jTfkcD2Luq9HNZt+GmjpFe4/4PpZF3AOzoO1u5PTtSuXZcfhwBatywbfE2ieB/B5QHIoOFmCXY2jqVKEQ==}
915 engines: {node: '>= 16'}
916
929 - '@intlify/message-compiler@11.1.9':
930 - resolution: {integrity: sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==}
917 + '@intlify/message-compiler@11.1.11':
918 + resolution: {integrity: sha512-7PC6neomoc/z7a8JRjPBbu0T2TzR2MQuY5kn2e049MP7+o32Ve7O8husylkA7K9fQRe4iNXZWTPnDJ6vZdtS1Q==}
919 engines: {node: '>= 16'}
920
933 - '@intlify/shared@11.1.9':
934 - resolution: {integrity: sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==}
921 + '@intlify/shared@11.1.11':
922 + resolution: {integrity: sha512-RIBFTIqxZSsxUqlcyoR7iiC632bq7kkOwYvZlvcVObHfrF4NhuKc4FKvu8iPCrEO+e3XsY7/UVpfgzg+M7ETzA==}
923 engines: {node: '>= 16'}
924
937 - '@isaacs/balanced-match@4.0.1':
938 - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
939 - engines: {node: 20 || >=22}
940 -
941 - '@isaacs/brace-expansion@5.0.0':
942 - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
943 - engines: {node: 20 || >=22}
944 -
925 '@isaacs/cliui@8.0.2':
926 resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
927 engines: {node: '>=12'}
@@ -996,8 +976,8 @@ packages:
976 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
977 engines: {node: '>= 8'}
978
999 - '@nuxt/kit@3.17.6':
1000 - resolution: {integrity: sha512-8PKRwoEF70IXVrpGEJZ4g4V2WtE9RjSMgSZLLa0HZCoyT+QczJcJe3kho/XKnJOnNnHep4WqciTD7p4qRRtBqw==}
979 + '@nuxt/kit@3.17.7':
980 + resolution: {integrity: sha512-JLno3ur7Pix2o/StxIMlEHRkMawA6h7uzjZBDgxdeKXRWTYY8ID9YekSkN4PBlEFGXBfCBOcPd5+YqcyBUAMkw==}
981 engines: {node: '>=18.12.0'}
982
983 '@one-ini/wasm@0.1.1':
@@ -1089,8 +1069,8 @@ packages:
1069 resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
1070 engines: {node: '>=14'}
1071
1092 - '@pkgr/core@0.2.7':
1093 - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==}
1072 + '@pkgr/core@0.2.9':
1073 + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
1074 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
1075
1076 '@polka/url@1.0.0-next.29':
@@ -1103,8 +1083,8 @@ packages:
1083 '@rolldown/pluginutils@1.0.0-beta.19':
1084 resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==}
1085
1106 - '@rolldown/pluginutils@1.0.0-beta.26':
1107 - resolution: {integrity: sha512-r/5po89voz/QRPDmoErL10+hVuTAuz1SHvokx+yWBlOIPB5C41jC7QhLqq9kaebx/+EHyoV3z22/qBfX81Ns8A==}
1086 + '@rolldown/pluginutils@1.0.0-beta.29':
1087 + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==}
1088
1089 '@rollup/pluginutils@5.2.0':
1090 resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==}
@@ -1115,134 +1095,134 @@ packages:
1095 rollup:
1096 optional: true
1097
1118 - '@rollup/rollup-android-arm-eabi@4.44.2':
1119 - resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==}
1098 + '@rollup/rollup-android-arm-eabi@4.45.1':
1099 + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==}
1100 cpu: [arm]
1101 os: [android]
1102
1123 - '@rollup/rollup-android-arm64@4.44.2':
1124 - resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==}
1103 + '@rollup/rollup-android-arm64@4.45.1':
1104 + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==}
1105 cpu: [arm64]
1106 os: [android]
1107
1128 - '@rollup/rollup-darwin-arm64@4.44.2':
1129 - resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==}
1108 + '@rollup/rollup-darwin-arm64@4.45.1':
1109 + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==}
1110 cpu: [arm64]
1111 os: [darwin]
1112
1133 - '@rollup/rollup-darwin-x64@4.44.2':
1134 - resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==}
1113 + '@rollup/rollup-darwin-x64@4.45.1':
1114 + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==}
1115 cpu: [x64]
1116 os: [darwin]
1117
1138 - '@rollup/rollup-freebsd-arm64@4.44.2':
1139 - resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==}
1118 + '@rollup/rollup-freebsd-arm64@4.45.1':
1119 + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==}
1120 cpu: [arm64]
1121 os: [freebsd]
1122
1143 - '@rollup/rollup-freebsd-x64@4.44.2':
1144 - resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==}
1123 + '@rollup/rollup-freebsd-x64@4.45.1':
1124 + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==}
1125 cpu: [x64]
1126 os: [freebsd]
1127
1148 - '@rollup/rollup-linux-arm-gnueabihf@4.44.2':
1149 - resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==}
1128 + '@rollup/rollup-linux-arm-gnueabihf@4.45.1':
1129 + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==}
1130 cpu: [arm]
1131 os: [linux]
1132
1153 - '@rollup/rollup-linux-arm-musleabihf@4.44.2':
1154 - resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==}
1133 + '@rollup/rollup-linux-arm-musleabihf@4.45.1':
1134 + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==}
1135 cpu: [arm]
1136 os: [linux]
1137
1158 - '@rollup/rollup-linux-arm64-gnu@4.44.2':
1159 - resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==}
1138 + '@rollup/rollup-linux-arm64-gnu@4.45.1':
1139 + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==}
1140 cpu: [arm64]
1141 os: [linux]
1142
1163 - '@rollup/rollup-linux-arm64-musl@4.44.2':
1164 - resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==}
1143 + '@rollup/rollup-linux-arm64-musl@4.45.1':
1144 + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==}
1145 cpu: [arm64]
1146 os: [linux]
1147
1168 - '@rollup/rollup-linux-loongarch64-gnu@4.44.2':
1169 - resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==}
1148 + '@rollup/rollup-linux-loongarch64-gnu@4.45.1':
1149 + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==}
1150 cpu: [loong64]
1151 os: [linux]
1152
1173 - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2':
1174 - resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==}
1153 + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1':
1154 + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==}
1155 cpu: [ppc64]
1156 os: [linux]
1157
1178 - '@rollup/rollup-linux-riscv64-gnu@4.44.2':
1179 - resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==}
1158 + '@rollup/rollup-linux-riscv64-gnu@4.45.1':
1159 + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==}
1160 cpu: [riscv64]
1161 os: [linux]
1162
1183 - '@rollup/rollup-linux-riscv64-musl@4.44.2':
1184 - resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==}
1163 + '@rollup/rollup-linux-riscv64-musl@4.45.1':
1164 + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==}
1165 cpu: [riscv64]
1166 os: [linux]
1167
1188 - '@rollup/rollup-linux-s390x-gnu@4.44.2':
1189 - resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==}
1168 + '@rollup/rollup-linux-s390x-gnu@4.45.1':
1169 + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==}
1170 cpu: [s390x]
1171 os: [linux]
1172
1193 - '@rollup/rollup-linux-x64-gnu@4.44.2':
1194 - resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==}
1173 + '@rollup/rollup-linux-x64-gnu@4.45.1':
1174 + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==}
1175 cpu: [x64]
1176 os: [linux]
1177
1198 - '@rollup/rollup-linux-x64-musl@4.44.2':
1199 - resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==}
1178 + '@rollup/rollup-linux-x64-musl@4.45.1':
1179 + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==}
1180 cpu: [x64]
1181 os: [linux]
1182
1203 - '@rollup/rollup-win32-arm64-msvc@4.44.2':
1204 - resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==}
1183 + '@rollup/rollup-win32-arm64-msvc@4.45.1':
1184 + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==}
1185 cpu: [arm64]
1186 os: [win32]
1187
1208 - '@rollup/rollup-win32-ia32-msvc@4.44.2':
1209 - resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==}
1188 + '@rollup/rollup-win32-ia32-msvc@4.45.1':
1189 + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==}
1190 cpu: [ia32]
1191 os: [win32]
1192
1213 - '@rollup/rollup-win32-x64-msvc@4.44.2':
1214 - resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==}
1193 + '@rollup/rollup-win32-x64-msvc@4.45.1':
1194 + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==}
1195 cpu: [x64]
1196 os: [win32]
1197
1198 '@sec-ant/readable-stream@0.4.1':
1199 resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
1200
1221 - '@shikijs/core@3.7.0':
1222 - resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==}
1201 + '@shikijs/core@3.8.1':
1202 + resolution: {integrity: sha512-uTSXzUBQ/IgFcUa6gmGShCHr4tMdR3pxUiiWKDm8pd42UKJdYhkAYsAmHX5mTwybQ5VyGDgTjW4qKSsRvGSang==}
1203
1224 - '@shikijs/engine-javascript@3.7.0':
1225 - resolution: {integrity: sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==}
1204 + '@shikijs/engine-javascript@3.8.1':
1205 + resolution: {integrity: sha512-rZRp3BM1llrHkuBPAdYAzjlF7OqlM0rm/7EWASeCcY7cRYZIrOnGIHE9qsLz5TCjGefxBFnwgIECzBs2vmOyKA==}
1206
1227 - '@shikijs/engine-oniguruma@3.7.0':
1228 - resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==}
1207 + '@shikijs/engine-oniguruma@3.8.1':
1208 + resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==}
1209
1230 - '@shikijs/langs@3.7.0':
1231 - resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==}
1210 + '@shikijs/langs@3.8.1':
1211 + resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==}
1212
1233 - '@shikijs/markdown-it@3.7.0':
1234 - resolution: {integrity: sha512-USPP1mn9vdA0lDb/Delrqrf3prCmt4MObSYqyHeXlvMMG+dPRs3B8wrEJr17fYOsnU+kPLV5ahyQL0GhG8KyVw==}
1213 + '@shikijs/markdown-it@3.8.1':
1214 + resolution: {integrity: sha512-5/zTzhQfL4nYq68cw98JLBac3Ex2AzMcMBvQoB4am2uNaqISDqMSSSEvOKRXSQL357M7YxRtbyjgtg1Xpaboog==}
1215 peerDependencies:
1216 markdown-it-async: ^2.2.0
1217 peerDependenciesMeta:
1218 markdown-it-async:
1219 optional: true
1220
1241 - '@shikijs/themes@3.7.0':
1242 - resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==}
1221 + '@shikijs/themes@3.8.1':
1222 + resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==}
1223
1244 - '@shikijs/types@3.7.0':
1245 - resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==}
1224 + '@shikijs/types@3.8.1':
1225 + resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==}
1226
1227 '@shikijs/vscode-textmate@10.0.2':
1228 resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -1263,8 +1243,8 @@ packages:
1243 '@singulio/app-auth-search@0.0.3':
1244 resolution: {integrity: sha512-4U/of6Gry5hal3CdZoMkrdfbSYza43ZcvlJoh4pJ1UCm16Vpegmw3MwmbrZHjg8wiFWe+f5WnX/WkgQpuuZnHw==}
1245
1266 - '@stylistic/eslint-plugin@5.1.0':
1267 - resolution: {integrity: sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==}
1246 + '@stylistic/eslint-plugin@5.2.2':
1247 + resolution: {integrity: sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==}
1248 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1249 peerDependencies:
1250 eslint: '>=9.0.0'
@@ -1454,8 +1434,8 @@ packages:
1434 '@types/ms@2.1.0':
1435 resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
1436
1457 - '@types/node@24.0.13':
1458 - resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==}
1437 + '@types/node@24.1.0':
1438 + resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==}
1439
1440 '@types/parse-json@4.0.2':
1441 resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -1484,63 +1464,63 @@ packages:
1464 '@types/yauzl@2.10.3':
1465 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
1466
1487 - '@typescript-eslint/eslint-plugin@8.36.0':
1488 - resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==}
1467 + '@typescript-eslint/eslint-plugin@8.38.0':
1468 + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==}
1469 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1470 peerDependencies:
1491 - '@typescript-eslint/parser': ^8.36.0
1471 + '@typescript-eslint/parser': ^8.38.0
1472 eslint: ^8.57.0 || ^9.0.0
1473 typescript: '>=4.8.4 <5.9.0'
1474
1495 - '@typescript-eslint/parser@8.36.0':
1496 - resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==}
1475 + '@typescript-eslint/parser@8.38.0':
1476 + resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==}
1477 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1478 peerDependencies:
1479 eslint: ^8.57.0 || ^9.0.0
1480 typescript: '>=4.8.4 <5.9.0'
1481
1502 - '@typescript-eslint/project-service@8.36.0':
1503 - resolution: {integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==}
1482 + '@typescript-eslint/project-service@8.38.0':
1483 + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==}
1484 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1485 peerDependencies:
1486 typescript: '>=4.8.4 <5.9.0'
1487
1508 - '@typescript-eslint/scope-manager@8.36.0':
1509 - resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==}
1488 + '@typescript-eslint/scope-manager@8.38.0':
1489 + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==}
1490 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1491
1512 - '@typescript-eslint/tsconfig-utils@8.36.0':
1513 - resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==}
1492 + '@typescript-eslint/tsconfig-utils@8.38.0':
1493 + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==}
1494 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1495 peerDependencies:
1496 typescript: '>=4.8.4 <5.9.0'
1497
1518 - '@typescript-eslint/type-utils@8.36.0':
1519 - resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==}
1498 + '@typescript-eslint/type-utils@8.38.0':
1499 + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==}
1500 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1501 peerDependencies:
1502 eslint: ^8.57.0 || ^9.0.0
1503 typescript: '>=4.8.4 <5.9.0'
1504
1525 - '@typescript-eslint/types@8.36.0':
1526 - resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==}
1505 + '@typescript-eslint/types@8.38.0':
1506 + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==}
1507 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1508
1529 - '@typescript-eslint/typescript-estree@8.36.0':
1530 - resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==}
1509 + '@typescript-eslint/typescript-estree@8.38.0':
1510 + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==}
1511 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1512 peerDependencies:
1513 typescript: '>=4.8.4 <5.9.0'
1514
1535 - '@typescript-eslint/utils@8.36.0':
1536 - resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==}
1515 + '@typescript-eslint/utils@8.38.0':
1516 + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==}
1517 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1518 peerDependencies:
1519 eslint: ^8.57.0 || ^9.0.0
1520 typescript: '>=4.8.4 <5.9.0'
1521
1542 - '@typescript-eslint/visitor-keys@8.36.0':
1543 - resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==}
1522 + '@typescript-eslint/visitor-keys@8.38.0':
1523 + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==}
1524 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1525
1526 '@ungap/structured-clone@1.3.0':
@@ -1601,14 +1581,14 @@ packages:
1581 '@vitest/utils@3.2.4':
1582 resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
1583
1604 - '@volar/language-core@2.4.17':
1605 - resolution: {integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==}
1584 + '@volar/language-core@2.4.20':
1585 + resolution: {integrity: sha512-dRDF1G33xaAIDqR6+mXUIjXYdu9vzSxlMGfMEwBxQsfY/JMUEXSpLTR057oTKlUQ2nIvCmP9k94A8h8z2VrNSA==}
1586
1607 - '@volar/source-map@2.4.17':
1608 - resolution: {integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==}
1587 + '@volar/source-map@2.4.20':
1588 + resolution: {integrity: sha512-mVjmFQH8mC+nUaVwmbxoYUy8cww+abaO8dWzqPUjilsavjxH0jCJ3Mp8HFuHsdewZs2c+SP+EO7hCd8Z92whJg==}
1589
1610 - '@volar/typescript@2.4.17':
1611 - resolution: {integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==}
1590 + '@volar/typescript@2.4.20':
1591 + resolution: {integrity: sha512-Oc4DczPwQyXcVbd+5RsNEqX6ia0+w3p+klwdZQ6ZKhFjWoBP9PCPQYlKYRi/tDemWphW93P/Vv13vcE9I9D2GQ==}
1592
1593 '@vue/babel-helper-vue-transform-on@1.4.0':
1594 resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==}
@@ -1626,17 +1606,17 @@ packages:
1606 peerDependencies:
1607 '@babel/core': ^7.0.0-0
1608
1629 - '@vue/compiler-core@3.5.17':
1630 - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==}
1609 + '@vue/compiler-core@3.5.18':
1610 + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==}
1611
1632 - '@vue/compiler-dom@3.5.17':
1633 - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==}
1612 + '@vue/compiler-dom@3.5.18':
1613 + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==}
1614
1635 - '@vue/compiler-sfc@3.5.17':
1636 - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==}
1615 + '@vue/compiler-sfc@3.5.18':
1616 + resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==}
1617
1638 - '@vue/compiler-ssr@3.5.17':
1639 - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==}
1618 + '@vue/compiler-ssr@3.5.18':
1619 + resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==}
1620
1621 '@vue/compiler-vue2@2.7.16':
1622 resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
@@ -1658,30 +1638,30 @@ packages:
1638 '@vue/devtools-shared@7.7.7':
1639 resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==}
1640
1661 - '@vue/language-core@3.0.1':
1662 - resolution: {integrity: sha512-sq+/Mc1IqIexWEQ+Q2XPiDb5SxSvY5JPqHnMOl/PlF5BekslzduX8dglSkpC17VeiAQB6dpS+4aiwNLJRduCNw==}
1641 + '@vue/language-core@3.0.3':
1642 + resolution: {integrity: sha512-I9wY0ULMN9tMSua+2C7g+ez1cIziVMUzIHlDYGSl2rtru3Eh4sXj95vZ+4GBuXwwPnEmYfzSApVbXiVbI8V5Gg==}
1643 peerDependencies:
1644 typescript: '*'
1645 peerDependenciesMeta:
1646 typescript:
1647 optional: true
1648
1669 - '@vue/reactivity@3.5.17':
1670 - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==}
1649 + '@vue/reactivity@3.5.18':
1650 + resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==}
1651
1672 - '@vue/runtime-core@3.5.17':
1673 - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==}
1652 + '@vue/runtime-core@3.5.18':
1653 + resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==}
1654
1675 - '@vue/runtime-dom@3.5.17':
1676 - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==}
1655 + '@vue/runtime-dom@3.5.18':
1656 + resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==}
1657
1678 - '@vue/server-renderer@3.5.17':
1679 - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==}
1658 + '@vue/server-renderer@3.5.18':
1659 + resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==}
1660 peerDependencies:
1681 - vue: 3.5.17
1661 + vue: 3.5.18
1662
1683 - '@vue/shared@3.5.17':
1684 - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==}
1663 + '@vue/shared@3.5.18':
1664 + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==}
1665
1666 '@vue/test-utils@2.4.6':
1667 resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
@@ -1743,8 +1723,8 @@ packages:
1723 ajv@6.12.6:
1724 resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
1725
1746 - algoliasearch@5.32.0:
1747 - resolution: {integrity: sha512-84xBncKNPBK8Ae89F65+SyVcOihrIbm/3N7to+GpRBHEUXGjA3ydWTMpcRW6jmFzkBQ/eqYy/y+J+NBpJWYjBg==}
1726 + algoliasearch@5.34.1:
1727 + resolution: {integrity: sha512-s70HlfBgswgEdmCYkUJG8i/ULYhbkk8N9+N8JsWUwszcp7eauPEr5tIX4BY0qDGeKWQ/qZvmt4mxwTusYY23sg==}
1728 engines: {node: '>= 14.0.0'}
1729
1730 alien-signals@2.0.5:
@@ -1778,8 +1758,8 @@ packages:
1758 resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==}
1759 engines: {node: '>=14'}
1760
1781 - apexcharts@5.2.0:
1782 - resolution: {integrity: sha512-BZ+v4Wqf4BKVRKBatVghDVu9vu2SXhl/F7ujT2awnf7Zv6RT39FQWtAAV3bpH+G5c8IADw0PyOKG00+rN1UoNg==}
1761 + apexcharts@5.3.1:
1762 + resolution: {integrity: sha512-GMfVt9h8qNMqebZz1HOSyWcmdOKWPGnp/F7ta6IijXO3t2B/K25bS+Ml709zdw7yHO/45F1DgnKnDyK6uRZ2Ng==}
1763
1764 arch@2.2.0:
1765 resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
@@ -1843,8 +1823,8 @@ packages:
1823 aws4@1.13.2:
1824 resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
1825
1846 - axios@1.10.0:
1847 - resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==}
1826 + axios@1.11.0:
1827 + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==}
1828
1829 balanced-match@1.0.2:
1830 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -1855,8 +1835,8 @@ packages:
1835 bcrypt-pbkdf@1.0.2:
1836 resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
1837
1858 - birpc@2.4.0:
1859 - resolution: {integrity: sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==}
1838 + birpc@2.5.0:
1839 + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==}
1840
1841 blob-util@2.0.2:
1842 resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
@@ -1900,8 +1880,8 @@ packages:
1880 resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
1881 engines: {node: '>= 0.8'}
1882
1903 - c12@3.0.4:
1904 - resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==}
1883 + c12@3.1.0:
1884 + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
1885 peerDependencies:
1886 magicast: ^0.3.5
1887 peerDependenciesMeta:
@@ -1952,6 +1932,9 @@ packages:
1932 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1933 engines: {node: '>=10'}
1934
1935 + change-case@5.4.4:
1936 + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
1937 +
1938 character-entities-html4@2.1.0:
1939 resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
1940
@@ -2141,8 +2124,8 @@ packages:
2124 csstype@3.1.3:
2125 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
2126
2144 - cypress@14.5.1:
2145 - resolution: {integrity: sha512-vYBeZKW3UAtxwv5mFuSlOBCYhyO0H86TeDKRJ7TgARyHiREIaiDjeHtqjzrXRFrdz9KnNavqlm+z+hklC7v8XQ==}
2127 + cypress@14.5.2:
2128 + resolution: {integrity: sha512-O4E4CEBqDHLDrJD/dfStHPcM+8qFgVVZ89Li7xDU0yL/JxO/V0PEcfF2I8aGa7uA2MGNLkNUAnghPM83UcHOJw==}
2129 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2130 hasBin: true
2131
@@ -2302,8 +2285,8 @@ packages:
2285 engines: {node: '>=14'}
2286 hasBin: true
2287
2305 - electron-to-chromium@1.5.182:
2306 - resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==}
2288 + electron-to-chromium@1.5.190:
2289 + resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==}
2290
2291 emoji-regex@8.0.0:
2292 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -2361,8 +2344,8 @@ packages:
2344 resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
2345 engines: {node: '>= 0.4'}
2346
2364 - esbuild@0.25.6:
2365 - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==}
2347 + esbuild@0.25.8:
2348 + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==}
2349 engines: {node: '>=18'}
2350 hasBin: true
2351
@@ -2444,8 +2427,8 @@ packages:
2427 typescript:
2428 optional: true
2429
2447 - eslint-plugin-jsdoc@51.3.4:
2448 - resolution: {integrity: sha512-maz6qa95+sAjMr9m5oRyfejc+mnyQWsWSe9oyv9371bh4/T0kWOMryJNO4h8rEd97wo/9lbzwi3OOX4rDhnAzg==}
2430 + eslint-plugin-jsdoc@51.4.1:
2431 + resolution: {integrity: sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==}
2432 engines: {node: '>=20.11.0'}
2433 peerDependencies:
2434 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -2472,8 +2455,8 @@ packages:
2455 peerDependencies:
2456 eslint: '>=8.45.0'
2457
2475 - eslint-plugin-pnpm@0.3.1:
2476 - resolution: {integrity: sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ==}
2458 + eslint-plugin-pnpm@1.1.0:
2459 + resolution: {integrity: sha512-sL93w0muBtjnogzk/loDsxzMbmXQOLP5Blw3swLDBXZgfb+qQI73bPcUbjVR+ZL+K62vGJdErV+43i3r5DsZPg==}
2460 peerDependencies:
2461 eslint: ^9.0.0
2462
@@ -2489,11 +2472,11 @@ packages:
2472 peerDependencies:
2473 eslint: '>=6.0.0'
2474
2492 - eslint-plugin-unicorn@59.0.1:
2493 - resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==}
2494 - engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0}
2475 + eslint-plugin-unicorn@60.0.0:
2476 + resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==}
2477 + engines: {node: ^20.10.0 || >=21.0.0}
2478 peerDependencies:
2496 - eslint: '>=9.22.0'
2479 + eslint: '>=9.29.0'
2480
2481 eslint-plugin-unused-imports@4.1.4:
2482 resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
@@ -2539,8 +2522,8 @@ packages:
2522 resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
2523 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2524
2542 - eslint@9.30.1:
2543 - resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==}
2525 + eslint@9.31.0:
2526 + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==}
2527 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2528 hasBin: true
2529 peerDependencies:
@@ -2724,8 +2707,8 @@ packages:
2707 forever-agent@0.6.1:
2708 resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
2709
2727 - form-data@4.0.3:
2728 - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==}
2710 + form-data@4.0.4:
2711 + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
2712 engines: {node: '>= 6'}
2713
2714 format@0.2.2:
@@ -3088,8 +3071,8 @@ packages:
3071 joi@17.13.3:
3072 resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
3073
3091 - jose@6.0.11:
3092 - resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==}
3074 + jose@6.0.12:
3075 + resolution: {integrity: sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==}
3076
3077 js-beautify@1.15.4:
3078 resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
@@ -3512,10 +3495,6 @@ packages:
3495 resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
3496 engines: {node: '>=4'}
3497
3515 - minimatch@10.0.3:
3516 - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
3517 - engines: {node: 20 || >=22}
3518 -
3498 minimatch@3.1.2:
3499 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
3500
@@ -3658,8 +3637,8 @@ packages:
3637 oniguruma-to-es@4.3.3:
3638 resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
3639
3661 - open@10.1.2:
3662 - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==}
3640 + open@10.2.0:
3641 + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
3642 engines: {node: '>=18'}
3643
3644 open@8.4.2:
@@ -3776,8 +3755,8 @@ packages:
3755 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
3756 engines: {node: '>=8.6'}
3757
3779 - picomatch@4.0.2:
3780 - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
3758 + picomatch@4.0.3:
3759 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
3760 engines: {node: '>=12'}
3761
3762 pidtree@0.6.0:
@@ -3828,6 +3807,9 @@ packages:
3807 pnpm-workspace-yaml@0.3.1:
3808 resolution: {integrity: sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==}
3809
3810 + pnpm-workspace-yaml@1.1.0:
3811 + resolution: {integrity: sha512-OWUzBxtitpyUV0fBYYwLAfWxn3mSzVbVB7cwgNaHvTTU9P0V2QHjyaY5i7f1hEiT9VeKsNH1Skfhe2E3lx/zhA==}
3812 +
3813 popmotion@11.0.5:
3814 resolution: {integrity: sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==}
3815
@@ -4057,8 +4039,8 @@ packages:
4039 rollup:
4040 optional: true
4041
4060 - rollup@4.44.2:
4061 - resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==}
4042 + rollup@4.45.1:
4043 + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==}
4044 engines: {node: '>=18.0.0', npm: '>=8.0.0'}
4045 hasBin: true
4046
@@ -4128,8 +4110,8 @@ packages:
4110 resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
4111 engines: {node: '>= 0.4'}
4112
4131 - shiki@3.7.0:
4132 - resolution: {integrity: sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==}
4113 + shiki@3.8.1:
4114 + resolution: {integrity: sha512-+MYIyjwGPCaegbpBeFN9+oOifI8CKiKG3awI/6h3JeT85c//H2wDW/xCJEGuQ5jPqtbboKNqNy+JyX9PYpGwNg==}
4115
4116 side-channel-list@1.0.0:
4117 resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -4295,8 +4277,8 @@ packages:
4277 symbol-tree@3.2.4:
4278 resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
4279
4298 - synckit@0.11.8:
4299 - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
4280 + synckit@0.11.11:
4281 + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
4282 engines: {node: ^14.18.0 || >=16.0.0}
4283
4284 tailwindcss@4.1.11:
@@ -4459,8 +4441,8 @@ packages:
4441 resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
4442 engines: {node: '>=18'}
4443
4462 - unimport@5.1.0:
4463 - resolution: {integrity: sha512-wMmuG+wkzeHh2KCE6yiDlHmKelN8iE/maxkUYMbmrS6iV8+n6eP1TH3yKKlepuF4hrkepinEGmBXdfo9XZUvAw==}
4444 + unimport@5.2.0:
4445 + resolution: {integrity: sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==}
4446 engines: {node: '>=18.12.0'}
4447
4448 unist-util-is@6.0.0:
@@ -4558,7 +4540,7 @@ packages:
4540 engines: {node: '>=14'}
4541 peerDependencies:
4542 '@nuxt/kit': '*'
4561 - vite: ^7.0.4
4543 + vite: ^7.0.5
4544 peerDependenciesMeta:
4545 '@nuxt/kit':
4546 optional: true
@@ -4568,7 +4550,7 @@ packages:
4550 engines: {node: '>=14'}
4551 peerDependencies:
4552 '@nuxt/kit': '*'
4571 - vite: ^7.0.4
4553 + vite: ^7.0.5
4554 peerDependenciesMeta:
4555 '@nuxt/kit':
4556 optional: true
@@ -4589,8 +4571,8 @@ packages:
4571 peerDependencies:
4572 vue: '>=3.2.13'
4573
4592 - vite@7.0.4:
4593 - resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==}
4574 + vite@7.0.5:
4575 + resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==}
4576 engines: {node: ^20.19.0 || >=22.12.0}
4577 hasBin: true
4578 peerDependencies:
@@ -4691,8 +4673,8 @@ packages:
4673 peerDependencies:
4674 vue: ^3.0.0
4675
4694 - vue-i18n@11.1.9:
4695 - resolution: {integrity: sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==}
4676 + vue-i18n@11.1.11:
4677 + resolution: {integrity: sha512-LvyteQoXeQiuILbzqv13LbyBna/TEv2Ha+4ZWK2AwGHUzZ8+IBaZS0TJkCgn5izSPLcgZwXy9yyTrewCb2u/MA==}
4678 engines: {node: '>= 16'}
4679 peerDependencies:
4680 vue: ^3.0.0
@@ -4707,8 +4689,8 @@ packages:
4689 peerDependencies:
4690 vue: ^3.3.4
4691
4710 - vue-tsc@3.0.1:
4711 - resolution: {integrity: sha512-UvMLQD0hAGL1g/NfEQelnSVB4H5gtf/gz2lJKjMMwWNOUmSNyWkejwJagAxEbSjtV5CPPJYslOtoSuqJ63mhdg==}
4692 + vue-tsc@3.0.3:
4693 + resolution: {integrity: sha512-uU1OMSzWE8/y0+kDTc0iEIu9v82bmFkGyJpAO/x3wQqBkkHkButKgtygREyOkxL4E/xtcf/ExvgNhhjdzonldw==}
4694 hasBin: true
4695 peerDependencies:
4696 typescript: '>=5.0.0'
@@ -4725,8 +4707,8 @@ packages:
4707 peerDependencies:
4708 vue: ^3.2
4709
4728 - vue@3.5.17:
4729 - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==}
4710 + vue@3.5.18:
4711 + resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==}
4712 peerDependencies:
4713 typescript: '*'
4714 peerDependenciesMeta:
@@ -4824,6 +4806,10 @@ packages:
4806 utf-8-validate:
4807 optional: true
4808
4809 + wsl-utils@0.1.0:
4810 + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
4811 + engines: {node: '>=18'}
4812 +
4813 xml-name-validator@4.0.0:
4814 resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
4815 engines: {node: '>=12'}
@@ -4907,126 +4893,126 @@ snapshots:
4893 dependencies:
4894 lodash: 4.17.21
4895
4910 - '@algolia/client-abtesting@5.32.0':
4896 + '@algolia/client-abtesting@5.34.1':
4897 dependencies:
4912 - '@algolia/client-common': 5.32.0
4913 - '@algolia/requester-browser-xhr': 5.32.0
4914 - '@algolia/requester-fetch': 5.32.0
4915 - '@algolia/requester-node-http': 5.32.0
4898 + '@algolia/client-common': 5.34.1
4899 + '@algolia/requester-browser-xhr': 5.34.1
4900 + '@algolia/requester-fetch': 5.34.1
4901 + '@algolia/requester-node-http': 5.34.1
4902
4917 - '@algolia/client-analytics@5.32.0':
4903 + '@algolia/client-analytics@5.34.1':
4904 dependencies:
4919 - '@algolia/client-common': 5.32.0
4920 - '@algolia/requester-browser-xhr': 5.32.0
4921 - '@algolia/requester-fetch': 5.32.0
4922 - '@algolia/requester-node-http': 5.32.0
4905 + '@algolia/client-common': 5.34.1
4906 + '@algolia/requester-browser-xhr': 5.34.1
4907 + '@algolia/requester-fetch': 5.34.1
4908 + '@algolia/requester-node-http': 5.34.1
4909
4924 - '@algolia/client-common@5.32.0': {}
4910 + '@algolia/client-common@5.34.1': {}
4911
4926 - '@algolia/client-insights@5.32.0':
4912 + '@algolia/client-insights@5.34.1':
4913 dependencies:
4928 - '@algolia/client-common': 5.32.0
4929 - '@algolia/requester-browser-xhr': 5.32.0
4930 - '@algolia/requester-fetch': 5.32.0
4931 - '@algolia/requester-node-http': 5.32.0
4914 + '@algolia/client-common': 5.34.1
4915 + '@algolia/requester-browser-xhr': 5.34.1
4916 + '@algolia/requester-fetch': 5.34.1
4917 + '@algolia/requester-node-http': 5.34.1
4918
4933 - '@algolia/client-personalization@5.32.0':
4919 + '@algolia/client-personalization@5.34.1':
4920 dependencies:
4935 - '@algolia/client-common': 5.32.0
4936 - '@algolia/requester-browser-xhr': 5.32.0
4937 - '@algolia/requester-fetch': 5.32.0
4938 - '@algolia/requester-node-http': 5.32.0
4921 + '@algolia/client-common': 5.34.1
4922 + '@algolia/requester-browser-xhr': 5.34.1
4923 + '@algolia/requester-fetch': 5.34.1
4924 + '@algolia/requester-node-http': 5.34.1
4925
4940 - '@algolia/client-query-suggestions@5.32.0':
4926 + '@algolia/client-query-suggestions@5.34.1':
4927 dependencies:
4942 - '@algolia/client-common': 5.32.0
4943 - '@algolia/requester-browser-xhr': 5.32.0
4944 - '@algolia/requester-fetch': 5.32.0
4945 - '@algolia/requester-node-http': 5.32.0
4928 + '@algolia/client-common': 5.34.1
4929 + '@algolia/requester-browser-xhr': 5.34.1
4930 + '@algolia/requester-fetch': 5.34.1
4931 + '@algolia/requester-node-http': 5.34.1
4932
4947 - '@algolia/client-search@5.32.0':
4933 + '@algolia/client-search@5.34.1':
4934 dependencies:
4949 - '@algolia/client-common': 5.32.0
4950 - '@algolia/requester-browser-xhr': 5.32.0
4951 - '@algolia/requester-fetch': 5.32.0
4952 - '@algolia/requester-node-http': 5.32.0
4935 + '@algolia/client-common': 5.34.1
4936 + '@algolia/requester-browser-xhr': 5.34.1
4937 + '@algolia/requester-fetch': 5.34.1
4938 + '@algolia/requester-node-http': 5.34.1
4939
4954 - '@algolia/ingestion@1.32.0':
4940 + '@algolia/ingestion@1.34.1':
4941 dependencies:
4956 - '@algolia/client-common': 5.32.0
4957 - '@algolia/requester-browser-xhr': 5.32.0
4958 - '@algolia/requester-fetch': 5.32.0
4959 - '@algolia/requester-node-http': 5.32.0
4942 + '@algolia/client-common': 5.34.1
4943 + '@algolia/requester-browser-xhr': 5.34.1
4944 + '@algolia/requester-fetch': 5.34.1
4945 + '@algolia/requester-node-http': 5.34.1
4946
4961 - '@algolia/monitoring@1.32.0':
4947 + '@algolia/monitoring@1.34.1':
4948 dependencies:
4963 - '@algolia/client-common': 5.32.0
4964 - '@algolia/requester-browser-xhr': 5.32.0
4965 - '@algolia/requester-fetch': 5.32.0
4966 - '@algolia/requester-node-http': 5.32.0
4949 + '@algolia/client-common': 5.34.1
4950 + '@algolia/requester-browser-xhr': 5.34.1
4951 + '@algolia/requester-fetch': 5.34.1
4952 + '@algolia/requester-node-http': 5.34.1
4953
4968 - '@algolia/recommend@5.32.0':
4954 + '@algolia/recommend@5.34.1':
4955 dependencies:
4970 - '@algolia/client-common': 5.32.0
4971 - '@algolia/requester-browser-xhr': 5.32.0
4972 - '@algolia/requester-fetch': 5.32.0
4973 - '@algolia/requester-node-http': 5.32.0
4956 + '@algolia/client-common': 5.34.1
4957 + '@algolia/requester-browser-xhr': 5.34.1
4958 + '@algolia/requester-fetch': 5.34.1
4959 + '@algolia/requester-node-http': 5.34.1
4960
4975 - '@algolia/requester-browser-xhr@5.32.0':
4961 + '@algolia/requester-browser-xhr@5.34.1':
4962 dependencies:
4977 - '@algolia/client-common': 5.32.0
4963 + '@algolia/client-common': 5.34.1
4964
4979 - '@algolia/requester-fetch@5.32.0':
4965 + '@algolia/requester-fetch@5.34.1':
4966 dependencies:
4981 - '@algolia/client-common': 5.32.0
4967 + '@algolia/client-common': 5.34.1
4968
4983 - '@algolia/requester-node-http@5.32.0':
4969 + '@algolia/requester-node-http@5.34.1':
4970 dependencies:
4985 - '@algolia/client-common': 5.32.0
4971 + '@algolia/client-common': 5.34.1
4972
4973 '@ampproject/remapping@2.3.0':
4974 dependencies:
4975 '@jridgewell/gen-mapping': 0.3.12
4976 '@jridgewell/trace-mapping': 0.3.29
4977
4992 - '@antfu/eslint-config@4.16.2(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
4978 + '@antfu/eslint-config@4.18.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
4979 dependencies:
4980 '@antfu/install-pkg': 1.1.0
4981 '@clack/prompts': 0.11.0
4996 - '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.30.1(jiti@2.4.2))
4997 - '@eslint/markdown': 6.6.0
4998 - '@stylistic/eslint-plugin': 5.1.0(eslint@9.30.1(jiti@2.4.2))
4999 - '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
5000 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
5001 - '@vitest/eslint-plugin': 1.3.4(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
4982 + '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.31.0(jiti@2.4.2))
4983 + '@eslint/markdown': 7.1.0
4984 + '@stylistic/eslint-plugin': 5.2.2(eslint@9.31.0(jiti@2.4.2))
4985 + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
4986 + '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
4987 + '@vitest/eslint-plugin': 1.3.4(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
4988 ansis: 4.1.0
4989 cac: 6.7.14
5004 - eslint: 9.30.1(jiti@2.4.2)
5005 - eslint-config-flat-gitignore: 2.1.0(eslint@9.30.1(jiti@2.4.2))
4990 + eslint: 9.31.0(jiti@2.4.2)
4991 + eslint-config-flat-gitignore: 2.1.0(eslint@9.31.0(jiti@2.4.2))
4992 eslint-flat-config-utils: 2.1.0
5007 - eslint-merge-processors: 2.0.0(eslint@9.30.1(jiti@2.4.2))
5008 - eslint-plugin-antfu: 3.1.1(eslint@9.30.1(jiti@2.4.2))
5009 - eslint-plugin-command: 3.3.1(eslint@9.30.1(jiti@2.4.2))
5010 - eslint-plugin-import-lite: 0.3.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
5011 - eslint-plugin-jsdoc: 51.3.4(eslint@9.30.1(jiti@2.4.2))
5012 - eslint-plugin-jsonc: 2.20.1(eslint@9.30.1(jiti@2.4.2))
5013 - eslint-plugin-n: 17.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
4993 + eslint-merge-processors: 2.0.0(eslint@9.31.0(jiti@2.4.2))
4994 + eslint-plugin-antfu: 3.1.1(eslint@9.31.0(jiti@2.4.2))
4995 + eslint-plugin-command: 3.3.1(eslint@9.31.0(jiti@2.4.2))
4996 + eslint-plugin-import-lite: 0.3.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
4997 + eslint-plugin-jsdoc: 51.4.1(eslint@9.31.0(jiti@2.4.2))
4998 + eslint-plugin-jsonc: 2.20.1(eslint@9.31.0(jiti@2.4.2))
4999 + eslint-plugin-n: 17.21.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
5000 eslint-plugin-no-only-tests: 3.3.0
5015 - eslint-plugin-perfectionist: 4.15.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
5016 - eslint-plugin-pnpm: 0.3.1(eslint@9.30.1(jiti@2.4.2))
5017 - eslint-plugin-regexp: 2.9.0(eslint@9.30.1(jiti@2.4.2))
5018 - eslint-plugin-toml: 0.12.0(eslint@9.30.1(jiti@2.4.2))
5019 - eslint-plugin-unicorn: 59.0.1(eslint@9.30.1(jiti@2.4.2))
5020 - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))
5021 - eslint-plugin-vue: 10.3.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2)))
5022 - eslint-plugin-yml: 1.18.0(eslint@9.30.1(jiti@2.4.2))
5023 - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2))
5001 + eslint-plugin-perfectionist: 4.15.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
5002 + eslint-plugin-pnpm: 1.1.0(eslint@9.31.0(jiti@2.4.2))
5003 + eslint-plugin-regexp: 2.9.0(eslint@9.31.0(jiti@2.4.2))
5004 + eslint-plugin-toml: 0.12.0(eslint@9.31.0(jiti@2.4.2))
5005 + eslint-plugin-unicorn: 60.0.0(eslint@9.31.0(jiti@2.4.2))
5006 + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))
5007 + eslint-plugin-vue: 10.3.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.4.2)))
5008 + eslint-plugin-yml: 1.18.0(eslint@9.31.0(jiti@2.4.2))
5009 + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0(jiti@2.4.2))
5010 globals: 16.3.0
5011 jsonc-eslint-parser: 2.4.0
5012 local-pkg: 1.1.1
5013 parse-gitignore: 2.0.0
5014 toml-eslint-parser: 0.10.0
5029 - vue-eslint-parser: 10.2.0(eslint@9.30.1(jiti@2.4.2))
5015 + vue-eslint-parser: 10.2.0(eslint@9.31.0(jiti@2.4.2))
5016 yaml-eslint-parser: 1.3.0
5017 transitivePeerDependencies:
5018 - '@eslint/json'
@@ -5076,7 +5062,7 @@ snapshots:
5062 '@babel/parser': 7.28.0
5063 '@babel/template': 7.27.2
5064 '@babel/traverse': 7.28.0
5079 - '@babel/types': 7.28.0
5065 + '@babel/types': 7.28.1
5066 convert-source-map: 2.0.0
5067 debug: 4.4.1(supports-color@8.1.1)
5068 gensync: 1.0.0-beta.2
@@ -5088,14 +5074,14 @@ snapshots:
5074 '@babel/generator@7.28.0':
5075 dependencies:
5076 '@babel/parser': 7.28.0
5091 - '@babel/types': 7.28.0
5077 + '@babel/types': 7.28.1
5078 '@jridgewell/gen-mapping': 0.3.12
5079 '@jridgewell/trace-mapping': 0.3.29
5080 jsesc: 3.1.0
5081
5082 '@babel/helper-annotate-as-pure@7.27.3':
5083 dependencies:
5098 - '@babel/types': 7.28.0
5084 + '@babel/types': 7.28.1
5085
5086 '@babel/helper-compilation-targets@7.27.2':
5087 dependencies:
@@ -5123,14 +5109,14 @@ snapshots:
5109 '@babel/helper-member-expression-to-functions@7.27.1':
5110 dependencies:
5111 '@babel/traverse': 7.28.0
5126 - '@babel/types': 7.28.0
5112 + '@babel/types': 7.28.1
5113 transitivePeerDependencies:
5114 - supports-color
5115
5116 '@babel/helper-module-imports@7.27.1':
5117 dependencies:
5118 '@babel/traverse': 7.28.0
5133 - '@babel/types': 7.28.0
5119 + '@babel/types': 7.28.1
5120 transitivePeerDependencies:
5121 - supports-color
5122
@@ -5145,7 +5131,7 @@ snapshots:
5131
5132 '@babel/helper-optimise-call-expression@7.27.1':
5133 dependencies:
5148 - '@babel/types': 7.28.0
5134 + '@babel/types': 7.28.1
5135
5136 '@babel/helper-plugin-utils@7.27.1': {}
5137
@@ -5161,7 +5147,7 @@ snapshots:
5147 '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
5148 dependencies:
5149 '@babel/traverse': 7.28.0
5164 - '@babel/types': 7.28.0
5150 + '@babel/types': 7.28.1
5151 transitivePeerDependencies:
5152 - supports-color
5153
@@ -5174,11 +5160,11 @@ snapshots:
5160 '@babel/helpers@7.27.6':
5161 dependencies:
5162 '@babel/template': 7.27.2
5177 - '@babel/types': 7.28.0
5163 + '@babel/types': 7.28.1
5164
5165 '@babel/parser@7.28.0':
5166 dependencies:
5181 - '@babel/types': 7.28.0
5167 + '@babel/types': 7.28.1
5168
5169 '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.0)':
5170 dependencies:
@@ -5229,7 +5215,7 @@ snapshots:
5215 dependencies:
5216 '@babel/code-frame': 7.27.1
5217 '@babel/parser': 7.28.0
5232 - '@babel/types': 7.28.0
5218 + '@babel/types': 7.28.1
5219
5220 '@babel/traverse@7.28.0':
5221 dependencies:
@@ -5238,12 +5224,12 @@ snapshots:
5224 '@babel/helper-globals': 7.28.0
5225 '@babel/parser': 7.28.0
5226 '@babel/template': 7.27.2
5241 - '@babel/types': 7.28.0
5227 + '@babel/types': 7.28.1
5228 debug: 4.4.1(supports-color@8.1.1)
5229 transitivePeerDependencies:
5230 - supports-color
5231
5246 - '@babel/types@7.28.0':
5232 + '@babel/types@7.28.1':
5233 dependencies:
5234 '@babel/helper-string-parser': 7.27.1
5235 '@babel/helper-validator-identifier': 7.27.1
@@ -5263,14 +5249,14 @@ snapshots:
5249 dependencies:
5250 '@codemirror/language': 6.11.2
5251 '@codemirror/state': 6.5.2
5266 - '@codemirror/view': 6.38.0
5252 + '@codemirror/view': 6.38.1
5253 '@lezer/common': 1.2.3
5254
5255 '@codemirror/commands@6.8.1':
5256 dependencies:
5257 '@codemirror/language': 6.11.2
5258 '@codemirror/state': 6.5.2
5273 - '@codemirror/view': 6.38.0
5259 + '@codemirror/view': 6.38.1
5260 '@lezer/common': 1.2.3
5261
5262 '@codemirror/lang-javascript@6.2.4':
@@ -5279,7 +5265,7 @@ snapshots:
5265 '@codemirror/language': 6.11.2
5266 '@codemirror/lint': 6.8.5
5267 '@codemirror/state': 6.5.2
5282 - '@codemirror/view': 6.38.0
5268 + '@codemirror/view': 6.38.1
5269 '@lezer/common': 1.2.3
5270 '@lezer/javascript': 1.5.1
5271
@@ -5288,14 +5274,14 @@ snapshots:
5274 '@codemirror/autocomplete': 6.18.6
5275 '@codemirror/language': 6.11.2
5276 '@codemirror/state': 6.5.2
5291 - '@codemirror/view': 6.38.0
5277 + '@codemirror/view': 6.38.1
5278 '@lezer/common': 1.2.3
5279 '@lezer/xml': 1.0.6
5280
5281 '@codemirror/language@6.11.2':
5282 dependencies:
5283 '@codemirror/state': 6.5.2
5298 - '@codemirror/view': 6.38.0
5284 + '@codemirror/view': 6.38.1
5285 '@lezer/common': 1.2.3
5286 '@lezer/highlight': 1.2.1
5287 '@lezer/lr': 1.4.2
@@ -5304,13 +5290,13 @@ snapshots:
5290 '@codemirror/lint@6.8.5':
5291 dependencies:
5292 '@codemirror/state': 6.5.2
5307 - '@codemirror/view': 6.38.0
5293 + '@codemirror/view': 6.38.1
5294 crelt: 1.0.6
5295
5296 '@codemirror/search@6.5.11':
5297 dependencies:
5298 '@codemirror/state': 6.5.2
5313 - '@codemirror/view': 6.38.0
5299 + '@codemirror/view': 6.38.1
5300 crelt: 1.0.6
5301
5302 '@codemirror/state@6.5.2':
@@ -5321,10 +5307,10 @@ snapshots:
5307 dependencies:
5308 '@codemirror/language': 6.11.2
5309 '@codemirror/state': 6.5.2
5324 - '@codemirror/view': 6.38.0
5310 + '@codemirror/view': 6.38.1
5311 '@lezer/highlight': 1.2.1
5312
5327 - '@codemirror/view@6.38.0':
5313 + '@codemirror/view@6.38.1':
5314 dependencies:
5315 '@codemirror/state': 6.5.2
5316 crelt: 1.0.6
@@ -5335,9 +5321,9 @@ snapshots:
5321 dependencies:
5322 css-render: 0.15.14
5323
5338 - '@css-render/vue3-ssr@0.15.14(vue@3.5.17(typescript@5.8.3))':
5324 + '@css-render/vue3-ssr@0.15.14(vue@3.5.18(typescript@5.8.3))':
5325 dependencies:
5340 - vue: 3.5.17(typescript@5.8.3)
5326 + vue: 3.5.18(typescript@5.8.3)
5327
5328 '@csstools/color-helpers@5.0.2': {}
5329
@@ -5367,7 +5353,7 @@ snapshots:
5353 combined-stream: 1.0.8
5354 extend: 3.0.2
5355 forever-agent: 0.6.1
5370 - form-data: 4.0.3
5356 + form-data: 4.0.4
5357 http-signature: 1.4.0
5358 is-typedarray: 1.0.0
5359 isstream: 0.1.2
@@ -5392,7 +5378,7 @@ snapshots:
5378 '@es-joy/jsdoccomment@0.50.2':
5379 dependencies:
5380 '@types/estree': 1.0.8
5395 - '@typescript-eslint/types': 8.36.0
5381 + '@typescript-eslint/types': 8.38.0
5382 comment-parser: 1.4.1
5383 esquery: 1.6.0
5384 jsdoc-type-pratt-parser: 4.1.0
@@ -5400,105 +5386,105 @@ snapshots:
5386 '@es-joy/jsdoccomment@0.52.0':
5387 dependencies:
5388 '@types/estree': 1.0.8
5403 - '@typescript-eslint/types': 8.36.0
5389 + '@typescript-eslint/types': 8.38.0
5390 comment-parser: 1.4.1
5391 esquery: 1.6.0
5392 jsdoc-type-pratt-parser: 4.1.0
5393
5408 - '@esbuild/aix-ppc64@0.25.6':
5394 + '@esbuild/aix-ppc64@0.25.8':
5395 optional: true
5396
5411 - '@esbuild/android-arm64@0.25.6':
5397 + '@esbuild/android-arm64@0.25.8':
5398 optional: true
5399
5414 - '@esbuild/android-arm@0.25.6':
5400 + '@esbuild/android-arm@0.25.8':
5401 optional: true
5402
5417 - '@esbuild/android-x64@0.25.6':
5403 + '@esbuild/android-x64@0.25.8':
5404 optional: true
5405
5420 - '@esbuild/darwin-arm64@0.25.6':
5406 + '@esbuild/darwin-arm64@0.25.8':
5407 optional: true
5408
5423 - '@esbuild/darwin-x64@0.25.6':
5409 + '@esbuild/darwin-x64@0.25.8':
5410 optional: true
5411
5426 - '@esbuild/freebsd-arm64@0.25.6':
5412 + '@esbuild/freebsd-arm64@0.25.8':
5413 optional: true
5414
5429 - '@esbuild/freebsd-x64@0.25.6':
5415 + '@esbuild/freebsd-x64@0.25.8':
5416 optional: true
5417
5432 - '@esbuild/linux-arm64@0.25.6':
5418 + '@esbuild/linux-arm64@0.25.8':
5419 optional: true
5420
5435 - '@esbuild/linux-arm@0.25.6':
5421 + '@esbuild/linux-arm@0.25.8':
5422 optional: true
5423
5438 - '@esbuild/linux-ia32@0.25.6':
5424 + '@esbuild/linux-ia32@0.25.8':
5425 optional: true
5426
5441 - '@esbuild/linux-loong64@0.25.6':
5427 + '@esbuild/linux-loong64@0.25.8':
5428 optional: true
5429
5444 - '@esbuild/linux-mips64el@0.25.6':
5430 + '@esbuild/linux-mips64el@0.25.8':
5431 optional: true
5432
5447 - '@esbuild/linux-ppc64@0.25.6':
5433 + '@esbuild/linux-ppc64@0.25.8':
5434 optional: true
5435
5450 - '@esbuild/linux-riscv64@0.25.6':
5436 + '@esbuild/linux-riscv64@0.25.8':
5437 optional: true
5438
5453 - '@esbuild/linux-s390x@0.25.6':
5439 + '@esbuild/linux-s390x@0.25.8':
5440 optional: true
5441
5456 - '@esbuild/linux-x64@0.25.6':
5442 + '@esbuild/linux-x64@0.25.8':
5443 optional: true
5444
5459 - '@esbuild/netbsd-arm64@0.25.6':
5445 + '@esbuild/netbsd-arm64@0.25.8':
5446 optional: true
5447
5462 - '@esbuild/netbsd-x64@0.25.6':
5448 + '@esbuild/netbsd-x64@0.25.8':
5449 optional: true
5450
5465 - '@esbuild/openbsd-arm64@0.25.6':
5451 + '@esbuild/openbsd-arm64@0.25.8':
5452 optional: true
5453
5468 - '@esbuild/openbsd-x64@0.25.6':
5454 + '@esbuild/openbsd-x64@0.25.8':
5455 optional: true
5456
5471 - '@esbuild/openharmony-arm64@0.25.6':
5457 + '@esbuild/openharmony-arm64@0.25.8':
5458 optional: true
5459
5474 - '@esbuild/sunos-x64@0.25.6':
5460 + '@esbuild/sunos-x64@0.25.8':
5461 optional: true
5462
5477 - '@esbuild/win32-arm64@0.25.6':
5463 + '@esbuild/win32-arm64@0.25.8':
5464 optional: true
5465
5480 - '@esbuild/win32-ia32@0.25.6':
5466 + '@esbuild/win32-ia32@0.25.8':
5467 optional: true
5468
5483 - '@esbuild/win32-x64@0.25.6':
5469 + '@esbuild/win32-x64@0.25.8':
5470 optional: true
5471
5486 - '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.30.1(jiti@2.4.2))':
5472 + '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.31.0(jiti@2.4.2))':
5473 dependencies:
5474 escape-string-regexp: 4.0.0
5489 - eslint: 9.30.1(jiti@2.4.2)
5475 + eslint: 9.31.0(jiti@2.4.2)
5476 ignore: 5.3.2
5477
5492 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))':
5478 + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))':
5479 dependencies:
5494 - eslint: 9.30.1(jiti@2.4.2)
5480 + eslint: 9.31.0(jiti@2.4.2)
5481 eslint-visitor-keys: 3.4.3
5482
5483 '@eslint-community/regexpp@4.12.1': {}
5484
5499 - '@eslint/compat@1.3.1(eslint@9.30.1(jiti@2.4.2))':
5485 + '@eslint/compat@1.3.1(eslint@9.31.0(jiti@2.4.2))':
5486 optionalDependencies:
5501 - eslint: 9.30.1(jiti@2.4.2)
5487 + eslint: 9.31.0(jiti@2.4.2)
5488
5489 '@eslint/config-array@0.21.0':
5490 dependencies:
@@ -5510,14 +5496,6 @@ snapshots:
5496
5497 '@eslint/config-helpers@0.3.0': {}
5498
5513 - '@eslint/core@0.13.0':
5514 - dependencies:
5515 - '@types/json-schema': 7.0.15
5516 -
5517 - '@eslint/core@0.14.0':
5518 - dependencies:
5519 - '@types/json-schema': 7.0.15
5520 -
5499 '@eslint/core@0.15.1':
5500 dependencies:
5501 '@types/json-schema': 7.0.15
@@ -5536,12 +5514,12 @@ snapshots:
5514 transitivePeerDependencies:
5515 - supports-color
5516
5539 - '@eslint/js@9.30.1': {}
5517 + '@eslint/js@9.31.0': {}
5518
5541 - '@eslint/markdown@6.6.0':
5519 + '@eslint/markdown@7.1.0':
5520 dependencies:
5543 - '@eslint/core': 0.14.0
5544 - '@eslint/plugin-kit': 0.3.3
5521 + '@eslint/core': 0.15.1
5522 + '@eslint/plugin-kit': 0.3.4
5523 github-slugger: 2.0.0
5524 mdast-util-from-markdown: 2.0.2
5525 mdast-util-frontmatter: 2.0.1
@@ -5553,20 +5531,15 @@ snapshots:
5531
5532 '@eslint/object-schema@2.1.6': {}
5533
5556 - '@eslint/plugin-kit@0.2.8':
5557 - dependencies:
5558 - '@eslint/core': 0.13.0
5559 - levn: 0.4.1
5560 -
5561 - '@eslint/plugin-kit@0.3.3':
5534 + '@eslint/plugin-kit@0.3.4':
5535 dependencies:
5536 '@eslint/core': 0.15.1
5537 levn: 0.4.1
5538
5566 - '@f3ve/vue-markdown-it@0.2.3(vue@3.5.17(typescript@5.8.3))':
5539 + '@f3ve/vue-markdown-it@0.2.3(vue@3.5.18(typescript@5.8.3))':
5540 dependencies:
5541 markdown-it: 14.1.0
5569 - vue: 3.5.17(typescript@5.8.3)
5542 + vue: 3.5.18(typescript@5.8.3)
5543
5544 '@fontsource/jetbrains-mono@5.2.6': {}
5545
@@ -5595,28 +5568,22 @@ snapshots:
5568
5569 '@iconify/types@2.0.0': {}
5570
5598 - '@iconify/vue@5.0.0(vue@3.5.17(typescript@5.8.3))':
5571 + '@iconify/vue@5.0.0(vue@3.5.18(typescript@5.8.3))':
5572 dependencies:
5573 '@iconify/types': 2.0.0
5601 - vue: 3.5.17(typescript@5.8.3)
5574 + vue: 3.5.18(typescript@5.8.3)
5575
5603 - '@intlify/core-base@11.1.9':
5576 + '@intlify/core-base@11.1.11':
5577 dependencies:
5605 - '@intlify/message-compiler': 11.1.9
5606 - '@intlify/shared': 11.1.9
5578 + '@intlify/message-compiler': 11.1.11
5579 + '@intlify/shared': 11.1.11
5580
5608 - '@intlify/message-compiler@11.1.9':
5581 + '@intlify/message-compiler@11.1.11':
5582 dependencies:
5610 - '@intlify/shared': 11.1.9
5583 + '@intlify/shared': 11.1.11
5584 source-map-js: 1.2.1
5585
5613 - '@intlify/shared@11.1.9': {}
5614 -
5615 - '@isaacs/balanced-match@4.0.1': {}
5616 -
5617 - '@isaacs/brace-expansion@5.0.0':
5618 - dependencies:
5619 - '@isaacs/balanced-match': 4.0.1
5586 + '@intlify/shared@11.1.11': {}
5587
5588 '@isaacs/cliui@8.0.2':
5589 dependencies:
@@ -5683,9 +5650,9 @@ snapshots:
5650 '@nodelib/fs.scandir': 2.1.5
5651 fastq: 1.19.1
5652
5686 - '@nuxt/kit@3.17.6':
5653 + '@nuxt/kit@3.17.7':
5654 dependencies:
5688 - c12: 3.0.4
5655 + c12: 3.1.0
5656 consola: 3.4.2
5657 defu: 6.1.4
5658 destr: 2.0.5
@@ -5705,7 +5672,7 @@ snapshots:
5672 tinyglobby: 0.2.14
5673 ufo: 1.6.1
5674 unctx: 2.4.1
5708 - unimport: 5.1.0
5675 + unimport: 5.2.0
5676 untyped: 2.0.0
5677 transitivePeerDependencies:
5678 - magicast
@@ -5777,7 +5744,7 @@ snapshots:
5744 '@pkgjs/parseargs@0.11.0':
5745 optional: true
5746
5780 - '@pkgr/core@0.2.7': {}
5747 + '@pkgr/core@0.2.9': {}
5748
5749 '@polka/url@1.0.0-next.29': {}
5750
@@ -5787,110 +5754,110 @@ snapshots:
5754
5755 '@rolldown/pluginutils@1.0.0-beta.19': {}
5756
5790 - '@rolldown/pluginutils@1.0.0-beta.26': {}
5757 + '@rolldown/pluginutils@1.0.0-beta.29': {}
5758
5792 - '@rollup/pluginutils@5.2.0(rollup@4.44.2)':
5759 + '@rollup/pluginutils@5.2.0(rollup@4.45.1)':
5760 dependencies:
5761 '@types/estree': 1.0.8
5762 estree-walker: 2.0.2
5796 - picomatch: 4.0.2
5763 + picomatch: 4.0.3
5764 optionalDependencies:
5798 - rollup: 4.44.2
5765 + rollup: 4.45.1
5766
5800 - '@rollup/rollup-android-arm-eabi@4.44.2':
5767 + '@rollup/rollup-android-arm-eabi@4.45.1':
5768 optional: true
5769
5803 - '@rollup/rollup-android-arm64@4.44.2':
5770 + '@rollup/rollup-android-arm64@4.45.1':
5771 optional: true
5772
5806 - '@rollup/rollup-darwin-arm64@4.44.2':
5773 + '@rollup/rollup-darwin-arm64@4.45.1':
5774 optional: true
5775
5809 - '@rollup/rollup-darwin-x64@4.44.2':
5776 + '@rollup/rollup-darwin-x64@4.45.1':
5777 optional: true
5778
5812 - '@rollup/rollup-freebsd-arm64@4.44.2':
5779 + '@rollup/rollup-freebsd-arm64@4.45.1':
5780 optional: true
5781
5815 - '@rollup/rollup-freebsd-x64@4.44.2':
5782 + '@rollup/rollup-freebsd-x64@4.45.1':
5783 optional: true
5784
5818 - '@rollup/rollup-linux-arm-gnueabihf@4.44.2':
5785 + '@rollup/rollup-linux-arm-gnueabihf@4.45.1':
5786 optional: true
5787
5821 - '@rollup/rollup-linux-arm-musleabihf@4.44.2':
5788 + '@rollup/rollup-linux-arm-musleabihf@4.45.1':
5789 optional: true
5790
5824 - '@rollup/rollup-linux-arm64-gnu@4.44.2':
5791 + '@rollup/rollup-linux-arm64-gnu@4.45.1':
5792 optional: true
5793
5827 - '@rollup/rollup-linux-arm64-musl@4.44.2':
5794 + '@rollup/rollup-linux-arm64-musl@4.45.1':
5795 optional: true
5796
5830 - '@rollup/rollup-linux-loongarch64-gnu@4.44.2':
5797 + '@rollup/rollup-linux-loongarch64-gnu@4.45.1':
5798 optional: true
5799
5833 - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2':
5800 + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1':
5801 optional: true
5802
5836 - '@rollup/rollup-linux-riscv64-gnu@4.44.2':
5803 + '@rollup/rollup-linux-riscv64-gnu@4.45.1':
5804 optional: true
5805
5839 - '@rollup/rollup-linux-riscv64-musl@4.44.2':
5806 + '@rollup/rollup-linux-riscv64-musl@4.45.1':
5807 optional: true
5808
5842 - '@rollup/rollup-linux-s390x-gnu@4.44.2':
5809 + '@rollup/rollup-linux-s390x-gnu@4.45.1':
5810 optional: true
5811
5845 - '@rollup/rollup-linux-x64-gnu@4.44.2':
5812 + '@rollup/rollup-linux-x64-gnu@4.45.1':
5813 optional: true
5814
5848 - '@rollup/rollup-linux-x64-musl@4.44.2':
5815 + '@rollup/rollup-linux-x64-musl@4.45.1':
5816 optional: true
5817
5851 - '@rollup/rollup-win32-arm64-msvc@4.44.2':
5818 + '@rollup/rollup-win32-arm64-msvc@4.45.1':
5819 optional: true
5820
5854 - '@rollup/rollup-win32-ia32-msvc@4.44.2':
5821 + '@rollup/rollup-win32-ia32-msvc@4.45.1':
5822 optional: true
5823
5857 - '@rollup/rollup-win32-x64-msvc@4.44.2':
5824 + '@rollup/rollup-win32-x64-msvc@4.45.1':
5825 optional: true
5826
5827 '@sec-ant/readable-stream@0.4.1': {}
5828
5862 - '@shikijs/core@3.7.0':
5829 + '@shikijs/core@3.8.1':
5830 dependencies:
5864 - '@shikijs/types': 3.7.0
5831 + '@shikijs/types': 3.8.1
5832 '@shikijs/vscode-textmate': 10.0.2
5833 '@types/hast': 3.0.4
5834 hast-util-to-html: 9.0.5
5835
5869 - '@shikijs/engine-javascript@3.7.0':
5836 + '@shikijs/engine-javascript@3.8.1':
5837 dependencies:
5871 - '@shikijs/types': 3.7.0
5838 + '@shikijs/types': 3.8.1
5839 '@shikijs/vscode-textmate': 10.0.2
5840 oniguruma-to-es: 4.3.3
5841
5875 - '@shikijs/engine-oniguruma@3.7.0':
5842 + '@shikijs/engine-oniguruma@3.8.1':
5843 dependencies:
5877 - '@shikijs/types': 3.7.0
5844 + '@shikijs/types': 3.8.1
5845 '@shikijs/vscode-textmate': 10.0.2
5846
5880 - '@shikijs/langs@3.7.0':
5847 + '@shikijs/langs@3.8.1':
5848 dependencies:
5882 - '@shikijs/types': 3.7.0
5849 + '@shikijs/types': 3.8.1
5850
5884 - '@shikijs/markdown-it@3.7.0':
5851 + '@shikijs/markdown-it@3.8.1':
5852 dependencies:
5853 markdown-it: 14.1.0
5887 - shiki: 3.7.0
5854 + shiki: 3.8.1
5855
5889 - '@shikijs/themes@3.7.0':
5856 + '@shikijs/themes@3.8.1':
5857 dependencies:
5891 - '@shikijs/types': 3.7.0
5858 + '@shikijs/types': 3.8.1
5859
5893 - '@shikijs/types@3.7.0':
5860 + '@shikijs/types@3.8.1':
5861 dependencies:
5862 '@shikijs/vscode-textmate': 10.0.2
5863 '@types/hast': 3.0.4
@@ -5909,17 +5876,17 @@ snapshots:
5876
5877 '@singulio/app-auth-search@0.0.3':
5878 dependencies:
5912 - algoliasearch: 5.32.0
5879 + algoliasearch: 5.34.1
5880
5914 - '@stylistic/eslint-plugin@5.1.0(eslint@9.30.1(jiti@2.4.2))':
5881 + '@stylistic/eslint-plugin@5.2.2(eslint@9.31.0(jiti@2.4.2))':
5882 dependencies:
5916 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
5917 - '@typescript-eslint/types': 8.36.0
5918 - eslint: 9.30.1(jiti@2.4.2)
5883 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
5884 + '@typescript-eslint/types': 8.38.0
5885 + eslint: 9.31.0(jiti@2.4.2)
5886 eslint-visitor-keys: 4.2.1
5887 espree: 10.4.0
5888 estraverse: 5.3.0
5922 - picomatch: 4.0.2
5889 + picomatch: 4.0.3
5890
5891 '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.4)':
5892 dependencies:
@@ -6004,12 +5971,12 @@ snapshots:
5971 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11
5972 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11
5973
6007 - '@tailwindcss/vite@4.1.11(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
5974 + '@tailwindcss/vite@4.1.11(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
5975 dependencies:
5976 '@tailwindcss/node': 4.1.11
5977 '@tailwindcss/oxide': 4.1.11
5978 tailwindcss: 4.1.11
6012 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
5979 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
5980
5981 '@trysound/sax@0.2.0': {}
5982
@@ -6038,7 +6005,7 @@ snapshots:
6005 '@types/fs-extra@11.0.4':
6006 dependencies:
6007 '@types/jsonfile': 6.1.4
6041 - '@types/node': 24.0.13
6008 + '@types/node': 24.1.0
6009
6010 '@types/hast@3.0.4':
6011 dependencies:
@@ -6046,7 +6013,7 @@ snapshots:
6013
6014 '@types/jsdom@21.1.7':
6015 dependencies:
6049 - '@types/node': 24.0.13
6016 + '@types/node': 24.1.0
6017 '@types/tough-cookie': 4.0.5
6018 parse5: 7.3.0
6019
@@ -6054,7 +6021,7 @@ snapshots:
6021
6022 '@types/jsonfile@6.1.4':
6023 dependencies:
6057 - '@types/node': 24.0.13
6024 + '@types/node': 24.1.0
6025
6026 '@types/katex@0.16.7': {}
6027
@@ -6081,7 +6048,7 @@ snapshots:
6048
6049 '@types/ms@2.1.0': {}
6050
6084 - '@types/node@24.0.13':
6051 + '@types/node@24.1.0':
6052 dependencies:
6053 undici-types: 7.8.0
6054
@@ -6105,18 +6072,18 @@ snapshots:
6072
6073 '@types/yauzl@2.10.3':
6074 dependencies:
6108 - '@types/node': 24.0.13
6075 + '@types/node': 24.1.0
6076 optional: true
6077
6111 - '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)':
6078 + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)':
6079 dependencies:
6080 '@eslint-community/regexpp': 4.12.1
6114 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
6115 - '@typescript-eslint/scope-manager': 8.36.0
6116 - '@typescript-eslint/type-utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
6117 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
6118 - '@typescript-eslint/visitor-keys': 8.36.0
6119 - eslint: 9.30.1(jiti@2.4.2)
6081 + '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
6082 + '@typescript-eslint/scope-manager': 8.38.0
6083 + '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
6084 + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
6085 + '@typescript-eslint/visitor-keys': 8.38.0
6086 + eslint: 9.31.0(jiti@2.4.2)
6087 graphemer: 1.4.0
6088 ignore: 7.0.5
6089 natural-compare: 1.4.0
@@ -6125,55 +6092,56 @@ snapshots:
6092 transitivePeerDependencies:
6093 - supports-color
6094
6128 - '@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)':
6095 + '@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)':
6096 dependencies:
6130 - '@typescript-eslint/scope-manager': 8.36.0
6131 - '@typescript-eslint/types': 8.36.0
6132 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3)
6133 - '@typescript-eslint/visitor-keys': 8.36.0
6097 + '@typescript-eslint/scope-manager': 8.38.0
6098 + '@typescript-eslint/types': 8.38.0
6099 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
6100 + '@typescript-eslint/visitor-keys': 8.38.0
6101 debug: 4.4.1(supports-color@8.1.1)
6135 - eslint: 9.30.1(jiti@2.4.2)
6102 + eslint: 9.31.0(jiti@2.4.2)
6103 typescript: 5.8.3
6104 transitivePeerDependencies:
6105 - supports-color
6106
6140 - '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)':
6107 + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)':
6108 dependencies:
6142 - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3)
6143 - '@typescript-eslint/types': 8.36.0
6109 + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3)
6110 + '@typescript-eslint/types': 8.38.0
6111 debug: 4.4.1(supports-color@8.1.1)
6112 typescript: 5.8.3
6113 transitivePeerDependencies:
6114 - supports-color
6115
6149 - '@typescript-eslint/scope-manager@8.36.0':
6116 + '@typescript-eslint/scope-manager@8.38.0':
6117 dependencies:
6151 - '@typescript-eslint/types': 8.36.0
6152 - '@typescript-eslint/visitor-keys': 8.36.0
6118 + '@typescript-eslint/types': 8.38.0
6119 + '@typescript-eslint/visitor-keys': 8.38.0
6120
6154 - '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)':
6121 + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)':
6122 dependencies:
6123 typescript: 5.8.3
6124
6158 - '@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)':
6125 + '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)':
6126 dependencies:
6160 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3)
6161 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
6127 + '@typescript-eslint/types': 8.38.0
6128 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
6129 + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
6130 debug: 4.4.1(supports-color@8.1.1)
6163 - eslint: 9.30.1(jiti@2.4.2)
6131 + eslint: 9.31.0(jiti@2.4.2)
6132 ts-api-utils: 2.1.0(typescript@5.8.3)
6133 typescript: 5.8.3
6134 transitivePeerDependencies:
6135 - supports-color
6136
6169 - '@typescript-eslint/types@8.36.0': {}
6137 + '@typescript-eslint/types@8.38.0': {}
6138
6171 - '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)':
6139 + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)':
6140 dependencies:
6173 - '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3)
6174 - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3)
6175 - '@typescript-eslint/types': 8.36.0
6176 - '@typescript-eslint/visitor-keys': 8.36.0
6141 + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3)
6142 + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3)
6143 + '@typescript-eslint/types': 8.38.0
6144 + '@typescript-eslint/visitor-keys': 8.38.0
6145 debug: 4.4.1(supports-color@8.1.1)
6146 fast-glob: 3.3.3
6147 is-glob: 4.0.3
@@ -6184,48 +6152,48 @@ snapshots:
6152 transitivePeerDependencies:
6153 - supports-color
6154
6187 - '@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)':
6155 + '@typescript-eslint/utils@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)':
6156 dependencies:
6189 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
6190 - '@typescript-eslint/scope-manager': 8.36.0
6191 - '@typescript-eslint/types': 8.36.0
6192 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3)
6193 - eslint: 9.30.1(jiti@2.4.2)
6157 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
6158 + '@typescript-eslint/scope-manager': 8.38.0
6159 + '@typescript-eslint/types': 8.38.0
6160 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3)
6161 + eslint: 9.31.0(jiti@2.4.2)
6162 typescript: 5.8.3
6163 transitivePeerDependencies:
6164 - supports-color
6165
6198 - '@typescript-eslint/visitor-keys@8.36.0':
6166 + '@typescript-eslint/visitor-keys@8.38.0':
6167 dependencies:
6200 - '@typescript-eslint/types': 8.36.0
6168 + '@typescript-eslint/types': 8.38.0
6169 eslint-visitor-keys: 4.2.1
6170
6171 '@ungap/structured-clone@1.3.0': {}
6172
6205 - '@vitejs/plugin-vue-jsx@5.0.1(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))':
6173 + '@vitejs/plugin-vue-jsx@5.0.1(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))':
6174 dependencies:
6175 '@babel/core': 7.28.0
6176 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0)
6209 - '@rolldown/pluginutils': 1.0.0-beta.26
6177 + '@rolldown/pluginutils': 1.0.0-beta.29
6178 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0)
6211 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6212 - vue: 3.5.17(typescript@5.8.3)
6179 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6180 + vue: 3.5.18(typescript@5.8.3)
6181 transitivePeerDependencies:
6182 - supports-color
6183
6216 - '@vitejs/plugin-vue@6.0.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))':
6184 + '@vitejs/plugin-vue@6.0.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))':
6185 dependencies:
6186 '@rolldown/pluginutils': 1.0.0-beta.19
6219 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6220 - vue: 3.5.17(typescript@5.8.3)
6187 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6188 + vue: 3.5.18(typescript@5.8.3)
6189
6222 - '@vitest/eslint-plugin@1.3.4(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
6190 + '@vitest/eslint-plugin@1.3.4(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
6191 dependencies:
6224 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
6225 - eslint: 9.30.1(jiti@2.4.2)
6192 + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
6193 + eslint: 9.31.0(jiti@2.4.2)
6194 optionalDependencies:
6195 typescript: 5.8.3
6228 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6196 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6197 transitivePeerDependencies:
6198 - supports-color
6199
@@ -6237,13 +6205,13 @@ snapshots:
6205 chai: 5.2.1
6206 tinyrainbow: 2.0.0
6207
6240 - '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
6208 + '@vitest/mocker@3.2.4(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))':
6209 dependencies:
6210 '@vitest/spy': 3.2.4
6211 estree-walker: 3.0.3
6212 magic-string: 0.30.17
6213 optionalDependencies:
6246 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6214 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
6215
6216 '@vitest/pretty-format@3.2.4':
6217 dependencies:
@@ -6271,15 +6239,15 @@ snapshots:
6239 loupe: 3.1.4
6240 tinyrainbow: 2.0.0
6241
6274 - '@volar/language-core@2.4.17':
6242 + '@volar/language-core@2.4.20':
6243 dependencies:
6276 - '@volar/source-map': 2.4.17
6244 + '@volar/source-map': 2.4.20
6245
6278 - '@volar/source-map@2.4.17': {}
6246 + '@volar/source-map@2.4.20': {}
6247
6280 - '@volar/typescript@2.4.17':
6248 + '@volar/typescript@2.4.20':
6249 dependencies:
6282 - '@volar/language-core': 2.4.17
6250 + '@volar/language-core': 2.4.20
6251 path-browserify: 1.0.1
6252 vscode-uri: 3.1.0
6253
@@ -6292,10 +6260,10 @@ snapshots:
6260 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
6261 '@babel/template': 7.27.2
6262 '@babel/traverse': 7.28.0
6295 - '@babel/types': 7.28.0
6263 + '@babel/types': 7.28.1
6264 '@vue/babel-helper-vue-transform-on': 1.4.0
6265 '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.28.0)
6298 - '@vue/shared': 3.5.17
6266 + '@vue/shared': 3.5.18
6267 optionalDependencies:
6268 '@babel/core': 7.28.0
6269 transitivePeerDependencies:
@@ -6308,39 +6276,39 @@ snapshots:
6276 '@babel/helper-module-imports': 7.27.1
6277 '@babel/helper-plugin-utils': 7.27.1
6278 '@babel/parser': 7.28.0
6311 - '@vue/compiler-sfc': 3.5.17
6279 + '@vue/compiler-sfc': 3.5.18
6280 transitivePeerDependencies:
6281 - supports-color
6282
6315 - '@vue/compiler-core@3.5.17':
6283 + '@vue/compiler-core@3.5.18':
6284 dependencies:
6285 '@babel/parser': 7.28.0
6318 - '@vue/shared': 3.5.17
6286 + '@vue/shared': 3.5.18
6287 entities: 4.5.0
6288 estree-walker: 2.0.2
6289 source-map-js: 1.2.1
6290
6323 - '@vue/compiler-dom@3.5.17':
6291 + '@vue/compiler-dom@3.5.18':
6292 dependencies:
6325 - '@vue/compiler-core': 3.5.17
6326 - '@vue/shared': 3.5.17
6293 + '@vue/compiler-core': 3.5.18
6294 + '@vue/shared': 3.5.18
6295
6328 - '@vue/compiler-sfc@3.5.17':
6296 + '@vue/compiler-sfc@3.5.18':
6297 dependencies:
6298 '@babel/parser': 7.28.0
6331 - '@vue/compiler-core': 3.5.17
6332 - '@vue/compiler-dom': 3.5.17
6333 - '@vue/compiler-ssr': 3.5.17
6334 - '@vue/shared': 3.5.17
6299 + '@vue/compiler-core': 3.5.18
6300 + '@vue/compiler-dom': 3.5.18
6301 + '@vue/compiler-ssr': 3.5.18
6302 + '@vue/shared': 3.5.18
6303 estree-walker: 2.0.2
6304 magic-string: 0.30.17
6305 postcss: 8.5.6
6306 source-map-js: 1.2.1
6307
6340 - '@vue/compiler-ssr@3.5.17':
6308 + '@vue/compiler-ssr@3.5.18':
6309 dependencies:
6342 - '@vue/compiler-dom': 3.5.17
6343 - '@vue/shared': 3.5.17
6310 + '@vue/compiler-dom': 3.5.18
6311 + '@vue/shared': 3.5.18
6312
6313 '@vue/compiler-vue2@2.7.16':
6314 dependencies:
@@ -6353,22 +6321,22 @@ snapshots:
6321 dependencies:
6322 '@vue/devtools-kit': 7.7.7
6323
6356 - '@vue/devtools-core@7.7.7(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))':
6324 + '@vue/devtools-core@7.7.7(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))':
6325 dependencies:
6326 '@vue/devtools-kit': 7.7.7
6327 '@vue/devtools-shared': 7.7.7
6328 mitt: 3.0.1
6329 nanoid: 5.1.5
6330 pathe: 2.0.3
6363 - vite-hot-client: 2.1.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
6364 - vue: 3.5.17(typescript@5.8.3)
6331 + vite-hot-client: 2.1.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
6332 + vue: 3.5.18(typescript@5.8.3)
6333 transitivePeerDependencies:
6334 - vite
6335
6336 '@vue/devtools-kit@7.7.7':
6337 dependencies:
6338 '@vue/devtools-shared': 7.7.7
6371 - birpc: 2.4.0
6339 + birpc: 2.5.0
6340 hookable: 5.5.3
6341 mitt: 3.0.1
6342 perfect-debounce: 1.0.0
@@ -6379,79 +6347,79 @@ snapshots:
6347 dependencies:
6348 rfdc: 1.4.1
6349
6382 - '@vue/language-core@3.0.1(typescript@5.8.3)':
6350 + '@vue/language-core@3.0.3(typescript@5.8.3)':
6351 dependencies:
6384 - '@volar/language-core': 2.4.17
6385 - '@vue/compiler-dom': 3.5.17
6352 + '@volar/language-core': 2.4.20
6353 + '@vue/compiler-dom': 3.5.18
6354 '@vue/compiler-vue2': 2.7.16
6387 - '@vue/shared': 3.5.17
6355 + '@vue/shared': 3.5.18
6356 alien-signals: 2.0.5
6389 - minimatch: 10.0.3
6357 muggle-string: 0.4.1
6358 path-browserify: 1.0.1
6359 + picomatch: 4.0.3
6360 optionalDependencies:
6361 typescript: 5.8.3
6362
6395 - '@vue/reactivity@3.5.17':
6363 + '@vue/reactivity@3.5.18':
6364 dependencies:
6397 - '@vue/shared': 3.5.17
6365 + '@vue/shared': 3.5.18
6366
6399 - '@vue/runtime-core@3.5.17':
6367 + '@vue/runtime-core@3.5.18':
6368 dependencies:
6401 - '@vue/reactivity': 3.5.17
6402 - '@vue/shared': 3.5.17
6369 + '@vue/reactivity': 3.5.18
6370 + '@vue/shared': 3.5.18
6371
6404 - '@vue/runtime-dom@3.5.17':
6372 + '@vue/runtime-dom@3.5.18':
6373 dependencies:
6406 - '@vue/reactivity': 3.5.17
6407 - '@vue/runtime-core': 3.5.17
6408 - '@vue/shared': 3.5.17
6374 + '@vue/reactivity': 3.5.18
6375 + '@vue/runtime-core': 3.5.18
6376 + '@vue/shared': 3.5.18
6377 csstype: 3.1.3
6378
6411 - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))':
6379 + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.8.3))':
6380 dependencies:
6413 - '@vue/compiler-ssr': 3.5.17
6414 - '@vue/shared': 3.5.17
6415 - vue: 3.5.17(typescript@5.8.3)
6381 + '@vue/compiler-ssr': 3.5.18
6382 + '@vue/shared': 3.5.18
6383 + vue: 3.5.18(typescript@5.8.3)
6384
6417 - '@vue/shared@3.5.17': {}
6385 + '@vue/shared@3.5.18': {}
6386
6387 '@vue/test-utils@2.4.6':
6388 dependencies:
6389 js-beautify: 1.15.4
6390 vue-component-type-helpers: 2.2.12
6391
6424 - '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))':
6392 + '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3))':
6393 optionalDependencies:
6394 typescript: 5.8.3
6427 - vue: 3.5.17(typescript@5.8.3)
6395 + vue: 3.5.18(typescript@5.8.3)
6396
6429 - '@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))':
6397 + '@vueuse/core@13.5.0(vue@3.5.18(typescript@5.8.3))':
6398 dependencies:
6399 '@types/web-bluetooth': 0.0.21
6400 '@vueuse/metadata': 13.5.0
6433 - '@vueuse/shared': 13.5.0(vue@3.5.17(typescript@5.8.3))
6434 - vue: 3.5.17(typescript@5.8.3)
6401 + '@vueuse/shared': 13.5.0(vue@3.5.18(typescript@5.8.3))
6402 + vue: 3.5.18(typescript@5.8.3)
6403
6404 '@vueuse/metadata@13.5.0': {}
6405
6438 - '@vueuse/motion@3.0.3(vue@3.5.17(typescript@5.8.3))':
6406 + '@vueuse/motion@3.0.3(vue@3.5.18(typescript@5.8.3))':
6407 dependencies:
6440 - '@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3))
6441 - '@vueuse/shared': 13.5.0(vue@3.5.17(typescript@5.8.3))
6408 + '@vueuse/core': 13.5.0(vue@3.5.18(typescript@5.8.3))
6409 + '@vueuse/shared': 13.5.0(vue@3.5.18(typescript@5.8.3))
6410 defu: 6.1.4
6411 framesync: 6.1.2
6412 popmotion: 11.0.5
6413 style-value-types: 5.1.2
6446 - vue: 3.5.17(typescript@5.8.3)
6414 + vue: 3.5.18(typescript@5.8.3)
6415 optionalDependencies:
6448 - '@nuxt/kit': 3.17.6
6416 + '@nuxt/kit': 3.17.7
6417 transitivePeerDependencies:
6418 - magicast
6419
6452 - '@vueuse/shared@13.5.0(vue@3.5.17(typescript@5.8.3))':
6420 + '@vueuse/shared@13.5.0(vue@3.5.18(typescript@5.8.3))':
6421 dependencies:
6454 - vue: 3.5.17(typescript@5.8.3)
6422 + vue: 3.5.18(typescript@5.8.3)
6423
6424 '@yr/monotone-cubic-spline@1.0.3': {}
6425
@@ -6477,21 +6445,21 @@ snapshots:
6445 json-schema-traverse: 0.4.1
6446 uri-js: 4.4.1
6447
6480 - algoliasearch@5.32.0:
6481 - dependencies:
6482 - '@algolia/client-abtesting': 5.32.0
6483 - '@algolia/client-analytics': 5.32.0
6484 - '@algolia/client-common': 5.32.0
6485 - '@algolia/client-insights': 5.32.0
6486 - '@algolia/client-personalization': 5.32.0
6487 - '@algolia/client-query-suggestions': 5.32.0
6488 - '@algolia/client-search': 5.32.0
6489 - '@algolia/ingestion': 1.32.0
6490 - '@algolia/monitoring': 1.32.0
6491 - '@algolia/recommend': 5.32.0
6492 - '@algolia/requester-browser-xhr': 5.32.0
6493 - '@algolia/requester-fetch': 5.32.0
6494 - '@algolia/requester-node-http': 5.32.0
6448 + algoliasearch@5.34.1:
6449 + dependencies:
6450 + '@algolia/client-abtesting': 5.34.1
6451 + '@algolia/client-analytics': 5.34.1
6452 + '@algolia/client-common': 5.34.1
6453 + '@algolia/client-insights': 5.34.1
6454 + '@algolia/client-personalization': 5.34.1
6455 + '@algolia/client-query-suggestions': 5.34.1
6456 + '@algolia/client-search': 5.34.1
6457 + '@algolia/ingestion': 1.34.1
6458 + '@algolia/monitoring': 1.34.1
6459 + '@algolia/recommend': 5.34.1
6460 + '@algolia/requester-browser-xhr': 5.34.1
6461 + '@algolia/requester-fetch': 5.34.1
6462 + '@algolia/requester-node-http': 5.34.1
6463
6464 alien-signals@2.0.5: {}
6465
@@ -6513,7 +6481,7 @@ snapshots:
6481
6482 ansis@4.1.0: {}
6483
6516 - apexcharts@5.2.0:
6484 + apexcharts@5.3.1:
6485 dependencies:
6486 '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.4)
6487 '@svgdotjs/svg.filter.js': 3.0.9
@@ -6562,10 +6530,10 @@ snapshots:
6530
6531 aws4@1.13.2: {}
6532
6565 - axios@1.10.0(debug@4.4.1):
6533 + axios@1.11.0(debug@4.4.1):
6534 dependencies:
6535 follow-redirects: 1.15.9(debug@4.4.1)
6568 - form-data: 4.0.3
6536 + form-data: 4.0.4
6537 proxy-from-env: 1.1.0
6538 transitivePeerDependencies:
6539 - debug
@@ -6578,7 +6546,7 @@ snapshots:
6546 dependencies:
6547 tweetnacl: 0.14.5
6548
6581 - birpc@2.4.0: {}
6549 + birpc@2.5.0: {}
6550
6551 blob-util@2.0.2: {}
6552
@@ -6602,7 +6570,7 @@ snapshots:
6570 browserslist@4.25.1:
6571 dependencies:
6572 caniuse-lite: 1.0.30001727
6605 - electron-to-chromium: 1.5.182
6573 + electron-to-chromium: 1.5.190
6574 node-releases: 2.0.19
6575 update-browserslist-db: 1.1.3(browserslist@4.25.1)
6576
@@ -6621,7 +6589,7 @@ snapshots:
6589
6590 bytes@3.1.2: {}
6591
6624 - c12@3.0.4:
6592 + c12@3.1.0:
6593 dependencies:
6594 chokidar: 4.0.3
6595 confbox: 0.2.2
@@ -6676,6 +6644,8 @@ snapshots:
6644 ansi-styles: 4.3.0
6645 supports-color: 7.2.0
6646
6647 + change-case@5.4.4: {}
6648 +
6649 character-entities-html4@2.1.0: {}
6650
6651 character-entities-legacy@3.0.0: {}
@@ -6742,7 +6712,7 @@ snapshots:
6712 '@codemirror/lint': 6.8.5
6713 '@codemirror/search': 6.5.11
6714 '@codemirror/state': 6.5.2
6745 - '@codemirror/view': 6.38.0
6715 + '@codemirror/view': 6.38.1
6716
6717 color-convert@2.0.1:
6718 dependencies:
@@ -6857,7 +6827,7 @@ snapshots:
6827
6828 csstype@3.1.3: {}
6829
6860 - cypress@14.5.1:
6830 + cypress@14.5.2:
6831 dependencies:
6832 '@cypress/request': 3.0.8
6833 '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
@@ -6968,7 +6938,7 @@ snapshots:
6938 dependencies:
6939 '@babel/parser': 7.28.0
6940 '@babel/traverse': 7.28.0
6971 - '@vue/compiler-sfc': 3.5.17
6941 + '@vue/compiler-sfc': 3.5.18
6942 callsite: 1.0.0
6943 camelcase: 6.3.0
6944 cosmiconfig: 7.1.0
@@ -7061,7 +7031,7 @@ snapshots:
7031 minimatch: 9.0.1
7032 semver: 7.7.2
7033
7064 - electron-to-chromium@1.5.182: {}
7034 + electron-to-chromium@1.5.190: {}
7035
7036 emoji-regex@8.0.0: {}
7037
@@ -7113,34 +7083,34 @@ snapshots:
7083 has-tostringtag: 1.0.2
7084 hasown: 2.0.2
7085
7116 - esbuild@0.25.6:
7086 + esbuild@0.25.8:
7087 optionalDependencies:
7118 - '@esbuild/aix-ppc64': 0.25.6
7119 - '@esbuild/android-arm': 0.25.6
7120 - '@esbuild/android-arm64': 0.25.6
7121 - '@esbuild/android-x64': 0.25.6
7122 - '@esbuild/darwin-arm64': 0.25.6
7123 - '@esbuild/darwin-x64': 0.25.6
7124 - '@esbuild/freebsd-arm64': 0.25.6
7125 - '@esbuild/freebsd-x64': 0.25.6
7126 - '@esbuild/linux-arm': 0.25.6
7127 - '@esbuild/linux-arm64': 0.25.6
7128 - '@esbuild/linux-ia32': 0.25.6
7129 - '@esbuild/linux-loong64': 0.25.6
7130 - '@esbuild/linux-mips64el': 0.25.6
7131 - '@esbuild/linux-ppc64': 0.25.6
7132 - '@esbuild/linux-riscv64': 0.25.6
7133 - '@esbuild/linux-s390x': 0.25.6
7134 - '@esbuild/linux-x64': 0.25.6
7135 - '@esbuild/netbsd-arm64': 0.25.6
7136 - '@esbuild/netbsd-x64': 0.25.6
7137 - '@esbuild/openbsd-arm64': 0.25.6
7138 - '@esbuild/openbsd-x64': 0.25.6
7139 - '@esbuild/openharmony-arm64': 0.25.6
7140 - '@esbuild/sunos-x64': 0.25.6
7141 - '@esbuild/win32-arm64': 0.25.6
7142 - '@esbuild/win32-ia32': 0.25.6
7143 - '@esbuild/win32-x64': 0.25.6
7088 + '@esbuild/aix-ppc64': 0.25.8
7089 + '@esbuild/android-arm': 0.25.8
7090 + '@esbuild/android-arm64': 0.25.8
7091 + '@esbuild/android-x64': 0.25.8
7092 + '@esbuild/darwin-arm64': 0.25.8
7093 + '@esbuild/darwin-x64': 0.25.8
7094 + '@esbuild/freebsd-arm64': 0.25.8
7095 + '@esbuild/freebsd-x64': 0.25.8
7096 + '@esbuild/linux-arm': 0.25.8
7097 + '@esbuild/linux-arm64': 0.25.8
7098 + '@esbuild/linux-ia32': 0.25.8
7099 + '@esbuild/linux-loong64': 0.25.8
7100 + '@esbuild/linux-mips64el': 0.25.8
7101 + '@esbuild/linux-ppc64': 0.25.8
7102 + '@esbuild/linux-riscv64': 0.25.8
7103 + '@esbuild/linux-s390x': 0.25.8
7104 + '@esbuild/linux-x64': 0.25.8
7105 + '@esbuild/netbsd-arm64': 0.25.8
7106 + '@esbuild/netbsd-x64': 0.25.8
7107 + '@esbuild/openbsd-arm64': 0.25.8
7108 + '@esbuild/openbsd-x64': 0.25.8
7109 + '@esbuild/openharmony-arm64': 0.25.8
7110 + '@esbuild/sunos-x64': 0.25.8
7111 + '@esbuild/win32-arm64': 0.25.8
7112 + '@esbuild/win32-ia32': 0.25.8
7113 + '@esbuild/win32-x64': 0.25.8
7114
7115 escalade@3.2.0: {}
7116
@@ -7150,67 +7120,67 @@ snapshots:
7120
7121 escape-string-regexp@5.0.0: {}
7122
7153 - eslint-compat-utils@0.5.1(eslint@9.30.1(jiti@2.4.2)):
7123 + eslint-compat-utils@0.5.1(eslint@9.31.0(jiti@2.4.2)):
7124 dependencies:
7155 - eslint: 9.30.1(jiti@2.4.2)
7125 + eslint: 9.31.0(jiti@2.4.2)
7126 semver: 7.7.2
7127
7158 - eslint-compat-utils@0.6.5(eslint@9.30.1(jiti@2.4.2)):
7128 + eslint-compat-utils@0.6.5(eslint@9.31.0(jiti@2.4.2)):
7129 dependencies:
7160 - eslint: 9.30.1(jiti@2.4.2)
7130 + eslint: 9.31.0(jiti@2.4.2)
7131 semver: 7.7.2
7132
7163 - eslint-config-flat-gitignore@2.1.0(eslint@9.30.1(jiti@2.4.2)):
7133 + eslint-config-flat-gitignore@2.1.0(eslint@9.31.0(jiti@2.4.2)):
7134 dependencies:
7165 - '@eslint/compat': 1.3.1(eslint@9.30.1(jiti@2.4.2))
7166 - eslint: 9.30.1(jiti@2.4.2)
7135 + '@eslint/compat': 1.3.1(eslint@9.31.0(jiti@2.4.2))
7136 + eslint: 9.31.0(jiti@2.4.2)
7137
7138 eslint-flat-config-utils@2.1.0:
7139 dependencies:
7140 pathe: 2.0.3
7141
7172 - eslint-json-compat-utils@0.2.1(eslint@9.30.1(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
7142 + eslint-json-compat-utils@0.2.1(eslint@9.31.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
7143 dependencies:
7174 - eslint: 9.30.1(jiti@2.4.2)
7144 + eslint: 9.31.0(jiti@2.4.2)
7145 esquery: 1.6.0
7146 jsonc-eslint-parser: 2.4.0
7147
7178 - eslint-merge-processors@2.0.0(eslint@9.30.1(jiti@2.4.2)):
7148 + eslint-merge-processors@2.0.0(eslint@9.31.0(jiti@2.4.2)):
7149 dependencies:
7180 - eslint: 9.30.1(jiti@2.4.2)
7150 + eslint: 9.31.0(jiti@2.4.2)
7151
7182 - eslint-plugin-antfu@3.1.1(eslint@9.30.1(jiti@2.4.2)):
7152 + eslint-plugin-antfu@3.1.1(eslint@9.31.0(jiti@2.4.2)):
7153 dependencies:
7184 - eslint: 9.30.1(jiti@2.4.2)
7154 + eslint: 9.31.0(jiti@2.4.2)
7155
7186 - eslint-plugin-command@3.3.1(eslint@9.30.1(jiti@2.4.2)):
7156 + eslint-plugin-command@3.3.1(eslint@9.31.0(jiti@2.4.2)):
7157 dependencies:
7158 '@es-joy/jsdoccomment': 0.50.2
7189 - eslint: 9.30.1(jiti@2.4.2)
7159 + eslint: 9.31.0(jiti@2.4.2)
7160
7191 - eslint-plugin-es-x@7.8.0(eslint@9.30.1(jiti@2.4.2)):
7161 + eslint-plugin-es-x@7.8.0(eslint@9.31.0(jiti@2.4.2)):
7162 dependencies:
7193 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7163 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7164 '@eslint-community/regexpp': 4.12.1
7195 - eslint: 9.30.1(jiti@2.4.2)
7196 - eslint-compat-utils: 0.5.1(eslint@9.30.1(jiti@2.4.2))
7165 + eslint: 9.31.0(jiti@2.4.2)
7166 + eslint-compat-utils: 0.5.1(eslint@9.31.0(jiti@2.4.2))
7167
7198 - eslint-plugin-import-lite@0.3.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3):
7168 + eslint-plugin-import-lite@0.3.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3):
7169 dependencies:
7200 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7201 - '@typescript-eslint/types': 8.36.0
7202 - eslint: 9.30.1(jiti@2.4.2)
7170 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7171 + '@typescript-eslint/types': 8.38.0
7172 + eslint: 9.31.0(jiti@2.4.2)
7173 optionalDependencies:
7174 typescript: 5.8.3
7175
7206 - eslint-plugin-jsdoc@51.3.4(eslint@9.30.1(jiti@2.4.2)):
7176 + eslint-plugin-jsdoc@51.4.1(eslint@9.31.0(jiti@2.4.2)):
7177 dependencies:
7178 '@es-joy/jsdoccomment': 0.52.0
7179 are-docs-informative: 0.0.2
7180 comment-parser: 1.4.1
7181 debug: 4.4.1(supports-color@8.1.1)
7182 escape-string-regexp: 4.0.0
7213 - eslint: 9.30.1(jiti@2.4.2)
7183 + eslint: 9.31.0(jiti@2.4.2)
7184 espree: 10.4.0
7185 esquery: 1.6.0
7186 parse-imports-exports: 0.2.4
@@ -7219,26 +7189,26 @@ snapshots:
7189 transitivePeerDependencies:
7190 - supports-color
7191
7222 - eslint-plugin-jsonc@2.20.1(eslint@9.30.1(jiti@2.4.2)):
7192 + eslint-plugin-jsonc@2.20.1(eslint@9.31.0(jiti@2.4.2)):
7193 dependencies:
7224 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7225 - eslint: 9.30.1(jiti@2.4.2)
7226 - eslint-compat-utils: 0.6.5(eslint@9.30.1(jiti@2.4.2))
7227 - eslint-json-compat-utils: 0.2.1(eslint@9.30.1(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
7194 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7195 + eslint: 9.31.0(jiti@2.4.2)
7196 + eslint-compat-utils: 0.6.5(eslint@9.31.0(jiti@2.4.2))
7197 + eslint-json-compat-utils: 0.2.1(eslint@9.31.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
7198 espree: 10.4.0
7199 graphemer: 1.4.0
7200 jsonc-eslint-parser: 2.4.0
7201 natural-compare: 1.4.0
7232 - synckit: 0.11.8
7202 + synckit: 0.11.11
7203 transitivePeerDependencies:
7204 - '@eslint/json'
7205
7236 - eslint-plugin-n@17.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3):
7206 + eslint-plugin-n@17.21.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3):
7207 dependencies:
7238 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7208 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7209 enhanced-resolve: 5.18.2
7240 - eslint: 9.30.1(jiti@2.4.2)
7241 - eslint-plugin-es-x: 7.8.0(eslint@9.30.1(jiti@2.4.2))
7210 + eslint: 9.31.0(jiti@2.4.2)
7211 + eslint-plugin-es-x: 7.8.0(eslint@9.31.0(jiti@2.4.2))
7212 get-tsconfig: 4.10.1
7213 globals: 15.15.0
7214 ignore: 5.3.2
@@ -7250,56 +7220,57 @@ snapshots:
7220
7221 eslint-plugin-no-only-tests@3.3.0: {}
7222
7253 - eslint-plugin-perfectionist@4.15.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3):
7223 + eslint-plugin-perfectionist@4.15.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3):
7224 dependencies:
7255 - '@typescript-eslint/types': 8.36.0
7256 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
7257 - eslint: 9.30.1(jiti@2.4.2)
7225 + '@typescript-eslint/types': 8.38.0
7226 + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
7227 + eslint: 9.31.0(jiti@2.4.2)
7228 natural-orderby: 5.0.0
7229 transitivePeerDependencies:
7230 - supports-color
7231 - typescript
7232
7263 - eslint-plugin-pnpm@0.3.1(eslint@9.30.1(jiti@2.4.2)):
7233 + eslint-plugin-pnpm@1.1.0(eslint@9.31.0(jiti@2.4.2)):
7234 dependencies:
7265 - eslint: 9.30.1(jiti@2.4.2)
7235 + eslint: 9.31.0(jiti@2.4.2)
7236 find-up-simple: 1.0.1
7237 jsonc-eslint-parser: 2.4.0
7238 pathe: 2.0.3
7269 - pnpm-workspace-yaml: 0.3.1
7239 + pnpm-workspace-yaml: 1.1.0
7240 tinyglobby: 0.2.14
7241 yaml-eslint-parser: 1.3.0
7242
7273 - eslint-plugin-regexp@2.9.0(eslint@9.30.1(jiti@2.4.2)):
7243 + eslint-plugin-regexp@2.9.0(eslint@9.31.0(jiti@2.4.2)):
7244 dependencies:
7275 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7245 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7246 '@eslint-community/regexpp': 4.12.1
7247 comment-parser: 1.4.1
7278 - eslint: 9.30.1(jiti@2.4.2)
7248 + eslint: 9.31.0(jiti@2.4.2)
7249 jsdoc-type-pratt-parser: 4.1.0
7250 refa: 0.12.1
7251 regexp-ast-analysis: 0.7.1
7252 scslre: 0.3.0
7253
7284 - eslint-plugin-toml@0.12.0(eslint@9.30.1(jiti@2.4.2)):
7254 + eslint-plugin-toml@0.12.0(eslint@9.31.0(jiti@2.4.2)):
7255 dependencies:
7256 debug: 4.4.1(supports-color@8.1.1)
7287 - eslint: 9.30.1(jiti@2.4.2)
7288 - eslint-compat-utils: 0.6.5(eslint@9.30.1(jiti@2.4.2))
7257 + eslint: 9.31.0(jiti@2.4.2)
7258 + eslint-compat-utils: 0.6.5(eslint@9.31.0(jiti@2.4.2))
7259 lodash: 4.17.21
7260 toml-eslint-parser: 0.10.0
7261 transitivePeerDependencies:
7262 - supports-color
7263
7294 - eslint-plugin-unicorn@59.0.1(eslint@9.30.1(jiti@2.4.2)):
7264 + eslint-plugin-unicorn@60.0.0(eslint@9.31.0(jiti@2.4.2)):
7265 dependencies:
7266 '@babel/helper-validator-identifier': 7.27.1
7297 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7298 - '@eslint/plugin-kit': 0.2.8
7267 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7268 + '@eslint/plugin-kit': 0.3.4
7269 + change-case: 5.4.4
7270 ci-info: 4.3.0
7271 clean-regexp: 1.0.0
7272 core-js-compat: 3.44.0
7302 - eslint: 9.30.1(jiti@2.4.2)
7273 + eslint: 9.31.0(jiti@2.4.2)
7274 esquery: 1.6.0
7275 find-up-simple: 1.0.1
7276 globals: 16.3.0
@@ -7312,40 +7283,40 @@ snapshots:
7283 semver: 7.7.2
7284 strip-indent: 4.0.0
7285
7315 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)):
7286 + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2)):
7287 dependencies:
7317 - eslint: 9.30.1(jiti@2.4.2)
7288 + eslint: 9.31.0(jiti@2.4.2)
7289 optionalDependencies:
7319 - '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
7290 + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
7291
7321 - eslint-plugin-vue@10.3.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2))):
7292 + eslint-plugin-vue@10.3.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.4.2))):
7293 dependencies:
7323 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7324 - eslint: 9.30.1(jiti@2.4.2)
7294 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7295 + eslint: 9.31.0(jiti@2.4.2)
7296 natural-compare: 1.4.0
7297 nth-check: 2.1.1
7298 postcss-selector-parser: 6.1.2
7299 semver: 7.7.2
7329 - vue-eslint-parser: 10.2.0(eslint@9.30.1(jiti@2.4.2))
7300 + vue-eslint-parser: 10.2.0(eslint@9.31.0(jiti@2.4.2))
7301 xml-name-validator: 4.0.0
7302 optionalDependencies:
7332 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
7303 + '@typescript-eslint/parser': 8.38.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)
7304
7334 - eslint-plugin-yml@1.18.0(eslint@9.30.1(jiti@2.4.2)):
7305 + eslint-plugin-yml@1.18.0(eslint@9.31.0(jiti@2.4.2)):
7306 dependencies:
7307 debug: 4.4.1(supports-color@8.1.1)
7308 escape-string-regexp: 4.0.0
7338 - eslint: 9.30.1(jiti@2.4.2)
7339 - eslint-compat-utils: 0.6.5(eslint@9.30.1(jiti@2.4.2))
7309 + eslint: 9.31.0(jiti@2.4.2)
7310 + eslint-compat-utils: 0.6.5(eslint@9.31.0(jiti@2.4.2))
7311 natural-compare: 1.4.0
7312 yaml-eslint-parser: 1.3.0
7313 transitivePeerDependencies:
7314 - supports-color
7315
7345 - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2)):
7316 + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0(jiti@2.4.2)):
7317 dependencies:
7347 - '@vue/compiler-sfc': 3.5.17
7348 - eslint: 9.30.1(jiti@2.4.2)
7318 + '@vue/compiler-sfc': 3.5.18
7319 + eslint: 9.31.0(jiti@2.4.2)
7320
7321 eslint-scope@8.4.0:
7322 dependencies:
@@ -7356,16 +7327,16 @@ snapshots:
7327
7328 eslint-visitor-keys@4.2.1: {}
7329
7359 - eslint@9.30.1(jiti@2.4.2):
7330 + eslint@9.31.0(jiti@2.4.2):
7331 dependencies:
7361 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2))
7332 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2))
7333 '@eslint-community/regexpp': 4.12.1
7334 '@eslint/config-array': 0.21.0
7335 '@eslint/config-helpers': 0.3.0
7365 - '@eslint/core': 0.14.0
7336 + '@eslint/core': 0.15.1
7337 '@eslint/eslintrc': 3.3.1
7367 - '@eslint/js': 9.30.1
7368 - '@eslint/plugin-kit': 0.3.3
7338 + '@eslint/js': 9.31.0
7339 + '@eslint/plugin-kit': 0.3.4
7340 '@humanfs/node': 0.16.6
7341 '@humanwhocodes/module-importer': 1.0.1
7342 '@humanwhocodes/retry': 0.4.3
@@ -7539,9 +7510,9 @@ snapshots:
7510 dependencies:
7511 pend: 1.2.0
7512
7542 - fdir@6.4.6(picomatch@4.0.2):
7513 + fdir@6.4.6(picomatch@4.0.3):
7514 optionalDependencies:
7544 - picomatch: 4.0.2
7515 + picomatch: 4.0.3
7516
7517 figures@3.2.0:
7518 dependencies:
@@ -7595,7 +7566,7 @@ snapshots:
7566
7567 forever-agent@0.6.1: {}
7568
7598 - form-data@4.0.3:
7569 + form-data@4.0.4:
7570 dependencies:
7571 asynckit: 0.4.0
7572 combined-stream: 1.0.8
@@ -7937,7 +7908,7 @@ snapshots:
7908 '@sideway/formula': 3.0.1
7909 '@sideway/pinpoint': 2.0.0
7910
7940 - jose@6.0.11: {}
7911 + jose@6.0.12: {}
7912
7913 js-beautify@1.15.4:
7914 dependencies:
@@ -8531,10 +8502,6 @@ snapshots:
8502
8503 min-indent@1.0.1: {}
8504
8534 - minimatch@10.0.3:
8535 - dependencies:
8536 - '@isaacs/brace-expansion': 5.0.0
8537 -
8505 minimatch@3.1.2:
8506 dependencies:
8507 brace-expansion: 1.1.12
@@ -8584,10 +8551,10 @@ snapshots:
8551 arrify: 2.0.1
8552 minimatch: 3.1.2
8553
8587 - naive-ui@2.42.0(vue@3.5.17(typescript@5.8.3)):
8554 + naive-ui@2.42.0(vue@3.5.18(typescript@5.8.3)):
8555 dependencies:
8556 '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
8590 - '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3))
8557 + '@css-render/vue3-ssr': 0.15.14(vue@3.5.18(typescript@5.8.3))
8558 '@types/katex': 0.16.7
8559 '@types/lodash': 4.17.20
8560 '@types/lodash-es': 4.17.12
@@ -8602,10 +8569,10 @@ snapshots:
8569 lodash-es: 4.17.21
8570 seemly: 0.3.10
8571 treemate: 0.3.11
8605 - vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3))
8606 - vooks: 0.2.12(vue@3.5.17(typescript@5.8.3))
8607 - vue: 3.5.17(typescript@5.8.3)
8608 - vueuc: 0.4.64(vue@3.5.17(typescript@5.8.3))
8572 + vdirs: 0.1.8(vue@3.5.18(typescript@5.8.3))
8573 + vooks: 0.2.12(vue@3.5.18(typescript@5.8.3))
8574 + vue: 3.5.18(typescript@5.8.3)
8575 + vueuc: 0.4.64(vue@3.5.18(typescript@5.8.3))
8576
8577 nanoid@3.3.11: {}
8578
@@ -8633,7 +8600,7 @@ snapshots:
8600 ansi-styles: 6.2.1
8601 cross-spawn: 7.0.6
8602 memorystream: 0.3.1
8636 - picomatch: 4.0.2
8603 + picomatch: 4.0.3
8604 pidtree: 0.6.0
8605 read-package-json-fast: 4.0.0
8606 shell-quote: 1.8.3
@@ -8693,12 +8660,12 @@ snapshots:
8660 regex: 6.0.1
8661 regex-recursion: 6.0.2
8662
8696 - open@10.1.2:
8663 + open@10.2.0:
8664 dependencies:
8665 default-browser: 5.2.1
8666 define-lazy-prop: 3.0.0
8667 is-inside-container: 1.0.0
8701 - is-wsl: 3.1.0
8668 + wsl-utils: 0.1.0
8669
8670 open@8.4.2:
8671 dependencies:
@@ -8797,25 +8764,25 @@ snapshots:
8764
8765 picomatch@2.3.1: {}
8766
8800 - picomatch@4.0.2: {}
8767 + picomatch@4.0.3: {}
8768
8769 pidtree@0.6.0: {}
8770
8771 pify@2.3.0: {}
8772
8806 - pinia-plugin-persistedstate@4.4.1(@nuxt/kit@3.17.6)(pinia@3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))):
8773 + pinia-plugin-persistedstate@4.4.1(@nuxt/kit@3.17.7)(pinia@3.0.3(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3))):
8774 dependencies:
8775 deep-pick-omit: 1.2.1
8776 defu: 6.1.4
8777 destr: 2.0.5
8778 optionalDependencies:
8812 - '@nuxt/kit': 3.17.6
8813 - pinia: 3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
8779 + '@nuxt/kit': 3.17.7
8780 + pinia: 3.0.3(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3))
8781
8815 - pinia@3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)):
8782 + pinia@3.0.3(typescript@5.8.3)(vue@3.5.18(typescript@5.8.3)):
8783 dependencies:
8784 '@vue/devtools-api': 7.7.7
8818 - vue: 3.5.17(typescript@5.8.3)
8785 + vue: 3.5.18(typescript@5.8.3)
8786 optionalDependencies:
8787 typescript: 5.8.3
8788
@@ -8841,6 +8808,10 @@ snapshots:
8808 dependencies:
8809 yaml: 2.8.0
8810
8811 + pnpm-workspace-yaml@1.1.0:
8812 + dependencies:
8813 + yaml: 2.8.0
8814 +
8815 popmotion@11.0.5:
8816 dependencies:
8817 framesync: 6.1.2
@@ -8985,39 +8956,39 @@ snapshots:
8956
8957 rfdc@1.4.1: {}
8958
8988 - rollup-plugin-visualizer@5.14.0(rollup@4.44.2):
8959 + rollup-plugin-visualizer@5.14.0(rollup@4.45.1):
8960 dependencies:
8961 open: 8.4.2
8991 - picomatch: 4.0.2
8962 + picomatch: 4.0.3
8963 source-map: 0.7.4
8964 yargs: 17.7.2
8965 optionalDependencies:
8995 - rollup: 4.44.2
8966 + rollup: 4.45.1
8967
8997 - rollup@4.44.2:
8968 + rollup@4.45.1:
8969 dependencies:
8970 '@types/estree': 1.0.8
8971 optionalDependencies:
9001 - '@rollup/rollup-android-arm-eabi': 4.44.2
9002 - '@rollup/rollup-android-arm64': 4.44.2
9003 - '@rollup/rollup-darwin-arm64': 4.44.2
9004 - '@rollup/rollup-darwin-x64': 4.44.2
9005 - '@rollup/rollup-freebsd-arm64': 4.44.2
9006 - '@rollup/rollup-freebsd-x64': 4.44.2
9007 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.2
9008 - '@rollup/rollup-linux-arm-musleabihf': 4.44.2
9009 - '@rollup/rollup-linux-arm64-gnu': 4.44.2
9010 - '@rollup/rollup-linux-arm64-musl': 4.44.2
9011 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.2
9012 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2
9013 - '@rollup/rollup-linux-riscv64-gnu': 4.44.2
9014 - '@rollup/rollup-linux-riscv64-musl': 4.44.2
9015 - '@rollup/rollup-linux-s390x-gnu': 4.44.2
9016 - '@rollup/rollup-linux-x64-gnu': 4.44.2
9017 - '@rollup/rollup-linux-x64-musl': 4.44.2
9018 - '@rollup/rollup-win32-arm64-msvc': 4.44.2
9019 - '@rollup/rollup-win32-ia32-msvc': 4.44.2
9020 - '@rollup/rollup-win32-x64-msvc': 4.44.2
8972 + '@rollup/rollup-android-arm-eabi': 4.45.1
8973 + '@rollup/rollup-android-arm64': 4.45.1
8974 + '@rollup/rollup-darwin-arm64': 4.45.1
8975 + '@rollup/rollup-darwin-x64': 4.45.1
8976 + '@rollup/rollup-freebsd-arm64': 4.45.1
8977 + '@rollup/rollup-freebsd-x64': 4.45.1
8978 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1
8979 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1
8980 + '@rollup/rollup-linux-arm64-gnu': 4.45.1
8981 + '@rollup/rollup-linux-arm64-musl': 4.45.1
8982 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1
8983 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1
8984 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1
8985 + '@rollup/rollup-linux-riscv64-musl': 4.45.1
8986 + '@rollup/rollup-linux-s390x-gnu': 4.45.1
8987 + '@rollup/rollup-linux-x64-gnu': 4.45.1
8988 + '@rollup/rollup-linux-x64-musl': 4.45.1
8989 + '@rollup/rollup-win32-arm64-msvc': 4.45.1
8990 + '@rollup/rollup-win32-ia32-msvc': 4.45.1
8991 + '@rollup/rollup-win32-x64-msvc': 4.45.1
8992 fsevents: 2.3.3
8993
8994 rrweb-cssom@0.8.0: {}
@@ -9078,14 +9049,14 @@ snapshots:
9049
9050 shell-quote@1.8.3: {}
9051
9081 - shiki@3.7.0:
9052 + shiki@3.8.1:
9053 dependencies:
9083 - '@shikijs/core': 3.7.0
9084 - '@shikijs/engine-javascript': 3.7.0
9085 - '@shikijs/engine-oniguruma': 3.7.0
9086 - '@shikijs/langs': 3.7.0
9087 - '@shikijs/themes': 3.7.0
9088 - '@shikijs/types': 3.7.0
9054 + '@shikijs/core': 3.8.1
9055 + '@shikijs/engine-javascript': 3.8.1
9056 + '@shikijs/engine-oniguruma': 3.8.1
9057 + '@shikijs/langs': 3.8.1
9058 + '@shikijs/themes': 3.8.1
9059 + '@shikijs/types': 3.8.1
9060 '@shikijs/vscode-textmate': 10.0.2
9061 '@types/hast': 3.0.4
9062
@@ -9275,9 +9246,9 @@ snapshots:
9246
9247 symbol-tree@3.2.4: {}
9248
9278 - synckit@0.11.8:
9249 + synckit@0.11.11:
9250 dependencies:
9280 - '@pkgr/core': 0.2.7
9251 + '@pkgr/core': 0.2.9
9252
9253 tailwindcss@4.1.11: {}
9254
@@ -9307,11 +9278,11 @@ snapshots:
9278 unconfig: 7.3.2
9279 yaml: 2.8.0
9280
9310 - thememirror@2.0.1(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.0):
9281 + thememirror@2.0.1(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1):
9282 dependencies:
9283 '@codemirror/language': 6.11.2
9284 '@codemirror/state': 6.5.2
9314 - '@codemirror/view': 6.38.0
9285 + '@codemirror/view': 6.38.1
9286
9287 throttleit@1.0.1: {}
9288
@@ -9325,8 +9296,8 @@ snapshots:
9296
9297 tinyglobby@0.2.14:
9298 dependencies:
9328 - fdir: 6.4.6(picomatch@4.0.2)
9329 - picomatch: 4.0.2
9299 + fdir: 6.4.6(picomatch@4.0.3)
9300 + picomatch: 4.0.3
9301
9302 tinypool@1.1.1: {}
9303
@@ -9372,7 +9343,7 @@ snapshots:
9343
9344 ts-declaration-location@1.0.7(typescript@5.8.3):
9345 dependencies:
9375 - picomatch: 4.0.2
9346 + picomatch: 4.0.3
9347 typescript: 5.8.3
9348
9349 tslib@2.3.0: {}
@@ -9422,7 +9393,7 @@ snapshots:
9393
9394 unicorn-magic@0.3.0: {}
9395
9425 - unimport@5.1.0:
9396 + unimport@5.2.0:
9397 dependencies:
9398 acorn: 8.15.0
9399 escape-string-regexp: 5.0.0
@@ -9431,7 +9402,7 @@ snapshots:
9402 magic-string: 0.30.17
9403 mlly: 1.7.4
9404 pathe: 2.0.3
9434 - picomatch: 4.0.2
9405 + picomatch: 4.0.3
9406 pkg-types: 2.2.0
9407 scule: 1.3.0
9408 strip-literal: 3.0.0
@@ -9468,12 +9439,12 @@ snapshots:
9439 unplugin-utils@0.2.4:
9440 dependencies:
9441 pathe: 2.0.3
9471 - picomatch: 4.0.2
9442 + picomatch: 4.0.3
9443
9444 unplugin@2.3.5:
9445 dependencies:
9446 acorn: 8.15.0
9476 - picomatch: 4.0.2
9447 + picomatch: 4.0.3
9448 webpack-virtual-modules: 0.6.2
9449 optional: true
9450
@@ -9504,10 +9475,10 @@ snapshots:
9475
9476 validator@13.15.15: {}
9477
9507 - vdirs@0.1.8(vue@3.5.17(typescript@5.8.3)):
9478 + vdirs@0.1.8(vue@3.5.18(typescript@5.8.3)):
9479 dependencies:
9480 evtd: 0.2.4
9510 - vue: 3.5.17(typescript@5.8.3)
9481 + vue: 3.5.18(typescript@5.8.3)
9482
9483 verror@1.10.0:
9484 dependencies:
@@ -9525,34 +9496,34 @@ snapshots:
9496 '@types/unist': 3.0.3
9497 vfile-message: 4.0.2
9498
9528 - vite-bundle-visualizer@1.2.1(rollup@4.44.2):
9499 + vite-bundle-visualizer@1.2.1(rollup@4.45.1):
9500 dependencies:
9501 cac: 6.7.14
9502 import-from-esm: 1.3.4
9532 - rollup-plugin-visualizer: 5.14.0(rollup@4.44.2)
9503 + rollup-plugin-visualizer: 5.14.0(rollup@4.45.1)
9504 tmp: 0.2.3
9505 transitivePeerDependencies:
9506 - rolldown
9507 - rollup
9508 - supports-color
9509
9539 - vite-dev-rpc@1.1.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9510 + vite-dev-rpc@1.1.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9511 dependencies:
9541 - birpc: 2.4.0
9542 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9543 - vite-hot-client: 2.1.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9512 + birpc: 2.5.0
9513 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9514 + vite-hot-client: 2.1.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9515
9545 - vite-hot-client@2.1.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9516 + vite-hot-client@2.1.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9517 dependencies:
9547 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9518 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9519
9549 - vite-node@3.2.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9520 + vite-node@3.2.4(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9521 dependencies:
9522 cac: 6.7.14
9523 debug: 4.4.1(supports-color@8.1.1)
9524 es-module-lexer: 1.7.0
9525 pathe: 2.0.3
9555 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9526 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9527 transitivePeerDependencies:
9528 - '@types/node'
9529 - jiti
@@ -9567,58 +9538,58 @@ snapshots:
9538 - tsx
9539 - yaml
9540
9570 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.17.6)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9541 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.17.7)(rollup@4.45.1)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9542 dependencies:
9543 '@antfu/utils': 0.7.10
9573 - '@rollup/pluginutils': 5.2.0(rollup@4.44.2)
9544 + '@rollup/pluginutils': 5.2.0(rollup@4.45.1)
9545 debug: 4.4.1(supports-color@8.1.1)
9546 error-stack-parser-es: 0.1.5
9547 fs-extra: 11.3.0
9577 - open: 10.1.2
9548 + open: 10.2.0
9549 perfect-debounce: 1.0.0
9550 picocolors: 1.1.1
9551 sirv: 3.0.1
9581 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9552 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9553 optionalDependencies:
9583 - '@nuxt/kit': 3.17.6
9554 + '@nuxt/kit': 3.17.7
9555 transitivePeerDependencies:
9556 - rollup
9557 - supports-color
9558
9588 - vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9559 + vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.7)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9560 dependencies:
9561 ansis: 4.1.0
9562 debug: 4.4.1(supports-color@8.1.1)
9563 error-stack-parser-es: 1.0.5
9564 ohash: 2.0.11
9594 - open: 10.1.2
9565 + open: 10.2.0
9566 perfect-debounce: 1.0.0
9567 sirv: 3.0.1
9568 unplugin-utils: 0.2.4
9598 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9599 - vite-dev-rpc: 1.1.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9569 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9570 + vite-dev-rpc: 1.1.0(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9571 optionalDependencies:
9601 - '@nuxt/kit': 3.17.6
9572 + '@nuxt/kit': 3.17.7
9573 transitivePeerDependencies:
9574 - supports-color
9575
9605 - vite-plugin-vue-devtools@7.7.7(@nuxt/kit@3.17.6)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)):
9576 + vite-plugin-vue-devtools@7.7.7(@nuxt/kit@3.17.7)(rollup@4.45.1)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3)):
9577 dependencies:
9607 - '@vue/devtools-core': 7.7.7(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))
9578 + '@vue/devtools-core': 7.7.7(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3))
9579 '@vue/devtools-kit': 7.7.7
9580 '@vue/devtools-shared': 7.7.7
9581 execa: 9.6.0
9582 sirv: 3.0.1
9612 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9613 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.17.6)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9614 - vite-plugin-vue-inspector: 5.3.2(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9583 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9584 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.17.7)(rollup@4.45.1)(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9585 + vite-plugin-vue-inspector: 5.3.2(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9586 transitivePeerDependencies:
9587 - '@nuxt/kit'
9588 - rollup
9589 - supports-color
9590 - vue
9591
9621 - vite-plugin-vue-inspector@5.3.2(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9592 + vite-plugin-vue-inspector@5.3.2(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)):
9593 dependencies:
9594 '@babel/core': 7.28.0
9595 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.0)
@@ -9626,39 +9597,39 @@ snapshots:
9597 '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0)
9598 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0)
9599 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0)
9629 - '@vue/compiler-dom': 3.5.17
9600 + '@vue/compiler-dom': 3.5.18
9601 kolorist: 1.8.0
9602 magic-string: 0.30.17
9632 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9603 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9604 transitivePeerDependencies:
9605 - supports-color
9606
9636 - vite-svg-loader@5.1.0(vue@3.5.17(typescript@5.8.3)):
9607 + vite-svg-loader@5.1.0(vue@3.5.18(typescript@5.8.3)):
9608 dependencies:
9609 svgo: 3.3.2
9639 - vue: 3.5.17(typescript@5.8.3)
9610 + vue: 3.5.18(typescript@5.8.3)
9611
9641 - vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9612 + vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9613 dependencies:
9643 - esbuild: 0.25.6
9644 - fdir: 6.4.6(picomatch@4.0.2)
9645 - picomatch: 4.0.2
9614 + esbuild: 0.25.8
9615 + fdir: 6.4.6(picomatch@4.0.3)
9616 + picomatch: 4.0.3
9617 postcss: 8.5.6
9647 - rollup: 4.44.2
9618 + rollup: 4.45.1
9619 tinyglobby: 0.2.14
9620 optionalDependencies:
9650 - '@types/node': 24.0.13
9621 + '@types/node': 24.1.0
9622 fsevents: 2.3.3
9623 jiti: 2.4.2
9624 lightningcss: 1.30.1
9625 sass: 1.89.2
9626 yaml: 2.8.0
9627
9657 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9628 + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0):
9629 dependencies:
9630 '@types/chai': 5.2.2
9631 '@vitest/expect': 3.2.4
9661 - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9632 + '@vitest/mocker': 3.2.4(vite@7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0))
9633 '@vitest/pretty-format': 3.2.4
9634 '@vitest/runner': 3.2.4
9635 '@vitest/snapshot': 3.2.4
@@ -9669,19 +9640,19 @@ snapshots:
9640 expect-type: 1.2.2
9641 magic-string: 0.30.17
9642 pathe: 2.0.3
9672 - picomatch: 4.0.2
9643 + picomatch: 4.0.3
9644 std-env: 3.9.0
9645 tinybench: 2.9.0
9646 tinyexec: 0.3.2
9647 tinyglobby: 0.2.14
9648 tinypool: 1.1.1
9649 tinyrainbow: 2.0.0
9679 - vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9680 - vite-node: 3.2.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9650 + vite: 7.0.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9651 + vite-node: 3.2.4(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(yaml@2.8.0)
9652 why-is-node-running: 2.3.0
9653 optionalDependencies:
9654 '@types/debug': 4.1.12
9684 - '@types/node': 24.0.13
9655 + '@types/node': 24.1.0
9656 jsdom: 26.1.0
9657 transitivePeerDependencies:
9658 - jiti
@@ -9697,35 +9668,35 @@ snapshots:
9668 - tsx
9669 - yaml
9670
9700 - vooks@0.2.12(vue@3.5.17(typescript@5.8.3)):
9671 + vooks@0.2.12(vue@3.5.18(typescript@5.8.3)):
9672 dependencies:
9673 evtd: 0.2.4
9703 - vue: 3.5.17(typescript@5.8.3)
9674 + vue: 3.5.18(typescript@5.8.3)
9675
9676 vscode-uri@3.1.0: {}
9677
9707 - vue-advanced-cropper@2.8.9(vue@3.5.17(typescript@5.8.3)):
9678 + vue-advanced-cropper@2.8.9(vue@3.5.18(typescript@5.8.3)):
9679 dependencies:
9680 classnames: 2.5.1
9681 debounce: 1.2.1
9682 easy-bem: 1.1.1
9712 - vue: 3.5.17(typescript@5.8.3)
9683 + vue: 3.5.18(typescript@5.8.3)
9684
9714 - vue-codemirror@6.1.1(codemirror@6.0.2)(vue@3.5.17(typescript@5.8.3)):
9685 + vue-codemirror@6.1.1(codemirror@6.0.2)(vue@3.5.18(typescript@5.8.3)):
9686 dependencies:
9687 '@codemirror/commands': 6.8.1
9688 '@codemirror/language': 6.11.2
9689 '@codemirror/state': 6.5.2
9719 - '@codemirror/view': 6.38.0
9690 + '@codemirror/view': 6.38.1
9691 codemirror: 6.0.2
9721 - vue: 3.5.17(typescript@5.8.3)
9692 + vue: 3.5.18(typescript@5.8.3)
9693
9694 vue-component-type-helpers@2.2.12: {}
9695
9725 - vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2)):
9696 + vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.4.2)):
9697 dependencies:
9698 debug: 4.4.1(supports-color@8.1.1)
9728 - eslint: 9.30.1(jiti@2.4.2)
9699 + eslint: 9.31.0(jiti@2.4.2)
9700 eslint-scope: 8.4.0
9701 eslint-visitor-keys: 4.2.1
9702 espree: 10.4.0
@@ -9734,67 +9705,67 @@ snapshots:
9705 transitivePeerDependencies:
9706 - supports-color
9707
9737 - vue-highlight-words@3.0.1(vue@3.5.17(typescript@5.8.3)):
9708 + vue-highlight-words@3.0.1(vue@3.5.18(typescript@5.8.3)):
9709 dependencies:
9710 highlight-words-core: 1.2.3
9740 - vue: 3.5.17(typescript@5.8.3)
9711 + vue: 3.5.18(typescript@5.8.3)
9712
9742 - vue-i18n@11.1.9(vue@3.5.17(typescript@5.8.3)):
9713 + vue-i18n@11.1.11(vue@3.5.18(typescript@5.8.3)):
9714 dependencies:
9744 - '@intlify/core-base': 11.1.9
9745 - '@intlify/shared': 11.1.9
9715 + '@intlify/core-base': 11.1.11
9716 + '@intlify/shared': 11.1.11
9717 '@vue/devtools-api': 6.6.4
9747 - vue: 3.5.17(typescript@5.8.3)
9718 + vue: 3.5.18(typescript@5.8.3)
9719
9749 - vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)):
9720 + vue-router@4.5.1(vue@3.5.18(typescript@5.8.3)):
9721 dependencies:
9722 '@vue/devtools-api': 6.6.4
9752 - vue: 3.5.17(typescript@5.8.3)
9723 + vue: 3.5.18(typescript@5.8.3)
9724
9754 - vue-sjv@0.0.6(vue@3.5.17(typescript@5.8.3)):
9725 + vue-sjv@0.0.6(vue@3.5.18(typescript@5.8.3)):
9726 dependencies:
9756 - vue: 3.5.17(typescript@5.8.3)
9727 + vue: 3.5.18(typescript@5.8.3)
9728
9758 - vue-tsc@3.0.1(typescript@5.8.3):
9729 + vue-tsc@3.0.3(typescript@5.8.3):
9730 dependencies:
9760 - '@volar/typescript': 2.4.17
9761 - '@vue/language-core': 3.0.1(typescript@5.8.3)
9731 + '@volar/typescript': 2.4.20
9732 + '@vue/language-core': 3.0.3(typescript@5.8.3)
9733 typescript: 5.8.3
9734
9764 - vue3-apexcharts@1.8.0(apexcharts@5.2.0)(vue@3.5.17(typescript@5.8.3)):
9735 + vue3-apexcharts@1.8.0(apexcharts@5.3.1)(vue@3.5.18(typescript@5.8.3)):
9736 dependencies:
9766 - apexcharts: 5.2.0
9767 - vue: 3.5.17(typescript@5.8.3)
9737 + apexcharts: 5.3.1
9738 + vue: 3.5.18(typescript@5.8.3)
9739
9769 - vue3-marquee@4.2.2(vue@3.5.17(typescript@5.8.3)):
9740 + vue3-marquee@4.2.2(vue@3.5.18(typescript@5.8.3)):
9741 dependencies:
9771 - vue: 3.5.17(typescript@5.8.3)
9742 + vue: 3.5.18(typescript@5.8.3)
9743
9773 - vue@3.5.17(typescript@5.8.3):
9744 + vue@3.5.18(typescript@5.8.3):
9745 dependencies:
9775 - '@vue/compiler-dom': 3.5.17
9776 - '@vue/compiler-sfc': 3.5.17
9777 - '@vue/runtime-dom': 3.5.17
9778 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3))
9779 - '@vue/shared': 3.5.17
9746 + '@vue/compiler-dom': 3.5.18
9747 + '@vue/compiler-sfc': 3.5.18
9748 + '@vue/runtime-dom': 3.5.18
9749 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.8.3))
9750 + '@vue/shared': 3.5.18
9751 optionalDependencies:
9752 typescript: 5.8.3
9753
9783 - vuedraggable@4.1.0(vue@3.5.17(typescript@5.8.3)):
9754 + vuedraggable@4.1.0(vue@3.5.18(typescript@5.8.3)):
9755 dependencies:
9756 sortablejs: 1.14.0
9786 - vue: 3.5.17(typescript@5.8.3)
9757 + vue: 3.5.18(typescript@5.8.3)
9758
9788 - vueuc@0.4.64(vue@3.5.17(typescript@5.8.3)):
9759 + vueuc@0.4.64(vue@3.5.18(typescript@5.8.3)):
9760 dependencies:
9790 - '@css-render/vue3-ssr': 0.15.14(vue@3.5.17(typescript@5.8.3))
9761 + '@css-render/vue3-ssr': 0.15.14(vue@3.5.18(typescript@5.8.3))
9762 '@juggle/resize-observer': 3.4.0
9763 css-render: 0.15.14
9764 evtd: 0.2.4
9765 seemly: 0.3.10
9795 - vdirs: 0.1.8(vue@3.5.17(typescript@5.8.3))
9796 - vooks: 0.2.12(vue@3.5.17(typescript@5.8.3))
9797 - vue: 3.5.17(typescript@5.8.3)
9766 + vdirs: 0.1.8(vue@3.5.18(typescript@5.8.3))
9767 + vooks: 0.2.12(vue@3.5.18(typescript@5.8.3))
9768 + vue: 3.5.18(typescript@5.8.3)
9769
9770 w3c-keyname@2.2.8: {}
9771
@@ -9804,7 +9775,7 @@ snapshots:
9775
9776 wait-on@8.0.3(debug@4.4.1):
9777 dependencies:
9807 - axios: 1.10.0(debug@4.4.1)
9778 + axios: 1.11.0(debug@4.4.1)
9779 joi: 17.13.3
9780 lodash: 4.17.21
9781 minimist: 1.2.8
@@ -9869,15 +9840,19 @@ snapshots:
9840
9841 ws@8.18.3: {}
9842
9843 + wsl-utils@0.1.0:
9844 + dependencies:
9845 + is-wsl: 3.1.0
9846 +
9847 xml-name-validator@4.0.0: {}
9848
9849 xml-name-validator@5.0.0: {}
9850
9851 xmlchars@2.2.0: {}
9852
9878 - xmllint-wasm@5.0.0(@types/node@24.0.13):
9853 + xmllint-wasm@5.0.0(@types/node@24.1.0):
9854 dependencies:
9880 - '@types/node': 24.0.13
9855 + '@types/node': 24.1.0
9856
9857 xmllint@0.1.1: {}
9858
frontend/src/App.vue
+2
@@ -19,6 +19,7 @@
19
20 <SplashScreen :show="loading" />
21 <SearchDialog v-if="isLogged" />
22 + <ChatButton v-if="isLogged" />
23 </Provider>
24 </template>
25
@@ -33,6 +34,7 @@ import Blank from "@/app-layouts/Blank"
34 import Provider from "@/app-layouts/common/Provider.vue"
35 import SplashScreen from "@/app-layouts/common/SplashScreen.vue"
36 import HorizontalNav from "@/app-layouts/HorizontalNav"
37 +import ChatButton from "@/components/aiChatbot/ChatButton.vue"
38 import SearchDialog from "@/components/common/SearchDialog.vue"
39 import { useAuthStore } from "@/stores/auth"
40 import { useMainStore } from "@/stores/main"
frontend/src/api/endpoints/copilotMCP.ts new
+38
@@ -0,0 +1,38 @@
1 +import type { ExampleQuestion, MCPServer, QueryResult } from "@/types/copilotMCP.d"
2 +import type { FlaskBaseResponse } from "@/types/flask.d"
3 +import { HttpClient } from "../httpClient"
4 +
5 +export interface QueryPayload {
6 + input: string
7 + mcp_server: string
8 + verbose?: boolean
9 +}
10 +
11 +export default {
12 + getAvailableServers() {
13 + return HttpClient.get<FlaskBaseResponse & { servers: MCPServer[]; total_servers: number }>(
14 + `/copilot_mcp/servers`
15 + )
16 + },
17 + getServerDetails(server: string) {
18 + return HttpClient.get<
19 + FlaskBaseResponse & {
20 + servers: MCPServer[]
21 + available_categories: string[]
22 + total_example_questions: number
23 + }
24 + >(`/copilot_mcp/servers/${server}`)
25 + },
26 + query(payload: QueryPayload, signal?: AbortSignal) {
27 + return HttpClient.post<FlaskBaseResponse & QueryResult>(`/copilot_mcp/query`, payload, signal ? { signal } : {})
28 + },
29 + getExampleQuestions(server: string) {
30 + return HttpClient.get<
31 + FlaskBaseResponse & { mcp_server: string; questions: ExampleQuestion[]; total_questions: number }
32 + >(`/copilot_mcp/example-questions`, {
33 + params: {
34 + mcp_server: server
35 + }
36 + })
37 + }
38 +}
frontend/src/api/index.ts
+3 -1
@@ -6,6 +6,7 @@ import askSocfortress from "./endpoints/askSocfortress"
6 import auth from "./endpoints/auth"
7 import cloudSecurityAssessment from "./endpoints/cloudSecurityAssessment"
8 import connectors from "./endpoints/connectors"
9 +import copilotMCP from "./endpoints/copilotMCP"
10 import customers from "./endpoints/customers"
11 import flow from "./endpoints/flow"
12 import graylog from "./endpoints/graylog"
@@ -61,5 +62,6 @@ export default {
62 sysmonConfig,
63 wazuh,
64 portainer,
64 - shuffle
65 + shuffle,
66 + copilotMCP
67 }
frontend/src/app-layouts/common/Toolbar/Toolbar.vue
+1 -1
@@ -24,12 +24,12 @@
24 </template>
25
26 <script lang="ts" setup>
27 +import BlurEffect from "@/components/common/BlurEffect.vue"
28 import Icon from "@/components/common/Icon.vue"
29 import { useLoadingBarSetup } from "@/composables/useLoadingBarSetup"
30 import { useThemeStore } from "@/stores/theme"
31 import Logo from "../Logo.vue"
32 import Avatar from "./Avatar.vue"
32 -import BlurEffect from "./BlurEffect.vue"
33 import Breadcrumb from "./Breadcrumb.vue"
34 import FullscreenSwitch from "./FullscreenSwitch.vue"
35 import Notifications from "./Notifications.vue"
frontend/src/components/activeResponse/ActiveResponseDetails.vue
+1 -3
@@ -2,9 +2,7 @@
2 <div class="active-response-details">
3 <n-spin :show="loadingActiveResponse" class="min-h-48">
4 <template v-if="activeResponseDetails?.markdown_content">
5 - <Suspense>
6 - <Markdown :source="activeResponseDetails.markdown_content" />
7 - </Suspense>
5 + <Markdown :source="activeResponseDetails.markdown_content" />
6 </template>
7 <template v-else>
8 <n-empty v-if="!loadingActiveResponse" description="No description found" class="h-48 justify-center" />
frontend/src/components/aiChatbot/ChatBubble.vue new
+191
@@ -0,0 +1,191 @@
1 +<template>
2 + <div
3 + class="group flex flex-col gap-0.5"
4 + :class="{
5 + 'items-end text-right': entity.sender === 'user'
6 + }"
7 + >
8 + <template v-if="entity.sender === 'server'">
9 + <div class="text-secondary inline-flex items-center gap-1 text-sm font-semibold">
10 + <span>{{ entity.server }}:</span>
11 +
12 + <span
13 + v-if="thought && isThoughtVisible"
14 + class="text-tertiary inline-flex cursor-pointer items-center gap-1"
15 + @click="isThoughtCollapsed = !isThoughtCollapsed"
16 + >
17 + {{ isThinking ? "thinking..." : "thought" }}
18 +
19 + <Icon
20 + name="carbon:chevron-right"
21 + :size="14"
22 + class="transition-transform"
23 + :class="{ 'rotate-90': !isThoughtCollapsed }"
24 + />
25 + </span>
26 +
27 + <div
28 + v-if="isCopySupported"
29 + class="pointer-events-none ml-1 flex items-center opacity-0 transition-opacity duration-300 group-hover:pointer-events-auto group-hover:opacity-100"
30 + >
31 + <n-tooltip>
32 + <template #trigger>
33 + <n-button size="tiny" text @click="copyLink()">
34 + <template #icon>
35 + <Icon name="carbon:copy" :size="13" />
36 + </template>
37 + </n-button>
38 + </template>
39 + <div class="text-xs">{{ showCopyTooltip ? "Copied!" : "Copy" }}</div>
40 + </n-tooltip>
41 + </div>
42 + </div>
43 +
44 + <div v-if="thought && isThoughtVisible">
45 + <CollapseKeepAlive :show="!isThoughtCollapsed">
46 + <div class="text-secondary bg-secondary mb-2 rounded-md p-2 [&_*]:text-[10px]">
47 + <Markdown :source="thought" class="animate-fade" />
48 + </div>
49 + </CollapseKeepAlive>
50 + </div>
51 + <div v-if="body && isBodyVisible" class="[&_*:last-child]:mb-0! [&_*]:text-sm [&_*]:text-white">
52 + <Markdown :source="body" class="animate-fade" />
53 + </div>
54 + </template>
55 +
56 + <template v-if="entity.sender === 'user'">
57 + <div class="flex items-end justify-end gap-3 pl-6">
58 + <div
59 + class="pointer-events-none mb-1 flex items-center gap-3 opacity-0 transition-opacity duration-300 group-hover:pointer-events-auto group-hover:opacity-100"
60 + >
61 + <div v-if="isCopySupported" class="flex items-center">
62 + <n-tooltip>
63 + <template #trigger>
64 + <n-button size="tiny" text @click="copyLink()">
65 + <template #icon>
66 + <Icon name="carbon:copy" :size="13" />
67 + </template>
68 + </n-button>
69 + </template>
70 + <div class="text-xs">{{ showCopyTooltip ? "Copied!" : "Copy" }}</div>
71 + </n-tooltip>
72 + </div>
73 + <div class="flex items-center">
74 + <n-tooltip>
75 + <template #trigger>
76 + <n-button size="tiny" text @click="handleEdit()">
77 + <template #icon>
78 + <Icon name="carbon:edit" :size="13" />
79 + </template>
80 + </n-button>
81 + </template>
82 + <div class="text-xs">Edit</div>
83 + </n-tooltip>
84 + </div>
85 + </div>
86 + <div class="bg-secondary [&_*:last-child]:mb-0! rounded-lg px-2 py-1 text-sm [&_*]:text-white">
87 + <Markdown :source="entity.body" class="animate-fade" />
88 + </div>
89 + </div>
90 + </template>
91 +
92 + <div class="text-tertiary mt-1 text-xs">
93 + {{ formatDate(entity.datetime, dFormats.datetime) }}
94 + </div>
95 + </div>
96 +</template>
97 +
98 +<script setup lang="ts">
99 +import type { Ref } from "vue"
100 +import { useClipboard } from "@vueuse/core"
101 +import { NButton, NTooltip } from "naive-ui"
102 +import { onMounted, ref } from "vue"
103 +import CollapseKeepAlive from "@/components/common/CollapseKeepAlive.vue"
104 +import Icon from "@/components/common/Icon.vue"
105 +import Markdown from "@/components/common/Markdown.vue"
106 +import { useSettingsStore } from "@/stores/settings"
107 +import { formatDate } from "@/utils"
108 +
109 +export interface ChatBubble {
110 + id: string
111 + datetime: Date
112 + body: string
113 + thought?: string
114 + server: string
115 + new?: boolean
116 + sender: "user" | "server"
117 +}
118 +
119 +const { entity } = defineProps<{ entity: ChatBubble }>()
120 +
121 +const emit = defineEmits<{
122 + (e: "update"): void
123 + (e: "edit"): void
124 +}>()
125 +
126 +const dFormats = useSettingsStore().dateFormat
127 +const { copy: copyLink, copied: showCopyTooltip, isSupported: isCopySupported } = useClipboard({ source: entity.body })
128 +
129 +const isThinking = ref(false)
130 +const isThoughtCollapsed = ref(false)
131 +const isThoughtVisible = ref(false)
132 +const isBodyVisible = ref(false)
133 +
134 +const thought = ref("")
135 +const body = ref("")
136 +
137 +function startTypingEffect(text: string, variable: Ref<string>, duration = 2000) {
138 + variable.value = ""
139 +
140 + const totalChars = text.length
141 + if (totalChars === 0) return
142 +
143 + const delay = duration / totalChars
144 + let currentIndex = 0
145 +
146 + const interval = setInterval(() => {
147 + variable.value += text[currentIndex]
148 + currentIndex++
149 +
150 + if (currentIndex >= totalChars) {
151 + clearInterval(interval)
152 + emit("update")
153 + }
154 + }, delay)
155 +}
156 +
157 +function setAnimation() {
158 + if (entity.new) {
159 + if (entity.thought) {
160 + isThinking.value = true
161 + isThoughtVisible.value = true
162 + startTypingEffect(entity.thought, thought, 2000)
163 + setTimeout(() => {
164 + isThinking.value = false
165 + isBodyVisible.value = true
166 + startTypingEffect(entity.body, body, 4000)
167 + }, 2000)
168 + } else {
169 + isBodyVisible.value = true
170 + startTypingEffect(entity.body, body, 4000)
171 + }
172 + } else {
173 + if (entity.thought) {
174 + isThoughtCollapsed.value = true
175 + isThoughtVisible.value = true
176 + thought.value = entity.thought
177 + }
178 +
179 + isBodyVisible.value = true
180 + body.value = entity.body
181 + }
182 +}
183 +
184 +function handleEdit() {
185 + emit("edit")
186 +}
187 +
188 +onMounted(() => {
189 + setAnimation()
190 +})
191 +</script>
frontend/src/components/aiChatbot/ChatButton.vue new
+59
@@ -0,0 +1,59 @@
1 +<template>
2 + <div>
3 + <div class="ai-chatbot-button-wrapper w-15 fixed bottom-10 right-0 h-10" @click="showDrawer = true">
4 + <n-tooltip trigger="hover" placement="left">
5 + <template #trigger>
6 + <n-float-button type="primary" class="ai-chatbot-button">
7 + <Icon name="carbon:chat-bot" />
8 + </n-float-button>
9 + </template>
10 +
11 + AI Chatbot
12 + </n-tooltip>
13 + </div>
14 +
15 + <n-drawer
16 + v-model:show="showDrawer"
17 + :width="400"
18 + class="max-w-[90vw]"
19 + display-directive="show"
20 + :trap-focus="false"
21 + >
22 + <n-drawer-content title="AI Chatbot" closable body-content-class="p-0! overflow-hidden! flex flex-col">
23 + <ChatContainer class="grow" />
24 + </n-drawer-content>
25 + </n-drawer>
26 + </div>
27 +</template>
28 +
29 +<script setup lang="ts">
30 +import { NDrawer, NDrawerContent, NFloatButton, NTooltip } from "naive-ui"
31 +import { ref } from "vue"
32 +import Icon from "@/components/common/Icon.vue"
33 +import ChatContainer from "./ChatContainer.vue"
34 +
35 +const showDrawer = ref(false)
36 +</script>
37 +
38 +<style lang="scss" scoped>
39 +.ai-chatbot-button-wrapper {
40 + .ai-chatbot-button {
41 + transition: all 0.25s var(--bezier-ease);
42 + right: 20px;
43 +
44 + :deep() {
45 + .n-float-button__body {
46 + display: flex;
47 + align-items: start;
48 + padding-left: 11px;
49 + }
50 + }
51 + }
52 + &:not(:hover) {
53 + .ai-chatbot-button {
54 + width: 54px !important;
55 + right: -20px;
56 + }
57 + }
58 +}
59 +</style>
frontend/src/components/aiChatbot/ChatContainer.vue new
+194
@@ -0,0 +1,194 @@
1 +<template>
2 + <div class="flex flex-col overflow-hidden">
3 + <div class="relative grow overflow-hidden">
4 + <n-scrollbar ref="scrollbar">
5 + <div v-if="list.length" class="pb-50 flex flex-col gap-6 p-4">
6 + <ChatBubbleBlock
7 + v-for="item of list"
8 + :key="item.id"
9 + class="animate-fade"
10 + :entity="item"
11 + @update="scrollChat()"
12 + @edit="editMessage(item)"
13 + />
14 + <div v-if="loading" class="animate-fade">
15 + <Icon name="svg-spinners:pulse-rings-3" :size="20" />
16 + </div>
17 + </div>
18 + <div v-else class="text-secondary flex flex-col items-center justify-center py-12 text-center">
19 + <p class="text-lg">
20 + Your chat is empty.
21 + <br />
22 + Ask your first question!
23 + </p>
24 + </div>
25 + </n-scrollbar>
26 + <CollapseKeepAlive :show="!input && options.showQuestions && !!server" class="absolute! bottom-0">
27 + <ChatQuestions v-if="server" :server @select="input = $event" />
28 + </CollapseKeepAlive>
29 + </div>
30 + <div class="flex flex-col">
31 + <ChatQuery
32 + v-model:input="input"
33 + :edit-message-body="editMessageContext?.body || null"
34 + :loading
35 + @cancel-edit="handleCancelEdit()"
36 + @update-options="options = $event"
37 + @message="sendQuery"
38 + @select-server="server = $event"
39 + @server-loaded="serverLoadedHandler()"
40 + @stop="stopQuery()"
41 + />
42 + </div>
43 + </div>
44 +</template>
45 +
46 +<script setup lang="ts">
47 +import type { RemovableRef } from "@vueuse/core"
48 +import type { ScrollbarInst } from "naive-ui"
49 +import type { ChatBubble } from "./ChatBubble.vue"
50 +import type { Message } from "./ChatQuery.vue"
51 +import { useStorage } from "@vueuse/core"
52 +import axios from "axios"
53 +import { NScrollbar, useMessage } from "naive-ui"
54 +import { nanoid } from "nanoid"
55 +import { nextTick, onBeforeMount, onMounted, ref } from "vue"
56 +import Api from "@/api"
57 +import CollapseKeepAlive from "@/components/common/CollapseKeepAlive.vue"
58 +import Icon from "@/components/common/Icon.vue"
59 +import { secureLocalStorage } from "@/utils/secure-storage"
60 +import ChatBubbleBlock from "./ChatBubble.vue"
61 +import ChatQuery from "./ChatQuery.vue"
62 +import ChatQuestions from "./ChatQuestions.vue"
63 +
64 +const message = useMessage()
65 +
66 +const list: RemovableRef<ChatBubble[]> = useStorage<ChatBubble[]>(
67 + "ai-chatbot-list-messages",
68 + [],
69 + secureLocalStorage({ session: true })
70 +)
71 +const loading = ref(false)
72 +const server = ref<string | null>(null)
73 +const input = ref<string | null>(null)
74 +const options = ref<{ verbose: boolean; showQuestions: boolean }>({ verbose: false, showQuestions: false })
75 +const scrollbar = ref<ScrollbarInst | null>(null)
76 +const editMessageContext = ref<ChatBubble | null>(null)
77 +
78 +let abortController: AbortController | null = null
79 +
80 +function scrollChat() {
81 + nextTick(() => {
82 + scrollbar.value?.scrollTo({ top: 99999999999999, behavior: "smooth" })
83 + })
84 +}
85 +
86 +function serverLoadedHandler() {
87 + setTimeout(() => {
88 + scrollChat()
89 + }, 500)
90 +}
91 +
92 +function setAllOld() {
93 + list.value.forEach(o => (o.new = false))
94 +}
95 +
96 +function addBubble(payload: Omit<ChatBubble, "datetime" | "id">) {
97 + setAllOld()
98 + list.value.push({ ...payload, datetime: new Date(), id: nanoid(), new: true })
99 + scrollChat()
100 +}
101 +
102 +function editMessage(item: ChatBubble) {
103 + editMessageContext.value = item
104 + input.value = item.body
105 +}
106 +
107 +function handleCancelEdit() {
108 + editMessageContext.value = null
109 +}
110 +
111 +function stopQuery() {
112 + abortController?.abort()
113 +}
114 +
115 +function updateChatFromEdit(id: string) {
116 + const index = list.value.findIndex(item => item.id === id)
117 + if (index !== -1) {
118 + list.value.splice(index)
119 + }
120 +}
121 +
122 +function sendQuery(payload: Message) {
123 + if (editMessageContext.value) {
124 + updateChatFromEdit(editMessageContext.value.id)
125 + editMessageContext.value = null
126 + }
127 +
128 + addBubble({
129 + body: payload.input,
130 + server: payload.server,
131 + sender: "user"
132 + })
133 +
134 + loading.value = true
135 +
136 + abortController = new AbortController()
137 +
138 + Api.copilotMCP
139 + .query(
140 + {
141 + input: payload.input,
142 + mcp_server: payload.server,
143 + verbose: payload.verbose
144 + },
145 + abortController.signal
146 + )
147 + .then(res => {
148 + if (res.data.success) {
149 + let body = `${res.data.result}`
150 +
151 + if (typeof res.data.result !== "string" && "response" in res.data.result) {
152 + body = res.data.result.response
153 + }
154 + if (res.data.structured_result?.response) {
155 + body = res.data.structured_result.response
156 + }
157 +
158 + let thought
159 +
160 + if (typeof res.data.result !== "string" && "thinking_process" in res.data.result) {
161 + thought = res.data.result.thinking_process
162 + }
163 + if (res.data.structured_result?.thinking_process) {
164 + thought = res.data.structured_result.thinking_process
165 + }
166 +
167 + addBubble({
168 + body,
169 + thought,
170 + server: payload.server,
171 + sender: "server"
172 + })
173 + } else {
174 + message.warning(res.data?.message || "An error occurred. Please try again later.")
175 + }
176 + })
177 + .catch(err => {
178 + if (!axios.isCancel(err)) {
179 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
180 + }
181 + })
182 + .finally(() => {
183 + loading.value = false
184 + })
185 +}
186 +
187 +onBeforeMount(() => {
188 + setAllOld()
189 +})
190 +
191 +onMounted(() => {
192 + scrollChat()
193 +})
194 +</script>
frontend/src/components/aiChatbot/ChatQuery.vue new
+221
@@ -0,0 +1,221 @@
1 +<template>
2 + <n-collapse-transition :show="!!servers.length">
3 + <div class="p-4">
4 + <div class="relative flex flex-col overflow-hidden">
5 + <div
6 + v-if="!!editMessageBody"
7 + class="bg-secondary hover:text-primary mb-2 flex cursor-pointer items-center gap-2 rounded-lg px-2 py-2 text-sm transition-colors duration-200"
8 + @click="handleCancelEdit()"
9 + >
10 + <Icon name="carbon:close" :size="20" />
11 + <div>Edit message</div>
12 + </div>
13 + <n-input
14 + v-model:value.trim="input"
15 + class="max-h-full min-h-20 pb-9"
16 + type="textarea"
17 + placeholder="How can I help you?"
18 + :autosize="{
19 + minRows: 3,
20 + maxRows: 18
21 + }"
22 + />
23 + <div class="absolute bottom-0 left-0 right-0 flex items-center justify-between p-2 pr-3">
24 + <div class="flex items-center gap-2.5">
25 + <n-select
26 + v-model:value="selectedServer"
27 + :options="serverOptions"
28 + :render-option="renderOption"
29 + size="tiny"
30 + :consistent-menu-width="false"
31 + class="w-auto!"
32 + />
33 + <n-popover v-if="selectedServer && selectedServerDetails" trigger="hover" class="p-0!">
34 + <template #trigger>
35 + <Icon name="carbon:help" :size="14" class="cursor-help" />
36 + </template>
37 + <div class="divide-border divide-y-1 flex flex-col">
38 + <div class="flex flex-col gap-1 px-3 py-2 text-sm">
39 + <div>{{ selectedServerDetails.name }}</div>
40 + <div class="text-secondary text-xs">
41 + {{ selectedServerDetails.description }}
42 + </div>
43 + <div
44 + v-if="selectedServerDetails.capabilities.length"
45 + class="my-1 flex flex-wrap gap-1"
46 + >
47 + <n-tag
48 + v-for="item of selectedServerDetails.capabilities"
49 + :key="item"
50 + size="small"
51 + class="[&_.n-tag\_\_content]:leading-0 text-[10px] [&_.n-tag\_\_content]:pb-0.5"
52 + >
53 + {{ item }}
54 + </n-tag>
55 + </div>
56 + </div>
57 + </div>
58 + </n-popover>
59 + <n-popover trigger="hover" class="p-0!">
60 + <template #trigger>
61 + <Icon name="carbon:settings-adjust" :size="14" />
62 + </template>
63 + <div class="divide-border divide-y-1 flex flex-col">
64 + <div class="px-3 py-2">
65 + <div class="flex items-center gap-2 text-sm">
66 + <div>verbose response</div>
67 + <n-switch v-model:value="verbose" size="small" />
68 + </div>
69 + </div>
70 + <div class="px-3 py-2">
71 + <div class="flex items-center gap-2 text-sm">
72 + <div>show example questions</div>
73 + <n-switch v-model:value="showQuestions" size="small" />
74 + </div>
75 + </div>
76 + </div>
77 + </n-popover>
78 + </div>
79 + <n-button
80 + circle
81 + size="small"
82 + secondary
83 + :type="isFormValid ? 'primary' : undefined"
84 + :disabled="!isFormValid && !loading"
85 + @click="loading ? stop() : send()"
86 + >
87 + <Icon :name="loading ? 'carbon:stop-filled-alt' : 'carbon:arrow-up'" />
88 + </n-button>
89 + </div>
90 + </div>
91 + </div>
92 + </n-collapse-transition>
93 +</template>
94 +
95 +<script setup lang="ts">
96 +import type { RemovableRef } from "@vueuse/core"
97 +import type { SelectOption } from "naive-ui"
98 +import type { VNode } from "vue"
99 +import type { MCPServer } from "@/types/copilotMCP.d"
100 +import { useStorage } from "@vueuse/core"
101 +import _trim from "lodash/trim"
102 +import { NButton, NCollapseTransition, NInput, NPopover, NSelect, NSwitch, NTag, NTooltip, useMessage } from "naive-ui"
103 +import { computed, h, onBeforeMount, ref, toRefs, watch } from "vue"
104 +import Api from "@/api"
105 +import Icon from "@/components/common/Icon.vue"
106 +
107 +export interface Message {
108 + input: string
109 + verbose: boolean
110 + server: string
111 +}
112 +
113 +const props = defineProps<{ loading?: boolean; editMessageBody?: string | null }>()
114 +
115 +const emit = defineEmits<{
116 + (e: "message", value: Message): void
117 + (e: "select-server", value: string): void
118 + (e: "update-options", value: { verbose: boolean; showQuestions: boolean }): void
119 + (e: "stop"): void
120 + (e: "server-loaded"): void
121 + (e: "cancel-edit"): void
122 +}>()
123 +
124 +const { loading, editMessageBody } = toRefs(props)
125 +const input = defineModel<string | null>("input", { default: null })
126 +const verbose: RemovableRef<boolean> = useStorage<boolean>("ai-chatbot-option-verbose", false, localStorage)
127 +const showQuestions: RemovableRef<boolean> = useStorage<boolean>("ai-chatbot-option-questions", true, localStorage)
128 +const loadingServers = ref(false)
129 +const message = useMessage()
130 +const servers = ref<MCPServer[]>([])
131 +const selectedServer: RemovableRef<string | null> = useStorage<string | null>(
132 + "ai-chatbot-selected-server",
133 + null,
134 + localStorage
135 +)
136 +const serverOptions = computed(() => servers.value.map(o => ({ ...o, label: o.name })))
137 +const selectedServerDetails = computed(() => servers.value.find(o => o.value === selectedServer.value))
138 +const isFormValid = computed(() => !!_trim(input.value || ""))
139 +
140 +function renderOption({ node, option }: { node: VNode; option: SelectOption }) {
141 + return h(
142 + NTooltip,
143 + { placement: "right", class: "max-w-40 text-xs!" },
144 + {
145 + trigger: () => node,
146 + default: () => option.description
147 + }
148 + )
149 +}
150 +
151 +function getList() {
152 + loadingServers.value = true
153 +
154 + Api.copilotMCP
155 + .getAvailableServers()
156 + .then(res => {
157 + if (res.data.success) {
158 + servers.value = res.data?.servers || []
159 + if (servers.value.length && !selectedServer.value) {
160 + selectedServer.value = servers.value[0].value
161 + }
162 + emit("server-loaded")
163 + } else {
164 + message.warning(res.data?.message || "An error occurred. Please try again later.")
165 + }
166 + })
167 + .catch(err => {
168 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
169 + })
170 + .finally(() => {
171 + loadingServers.value = false
172 + })
173 +}
174 +
175 +function reset() {
176 + input.value = null
177 +}
178 +
179 +function send() {
180 + if (input.value && selectedServer.value) {
181 + emit("message", {
182 + input: input.value,
183 + server: selectedServer.value,
184 + verbose: verbose.value
185 + })
186 +
187 + reset()
188 + }
189 +}
190 +
191 +function stop() {
192 + emit("stop")
193 +}
194 +
195 +function handleCancelEdit() {
196 + emit("cancel-edit")
197 + reset()
198 +}
199 +
200 +watch(
201 + selectedServer,
202 + val => {
203 + if (val) {
204 + emit("select-server", val)
205 + }
206 + },
207 + { immediate: true }
208 +)
209 +
210 +watch(
211 + [verbose, showQuestions],
212 + () => {
213 + emit("update-options", { verbose: verbose.value, showQuestions: showQuestions.value })
214 + },
215 + { immediate: true }
216 +)
217 +
218 +onBeforeMount(() => {
219 + getList()
220 +})
221 +</script>
frontend/src/components/aiChatbot/ChatQuestion.vue new
+48
@@ -0,0 +1,48 @@
1 +<template>
2 + <div
3 + class="question bg-secondary ring-primary/20 flex w-max max-w-80 shrink-0 cursor-pointer flex-col gap-3 rounded-lg p-2 text-xs transition-all hover:ring-1"
4 + >
5 + <div>{{ entity.question }}</div>
6 + <div class="text-secondary description">
7 + <div>
8 + {{ entity.description }}
9 + </div>
10 + </div>
11 + <div>
12 + <n-tag size="small" class="[&_.n-tag\_\_content]:leading-0 text-[10px]! [&_.n-tag\_\_content]:p-0!">
13 + {{ entity.category }}
14 + </n-tag>
15 + </div>
16 + </div>
17 +</template>
18 +
19 +<script setup lang="ts">
20 +import type { ExampleQuestion } from "@/types/copilotMCP.d"
21 +import { NTag } from "naive-ui"
22 +
23 +const { entity } = defineProps<{ entity: ExampleQuestion }>()
24 +</script>
25 +
26 +<style lang="scss" scoped>
27 +.question {
28 + .description {
29 + display: grid;
30 + grid-template-rows: 0fr;
31 + opacity: 0;
32 +
33 + transition:
34 + opacity 0.3s var(--bezier-ease),
35 + grid-template-rows 0.3s var(--bezier-ease);
36 +
37 + & > * {
38 + overflow: hidden;
39 + }
40 + }
41 + &:hover {
42 + .description {
43 + grid-template-rows: 1fr;
44 + opacity: 1;
45 + }
46 + }
47 +}
48 +</style>
frontend/src/components/aiChatbot/ChatQuestions.vue new
+101
@@ -0,0 +1,101 @@
1 +<template>
2 + <div class="blur-gradient relative">
3 + <BlurEffect class="rotate-180" />
4 +
5 + <n-scrollbar
6 + x-scrollable
7 + class="max-w-full"
8 + trigger="none"
9 + :theme-overrides="{
10 + railInsetHorizontalBottom: `auto 16px 4px 16px`
11 + }"
12 + >
13 + <div class="flex items-end gap-4 p-4">
14 + <ChatQuestion
15 + v-for="item of selectedExampleQuestions"
16 + :key="item.question"
17 + :entity="item"
18 + @click="emit('select', item.question)"
19 + />
20 + </div>
21 + </n-scrollbar>
22 + </div>
23 +</template>
24 +
25 +<script setup lang="ts">
26 +import type { ExampleQuestion } from "@/types/copilotMCP.d"
27 +import { NScrollbar, useMessage } from "naive-ui"
28 +import { computed, ref, toRefs, watch } from "vue"
29 +import Api from "@/api"
30 +import BlurEffect from "@/components/common/BlurEffect.vue"
31 +import ChatQuestion from "./ChatQuestion.vue"
32 +
33 +const props = defineProps<{ server: string }>()
34 +
35 +const emit = defineEmits<{
36 + (e: "select", value: string): void
37 +}>()
38 +
39 +const { server } = toRefs(props)
40 +
41 +const loadingExampleQuestions = ref(false)
42 +const message = useMessage()
43 +const exampleQuestions = ref<{ server: string; questions: ExampleQuestion[] }[]>([])
44 +
45 +const selectedExampleQuestions = computed<ExampleQuestion[]>(
46 + () => exampleQuestions.value.find(o => o.server === server.value)?.questions || []
47 +)
48 +
49 +function isServerExamplesFilled(server: string) {
50 + return !!exampleQuestions.value.find(o => o.server === server)?.questions.length
51 +}
52 +
53 +function getExampleQuestions(server: string) {
54 + if (isServerExamplesFilled(server)) {
55 + return
56 + }
57 +
58 + loadingExampleQuestions.value = true
59 +
60 + Api.copilotMCP
61 + .getExampleQuestions(server)
62 + .then(res => {
63 + if (res.data.success) {
64 + upsertExampleQuestions(server, res.data.questions)
65 + } else {
66 + message.warning(res.data?.message || "An error occurred. Please try again later.")
67 + }
68 + })
69 + .catch(err => {
70 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
71 + })
72 + .finally(() => {
73 + loadingExampleQuestions.value = false
74 + })
75 +}
76 +
77 +function upsertExampleQuestions(server: string, questions: ExampleQuestion[]) {
78 + if (!exampleQuestions.value.find(o => o.server === server)) {
79 + exampleQuestions.value.push({
80 + server,
81 + questions
82 + })
83 + }
84 +}
85 +
86 +watch(
87 + server,
88 + val => {
89 + if (val) {
90 + getExampleQuestions(val)
91 + }
92 + },
93 + { immediate: true }
94 +)
95 +</script>
96 +
97 +<style lang="scss" scoped>
98 +.blur-gradient {
99 + background: linear-gradient(to top, var(--bg-default-color) 0%, var(--bg-default-color) 20%, transparent 100%);
100 +}
101 +</style>
frontend/src/components/common/BlurEffect.vue renamed
frontend/src/components/common/Markdown.vue
+14 -7
@@ -1,6 +1,7 @@
1 <template>
2 - <Suspense>
2 + <div>
3 <vue-markdown-it
4 + v-if="highlighter"
5 :source
6 :plugins="[
7 [
@@ -14,7 +15,10 @@
15 :class="{ 'code-bg-transparent': codeBgTransparent }"
16 @click="emit('click', $event)"
17 />
17 - </Suspense>
18 + <div v-else>
19 + {{ source }}
20 + </div>
21 + </div>
22 </template>
23
24 <script setup lang="ts">
@@ -23,7 +27,7 @@ import type Token from "markdown-it/lib/token.mjs"
27 import type { HighlighterGeneric } from "shiki/core"
28 import { VueMarkdownIt } from "@f3ve/vue-markdown-it"
29 import { fromHighlighter } from "@shikijs/markdown-it/core"
26 -import { toRefs } from "vue"
30 +import { onMounted, ref, toRefs } from "vue"
31 import { codeThemes, getHighlighter } from "@/utils/highlighter"
32 import "@/assets/scss/overrides/vue-md-it-override.scss"
33
@@ -34,12 +38,10 @@ const props = defineProps<{
38
39 const emit = defineEmits<{
40 (e: "click", value: PointerEvent): void
41 + (e: "mounted"): void
42 }>()
43
39 -const highlighter: HighlighterGeneric<string, string> = (await getHighlighter()) as unknown as HighlighterGeneric<
40 - string,
41 - string
42 ->
44 +const highlighter = ref<HighlighterGeneric<string, string> | null>(null)
45
46 function markdownItLinkTargetBlank(md: MarkdownIt): void {
47 const defaultRender =
@@ -72,6 +74,11 @@ function markdownItLinkTargetBlank(md: MarkdownIt): void {
74 }
75
76 const { source, codeBgTransparent } = toRefs(props)
77 +
78 +onMounted(async () => {
79 + highlighter.value = (await getHighlighter()) as unknown as HighlighterGeneric<string, string>
80 + emit("mounted")
81 +})
82 </script>
83
84 <style lang="scss" scoped>
frontend/src/components/graylog/Metrics/UncommittedEntries.vue
+2 -2
@@ -29,7 +29,7 @@ import { computed, ref, toRefs, watch } from "vue"
29 import apexchart from "vue3-apexcharts"
30 import Icon from "@/components/common/Icon.vue"
31 import { useGoto } from "@/composables/useGoto"
32 -import { usHealthcheckStore } from "@/stores/healthcheck"
32 +import { useHealthcheckStore } from "@/stores/healthcheck"
33 import { useThemeStore } from "@/stores/theme"
34 import dayjs from "@/utils/dayjs"
35 import "@/assets/scss/overrides/apexchart-override.scss"
@@ -38,7 +38,7 @@ const props = defineProps<{
38 value: number
39 }>()
40
41 -const UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD = usHealthcheckStore().uncommittedJournalEntriesThreshold
41 +const UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD = useHealthcheckStore().uncommittedJournalEntriesThreshold
42
43 const { value } = toRefs(props)
44
frontend/src/components/incidentManagement/alerts/AlertComment.vue
+1 -3
@@ -13,9 +13,7 @@
13 </div>
14 </div>
15 <div v-if="mode === 'view'" class="comment-message">
16 - <Suspense>
17 - <Markdown :source="comment.comment" />
18 - </Suspense>
16 + <Markdown :source="comment.comment" />
17 </div>
18
19 <n-input
frontend/src/components/license/LicenseDetails.vue
+1 -3
@@ -84,9 +84,7 @@
84 </span>
85 </template>
86 <template #value>
87 - <Suspense>
88 - <Markdown :source="dockerCompose" code-bg-transparent />
89 - </Suspense>
87 + <Markdown :source="dockerCompose" code-bg-transparent />
88 </template>
89 </CardKV>
90 </div>
frontend/src/components/mitre/AtomicTests/TechniqueCardContent.vue
+1 -3
@@ -2,9 +2,7 @@
2 <div class="active-response-details">
3 <n-spin :show="loading" class="min-h-48">
4 <template v-if="content">
5 - <Suspense>
6 - <Markdown :source="content" />
7 - </Suspense>
5 + <Markdown :source="content" />
6 </template>
7 <template v-else>
8 <n-empty v-if="!loading" description="No description found" class="h-48 justify-center" />
frontend/src/components/mitre/Group/GroupCard.vue
+1 -3
@@ -16,9 +16,7 @@
16 </template>
17 <template #footer>
18 <p v-if="groupDetails" class="cursor-text" @click.stop="() => {}">
19 - <Suspense>
20 - <Markdown :source="groupDetails.description" />
21 - </Suspense>
19 + <Markdown :source="groupDetails.description" />
20 </p>
21 <div v-else>
22 <n-skeleton text :repeat="2" :height="16" />
frontend/src/components/mitre/Group/GroupDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="groupDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="groupDetails.description" />
22 - </Suspense>
20 + <Markdown :source="groupDetails.description" />
21 </template>
22 </CardKV>
23
frontend/src/components/mitre/Mitigation/MitigationCard.vue
+1 -3
@@ -16,9 +16,7 @@
16 </template>
17 <template #footer>
18 <p v-if="mitigationDetails" class="cursor-text" @click.stop="() => {}">
19 - <Suspense>
20 - <Markdown :source="mitigationDetails.description" />
21 - </Suspense>
19 + <Markdown :source="mitigationDetails.description" />
20 </p>
21 <div v-else>
22 <n-skeleton text :repeat="2" :height="16" />
frontend/src/components/mitre/Mitigation/MitigationDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="mitigationDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="mitigationDetails.description" />
22 - </Suspense>
20 + <Markdown :source="mitigationDetails.description" />
21 </template>
22 </CardKV>
23
frontend/src/components/mitre/Software/SoftwareCard.vue
+1 -3
@@ -16,9 +16,7 @@
16 </template>
17 <template #footer>
18 <p v-if="softwareDetails" class="cursor-text" @click.stop="() => {}">
19 - <Suspense>
20 - <Markdown :source="softwareDetails.description" />
21 - </Suspense>
19 + <Markdown :source="softwareDetails.description" />
20 </p>
21 <div v-else>
22 <n-skeleton text :repeat="2" :height="16" />
frontend/src/components/mitre/Software/SoftwareDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="softwareDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="softwareDetails.description" />
22 - </Suspense>
20 + <Markdown :source="softwareDetails.description" />
21 </template>
22 </CardKV>
23
frontend/src/components/mitre/Tactic/TacticCard.vue
+1 -3
@@ -16,9 +16,7 @@
16 </template>
17 <template #footer>
18 <p v-if="tacticDetails" class="cursor-text" @click.stop="() => {}">
19 - <Suspense>
20 - <Markdown :source="tacticDetails.description" />
21 - </Suspense>
19 + <Markdown :source="tacticDetails.description" />
20 </p>
21 <div v-else>
22 <n-skeleton text :repeat="2" :height="16" />
frontend/src/components/mitre/Tactic/TacticDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="tacticDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="tacticDetails.description" />
22 - </Suspense>
20 + <Markdown :source="tacticDetails.description" />
21 </template>
22 </CardKV>
23
frontend/src/components/mitre/Technique/TechniqueCard.vue
+1 -3
@@ -16,9 +16,7 @@
16 </template>
17 <template #footer>
18 <p v-if="techniqueDetails" class="cursor-text" @click.stop="() => {}">
19 - <Suspense>
20 - <Markdown :source="techniqueDetails.description" />
21 - </Suspense>
19 + <Markdown :source="techniqueDetails.description" />
20 </p>
21 <div v-else>
22 <n-skeleton text :repeat="2" :height="16" />
frontend/src/components/mitre/TechniqueAlert/TechniqueAlertDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="techniqueDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="techniqueDetails.description" />
22 - </Suspense>
20 + <Markdown :source="techniqueDetails.description" />
21 </template>
22 </CardKV>
23 <CardKV>
frontend/src/components/mitre/TechniqueEvents/TechniqueEventDetails.vue
+1 -3
@@ -17,9 +17,7 @@
17 <CardKV v-if="softwareDetails.description" class="[&_p]:text-white">
18 <template #key>description</template>
19 <template #value>
20 - <Suspense>
21 - <Markdown :source="softwareDetails.description" />
22 - </Suspense>
20 + <Markdown :source="softwareDetails.description" />
21 </template>
22 </CardKV>
23
frontend/src/components/services/Item.vue
+1 -3
@@ -43,9 +43,7 @@
43 :bordered="false"
44 segmented
45 >
46 - <Suspense>
47 - <Markdown :source="data.details" />
48 - </Suspense>
46 + <Markdown :source="data.details" />
47 </n-modal>
48 </div>
49 </template>
frontend/src/components/threatIntel/AIAnalystButton.vue
+2 -6
@@ -65,9 +65,7 @@
65 <n-tabs type="line" animated :tabs-padding="24">
66 <n-tab-pane v-if="analysisResponse?.analysis" name="Analysis" tab="Analysis" display-directive="show">
67 <div class="p-7 pt-4">
68 - <Suspense>
69 - <Markdown :source="analysisResponse.analysis" />
70 - </Suspense>
68 + <Markdown :source="analysisResponse.analysis" />
69 </div>
70 </n-tab-pane>
71 <n-tab-pane
@@ -87,9 +85,7 @@
85 display-directive="show"
86 >
87 <div class="p-7 pt-4">
90 - <Suspense>
91 - <Markdown :source="analysisResponse.threat_indicators" />
92 - </Suspense>
88 + <Markdown :source="analysisResponse.threat_indicators" />
89 </div>
90 </n-tab-pane>
91 </n-tabs>
frontend/src/components/threatIntel/AIWazuhExclusionRuleButton.vue
+1 -3
@@ -49,9 +49,7 @@
49 <CodeSource :code="analysisResponse.wazuh_exclusion_rule" :decode="true" />
50 </div>
51 <div v-if="analysisResponse?.wazuh_exclusion_rule_justification">
52 - <Suspense>
53 - <Markdown :source="analysisResponse.wazuh_exclusion_rule_justification" />
54 - </Suspense>
52 + <Markdown :source="analysisResponse.wazuh_exclusion_rule_justification" />
53 </div>
54 </div>
55 <n-empty v-else description="No rules found" class="h-48 justify-center" />
frontend/src/components/webVulnerabilityAssessment/ReportsItem.vue
+2 -3
@@ -29,9 +29,8 @@
29 >
30 <n-spin :show="loading" class="min-h-48">
31 <n-page-header v-if="reportNavigation.length > 1" title="index" class="mb-3" @back="pageBack" />
32 - <Suspense>
33 - <Markdown :source="reportMarkdown || ''" @click.stop="checkEvent($event)" />
34 - </Suspense>
32 + <Markdown :source="reportMarkdown || ''" @click.stop="checkEvent($event)" />
33 +
34 <n-empty v-if="!loading && !reportMarkdown" description="Page not found" class="h-48 justify-center" />
35 </n-spin>
36 </n-modal>
frontend/src/composables/useHealthchecksNotify.ts
+7 -7
@@ -1,7 +1,7 @@
1 import type { Notification } from "./useNotifications"
2 import _capitalize from "lodash/capitalize"
3 import { computed, watch } from "vue"
4 -import { usHealthcheckStore } from "@/stores/healthcheck"
4 +import { useHealthcheckStore } from "@/stores/healthcheck"
5 import { IndexHealth } from "@/types/indices.d"
6 import { useGoto } from "./useGoto"
7 import { useNotifications } from "./useNotifications"
@@ -11,13 +11,13 @@ export function useHealthchecksNotify() {
11 init: () => {
12 const { gotoHealthcheck, gotoIndex, gotoGraylogMetrics } = useGoto()
13
14 - const uncommittedJournalEntriesThreshold = usHealthcheckStore().uncommittedJournalEntriesThreshold
15 - const uncommittedJournalEntries = computed(() => usHealthcheckStore().uncommittedJournalEntries)
16 - const clusterName = computed(() => usHealthcheckStore().clusterName)
17 - const clusterStatus = computed(() => usHealthcheckStore().clusterStatus)
18 - const alerts = computed(() => usHealthcheckStore().alerts)
14 + const uncommittedJournalEntriesThreshold = useHealthcheckStore().uncommittedJournalEntriesThreshold
15 + const uncommittedJournalEntries = computed(() => useHealthcheckStore().uncommittedJournalEntries)
16 + const clusterName = computed(() => useHealthcheckStore().clusterName)
17 + const clusterStatus = computed(() => useHealthcheckStore().clusterStatus)
18 + const alerts = computed(() => useHealthcheckStore().alerts)
19
20 - usHealthcheckStore().start()
20 + useHealthcheckStore().start()
21
22 watch(uncommittedJournalEntries, (val, old) => {
23 if (val !== old) {
frontend/src/composables/useNotifications.ts
+2 -1
@@ -5,6 +5,7 @@ import { NButton } from "naive-ui"
5 import { computed, h } from "vue"
6 import { useSettingsStore } from "@/stores/settings"
7 import dayjs from "@/utils/dayjs"
8 +import { secureLocalStorage } from "@/utils/secure-storage"
9 import { useGlobalActions } from "./useGlobalActions"
10
11 export type NotificationCategory = "alert"
@@ -28,7 +29,7 @@ export interface PrependOptions {
29 autoNotify?: boolean
30 }
31
31 -const list = useStorage<Notification[]>("notifications-list", [], localStorage)
32 +const list = useStorage<Notification[]>("notifications-list", [], secureLocalStorage({ session: true }))
33
34 export function useNotifications() {
35 const hasUnread = computed(() => list.value.filter(o => !o.read).length !== 0)
frontend/src/design-tokens.json
+1 -1
@@ -91,7 +91,7 @@
91 "backgroundSecondary": "rgb(29, 31, 37)",
92 "text": "rgb(255, 255, 255)",
93 "textSecondary": "rgb(172, 181, 190)",
94 - "textTertiary": "rgb(172, 181, 190)",
94 + "textTertiary": "rgb(116, 126, 136)",
95 "border": "rgb(67, 68, 76)",
96 "hover": "rgba(59, 61, 68, 0.5)",
97 "primary": "rgb(255, 182, 0)",
frontend/src/main.ts
+1 -5
@@ -12,11 +12,7 @@ meta.name = "naive-ui-style"
12 document.head.appendChild(meta)
13
14 const pinia = createPinia()
15 -pinia.use(
16 - createPersistedState({
17 - key: id => `__persisted__${id}`
18 - })
19 -)
15 +pinia.use(createPersistedState())
16
17 const app = createApp(App)
18 app.use(pinia)
frontend/src/stores/auth.ts
+4 -7
@@ -5,13 +5,11 @@ import _castArray from "lodash/castArray"
5 import _toLower from "lodash/toLower"
6 import _toNumber from "lodash/toNumber"
7 import { acceptHMRUpdate, defineStore } from "pinia"
8 -import SecureLS from "secure-ls"
8 import Api from "@/api"
9 import { AuthUserRole, RouteRole } from "@/types/auth.d"
10 import { getAvatar, getNameInitials } from "@/utils"
11 import { jwtRoleToUserRole } from "@/utils/auth"
13 -
14 -const ls = new SecureLS({ encodingType: "aes", isCompression: false })
12 +import { piniaStorage, removePersistentSessionKey } from "@/utils/secure-storage"
13
14 export const useAuthStore = defineStore("auth", {
15 state: () => ({
@@ -45,6 +43,8 @@ export const useAuthStore = defineStore("auth", {
43 email: "",
44 role: AuthUserRole.Unknown
45 }
46 +
47 + removePersistentSessionKey()
48 },
49 async login(payload: LoginPayload) {
50 try {
@@ -134,10 +134,7 @@ export const useAuthStore = defineStore("auth", {
134 }
135 },
136 persist: {
137 - storage: {
138 - getItem: key => ls.get(key),
139 - setItem: (key, value) => ls.set(key, value)
140 - },
137 + storage: piniaStorage({ session: true }),
138 pick: ["user"]
139 }
140 })
frontend/src/stores/healthcheck.ts
+11 -6
@@ -4,8 +4,9 @@ import { acceptHMRUpdate, defineStore } from "pinia"
4 import Api from "@/api"
5 import { InfluxDBAlertLevel } from "@/types/healthchecks.d"
6 import { IndexHealth } from "@/types/indices.d"
7 +import { useAuthStore } from "./auth"
8
8 -export const usHealthcheckStore = defineStore("healthcheck", {
9 +export const useHealthcheckStore = defineStore("healthcheck", {
10 state: () => ({
11 uncommittedJournalEntriesThreshold: _toNumber(
12 import.meta.env.VITE_UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD
@@ -65,11 +66,15 @@ export const usHealthcheckStore = defineStore("healthcheck", {
66 },
67
68 getData() {
68 - if (this.uncommittedJournalEntriesThreshold) {
69 - this.getGraylogCheck()
69 + const authStore = useAuthStore()
70 +
71 + if (authStore.isLogged) {
72 + if (this.uncommittedJournalEntriesThreshold) {
73 + this.getGraylogCheck()
74 + }
75 + this.getClusterHealth()
76 + this.getHealthchecks()
77 }
71 - this.getClusterHealth()
72 - this.getHealthchecks()
78 },
79
80 stop() {
@@ -89,5 +94,5 @@ export const usHealthcheckStore = defineStore("healthcheck", {
94 })
95
96 if (import.meta.hot) {
92 - import.meta.hot.accept(acceptHMRUpdate(usHealthcheckStore, import.meta.hot))
97 + import.meta.hot.accept(acceptHMRUpdate(useHealthcheckStore, import.meta.hot))
98 }
frontend/src/tailwind.css
+13
@@ -47,6 +47,19 @@
47 opacity: 1;
48 }
49 }
50 +
51 + --animate-fade-up: fade-up 0.3s forwards;
52 +
53 + @keyframes fade-up {
54 + from {
55 + opacity: 0;
56 + transform: translateY(50%);
57 + }
58 + to {
59 + opacity: 1;
60 + transform: translateY(0);
61 + }
62 + }
63 }
64
65 @layer base {
frontend/src/types/copilotMCP.d.ts new
+23
@@ -0,0 +1,23 @@
1 +export interface MCPServer {
2 + name: string
3 + value: string
4 + description: string
5 + capabilities: string[]
6 +}
7 +
8 +export interface QueryResult {
9 + result: string | QueryStructuredResult
10 + structured_result: QueryStructuredResult | null
11 + execution_time: number
12 +}
13 +
14 +export interface QueryStructuredResult {
15 + response: string
16 + thinking_process: string
17 +}
18 +
19 +export interface ExampleQuestion {
20 + question: string
21 + description: string
22 + category: string
23 +}
frontend/src/utils/highlighter.ts
+17 -1
@@ -1,11 +1,22 @@
1 +import type { BundledLanguage, BundledTheme, HighlighterGeneric } from "shiki"
2 import { createHighlighter } from "shiki"
3 import { createOnigurumaEngine } from "shiki/engine/oniguruma"
4
5 const THEME_LIGHT = "slack-ochin"
6 const THEME_DARK = "aurora-x"
7
8 +let highlighterInstance: HighlighterGeneric<BundledLanguage, BundledTheme> | null = null
9 +let highlighterPromise: Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> | null = null
10 +
11 export async function getHighlighter() {
8 - return await createHighlighter({
12 + if (highlighterInstance) {
13 + return highlighterInstance
14 + }
15 + if (highlighterPromise) {
16 + return highlighterPromise
17 + }
18 +
19 + highlighterPromise = createHighlighter({
20 themes: [import("shiki/themes/slack-ochin.mjs"), import("shiki/themes/aurora-x.mjs")],
21 langs: [
22 import("shiki/langs/javascript.mjs"),
@@ -26,7 +37,12 @@ export async function getHighlighter() {
37 import("shiki/langs/php.mjs")
38 ],
39 engine: createOnigurumaEngine(() => import("shiki/wasm"))
40 + }).then(instance => {
41 + highlighterInstance = instance
42 + return instance
43 })
44 +
45 + return highlighterPromise
46 }
47
48 export const codeThemes = {
frontend/src/utils/secure-storage.ts new
+60
@@ -0,0 +1,60 @@
1 +import SecureLS from "secure-ls"
2 +
3 +const secureLS = new SecureLS({
4 + encodingType: "aes",
5 + isCompression: false
6 +})
7 +
8 +const PREFIX_PERSISTED = "__persisted__"
9 +const PREFIX_SESSION = "__persisted-session__"
10 +
11 +export function persistentKey(options?: { session?: boolean }) {
12 + const prefix = options?.session ? PREFIX_SESSION : PREFIX_PERSISTED
13 + return (id: string) => `${prefix}${id}`
14 +}
15 +
16 +export function removePersistentSessionKey() {
17 + for (const key of secureLS.getAllKeys()) {
18 + if (key.includes(PREFIX_SESSION)) {
19 + secureLS.remove(key)
20 + }
21 + }
22 +}
23 +
24 +export function secureLocalStorage(options?: { session?: boolean }) {
25 + return {
26 + getItem(key: string): any {
27 + try {
28 + return secureLS.get(persistentKey({ session: options?.session })(key))
29 + } catch (err) {
30 + console.warn(`[secureLocalStorage] Failed to get "${key}"`, err)
31 + return null
32 + }
33 + },
34 +
35 + setItem(key: string, value: any): void {
36 + try {
37 + secureLS.set(persistentKey({ session: options?.session })(key), value)
38 + } catch (err) {
39 + console.warn(`[secureLocalStorage] Failed to set "${key}"`, err)
40 + }
41 + },
42 +
43 + removeItem(key: string): void {
44 + try {
45 + secureLS.remove(persistentKey({ session: options?.session })(key))
46 + } catch (err) {
47 + console.warn(`[secureLocalStorage] Failed to remove "${key}"`, err)
48 + }
49 + }
50 + }
51 +}
52 +
53 +export function piniaStorage(options?: { session?: boolean }) {
54 + return {
55 + getItem: (key: string) => secureLS.get(persistentKey({ session: options?.session })(key)),
56 + setItem: (key: string, value: unknown) => secureLS.set(persistentKey({ session: options?.session })(key), value)
57 + }
58 +}
59 +
60 +export { secureLS }