@cryptotaxi247 / CoPilot / commits / b01a9d5e

Atomic test linux (#453)

* Fix error message formatting for missing agent hostname * Add logging for success status in Singul integration response * chore: update frontend dependencies * feat: dynamic os on sim attack * feat: enhance Wazuh worker provisioning healthcheck to support multiple hosts and detailed connection status * feat: add node_id to ProvisionWorkerRequest and log provisioning with node_id during Wazuh worker setup * feat: update node_id type to string for Wazuh worker provisioning logging * feat: add OS category filtering to Atomic Red Team tests retrieval and caching * feat: update Wazuh stack template to support dynamic node count and ensure replica distribution across nodes * feat: update branch trigger for Docker workflow to atomic-test-linux * fix: update branch trigger for Docker workflow to main * chore: update frontend dependencies * feat: add os filter * precommit fixes --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Jun 6, 2025 at 16:23 UTC b01a9d5e2b5bcae82e80e061b7420eea14e264e0
22 files changed +760 -673
backend/app/connectors/portainer/services/stack.py
+76 -5
@@ -16,6 +16,7 @@ from app.connectors.portainer.utils.universal import send_delete_request
16 from app.connectors.portainer.utils.universal import send_get_request
17 from app.connectors.portainer.utils.universal import send_post_request
18 from app.customer_provisioning.schema.provision import ProvisionNewCustomer
19 +from app.customer_provisioning.services.portainer import list_node_ips
20
21
22 async def get_stacks() -> StackResponse:
@@ -60,12 +61,36 @@ async def _load_stack_template(template_path: Path) -> str:
61 return file.read()
62
63
63 -async def _prepare_template_variables(request: ProvisionNewCustomer) -> Dict[str, str]:
64 +# async def _prepare_template_variables(request: ProvisionNewCustomer) -> Dict[str, str]:
65 +# """
66 +# Prepare variables for template replacement.
67 +
68 +# Args:
69 +# request (ProvisionNewCustomer): The customer provisioning request
70 +
71 +# Returns:
72 +# Dict[str, str]: Dictionary of template variables and their values
73 +# """
74 +# formatted_customer_name = request.customer_name.replace(" ", "_")
75 +# wazuh_manager_version = await get_wazuh_manager_version()
76 +
77 +# return {
78 +# "{{ wazuh_worker_customer_code }}": formatted_customer_name,
79 +# "{{ wazuh_manager_version }}": wazuh_manager_version,
80 +# "REPLACE_LOG": request.wazuh_logs_port,
81 +# "REPLACE_REGISTRATION": request.wazuh_registration_port,
82 +# "REPLACE_API": request.wazuh_api_port,
83 +# "customer_name": formatted_customer_name,
84 +# }
85 +
86 +
87 +async def _prepare_template_variables(request: ProvisionNewCustomer, node_count: int) -> Dict[str, str]:
88 """
89 Prepare variables for template replacement.
90
91 Args:
92 request (ProvisionNewCustomer): The customer provisioning request
93 + node_count (int): Number of nodes in the swarm
94
95 Returns:
96 Dict[str, str]: Dictionary of template variables and their values
@@ -79,6 +104,7 @@ async def _prepare_template_variables(request: ProvisionNewCustomer) -> Dict[str
104 "REPLACE_LOG": request.wazuh_logs_port,
105 "REPLACE_REGISTRATION": request.wazuh_registration_port,
106 "REPLACE_API": request.wazuh_api_port,
107 + "NUMBER_OF_NODES": str(node_count),
108 "customer_name": formatted_customer_name,
109 }
110
@@ -103,6 +129,46 @@ async def _create_stack_payload(template: str, variables: Dict[str, str], swarm_
129 }
130
131
132 +# async def create_wazuh_customer_stack(request: ProvisionNewCustomer) -> StackResponse:
133 +# """
134 +# Create a Wazuh stack for a customer.
135 +
136 +# Args:
137 +# request (ProvisionNewCustomer): The customer provisioning request
138 +
139 +# Returns:
140 +# StackResponse: The response from Portainer stack creation
141 +# """
142 +# logger.info(f"Creating Wazuh stack for customer {request.customer_name}")
143 +
144 +# # Load template
145 +# template_path = Path(__file__).parent.parent / "templates" / "wazuh_worker_stack.yml"
146 +# template = await _load_stack_template(template_path)
147 +
148 +# # Prepare variables
149 +# variables = await _prepare_template_variables(request)
150 +# logger.info(f"Template variables prepared for customer: {variables['customer_name']}")
151 +
152 +# # Process template
153 +# for placeholder, value in variables.items():
154 +# template = template.replace(placeholder, value)
155 +# logger.info("Template processed with variables")
156 +
157 +# # Get required IDs
158 +# endpoint_id = await get_endpoint_id()
159 +# swarm_id = await get_swarm_id()
160 +# logger.info(f"Retrieved endpoint ID: {endpoint_id} and swarm ID: {swarm_id}")
161 +
162 +# # Create and send request
163 +# create_stack_url = f"/api/stacks?type=1&method=string&endpointId={endpoint_id}"
164 +# payload = await _create_stack_payload(template, variables, swarm_id)
165 +
166 +# response = await send_post_request(endpoint=create_stack_url, data=payload)
167 +# logger.info(f"Stack creation response received: {response}")
168 +
169 +# return StackResponse(**response)
170 +
171 +
172 async def create_wazuh_customer_stack(request: ProvisionNewCustomer) -> StackResponse:
173 """
174 Create a Wazuh stack for a customer.
@@ -115,18 +181,23 @@ async def create_wazuh_customer_stack(request: ProvisionNewCustomer) -> StackRes
181 """
182 logger.info(f"Creating Wazuh stack for customer {request.customer_name}")
183
184 + # Get the number of swarm nodes
185 + swarm_node_ips = await list_node_ips()
186 + node_count = len(swarm_node_ips)
187 + logger.info(f"Found {node_count} swarm nodes: {swarm_node_ips}")
188 +
189 # Load template
190 template_path = Path(__file__).parent.parent / "templates" / "wazuh_worker_stack.yml"
191 template = await _load_stack_template(template_path)
192
122 - # Prepare variables
123 - variables = await _prepare_template_variables(request)
124 - logger.info(f"Template variables prepared for customer: {variables['customer_name']}")
193 + # Prepare variables with node count
194 + variables = await _prepare_template_variables(request, node_count)
195 + logger.info(f"Template variables prepared for customer: {variables['customer_name']} with {node_count} nodes")
196
197 # Process template
198 for placeholder, value in variables.items():
199 template = template.replace(placeholder, value)
129 - logger.info("Template processed with variables")
200 + logger.info(f"Template processed with variables, replicas set to {node_count}")
201
202 # Get required IDs
203 endpoint_id = await get_endpoint_id()
backend/app/connectors/portainer/templates/wazuh_worker_stack.yml
+3 -5
@@ -6,11 +6,9 @@ services:
6 restart: always
7 # Docker Swarm deployment configuration
8 deploy:
9 - replicas: 1
10 - # If you want to let Swarm auto-balance, omit constraints:
11 - # placement:
12 - # preferences:
13 - # - spread: node.id
9 + replicas: NUMBER_OF_NODES # one replica for each node
10 + placement:
11 + max_replicas_per_node: 1 # ensures they land on different nodes
12
13 ports:
14 - "REPLACE_LOG:1514"
backend/app/connectors/shuffle/services/singul.py
+2
@@ -21,6 +21,7 @@ async def execute_singul(
21 logger.info("Executing Singul integration")
22 response = singul.communication.send_message(
23 app=request.app,
24 + # org_id="REPLACE",
25 auth_id="REPLACE",
26 fields=[
27 {"key": "to", "value": "REPLACE"},
@@ -29,6 +30,7 @@ async def execute_singul(
30 ],
31 )
32 logger.info(f"Singul response: {response}")
33 + logger.info(f"Singul response: {response.get('success', 'unknown')}")
34 return {
35 "executionId": response.get("id", "unknown"),
36 "message": "Singul integration executed successfully",
backend/app/connectors/velociraptor/routes/flows.py
+1 -1
@@ -77,7 +77,7 @@ async def get_velociraptor_org(session: AsyncSession, hostname: str) -> str:
77 if not agent:
78 raise HTTPException(
79 status_code=404,
80 - detail=f"Agent with hostname {hostname} not found",
80 + detail=f"Agent with hostname: {hostname} not found",
81 )
82
83 if agent.velociraptor_org is None:
backend/app/connectors/wazuh_manager/routes/mitre.py
+76 -5
@@ -221,6 +221,60 @@ async def list_mitre_techniques(
221 return await get_mitre_techniques(limit=limit, offset=offset, select=select, sort=sort, search=search, q=q)
222
223
224 +# @wazuh_manager_mitre_router.get(
225 +# "/atomic-tests",
226 +# response_model=AtomicTestsListResponse,
227 +# description="List all available Atomic Red Team tests",
228 +# dependencies=[Security(auth_handler.require_any_scope("admin", "analyst"))],
229 +# )
230 +# async def list_atomic_tests(
231 +# size: int = Query(25, description="Maximum number of techniques to return per page"),
232 +# page: int = Query(1, description="Page number for pagination", gt=0),
233 +# ):
234 +# """
235 +# List all available Atomic Red Team tests across all techniques.
236 +
237 +# Args:
238 +# size: Maximum number of techniques to return per page
239 +# page: Page number for pagination
240 +
241 +# Returns:
242 +# AtomicTestsListResponse: A paginated list of techniques with Atomic Red Team tests.
243 +# """
244 +# logger.info(f"Request for list of all Atomic Red Team tests (page {page}, size {size})")
245 +
246 +# try:
247 +# # Get the list of all atomic tests
248 +# result = await AtomicRedTeamService.list_all_atomic_tests()
249 +
250 +# # Apply pagination to the results
251 +# total_techniques = result["total_techniques"]
252 +# all_tests = result["tests"]
253 +
254 +# # Calculate total pages
255 +# total_pages = (total_techniques + size - 1) // size if total_techniques > 0 else 1
256 +
257 +# # Apply pagination
258 +# start_idx = (page - 1) * size
259 +# end_idx = start_idx + size
260 +# paginated_tests = all_tests[start_idx:end_idx]
261 +
262 +# return AtomicTestsListResponse(
263 +# success=True,
264 +# message=f"Found {total_techniques} MITRE techniques in {result['total_techniques']} alerts (page {page} of {total_pages},)",
265 +# total_techniques=total_techniques,
266 +# total_tests=result.get("total_tests"),
267 +# tests=paginated_tests,
268 +# last_updated=result["last_updated"],
269 +# page=page,
270 +# page_size=size,
271 +# total_pages=total_pages,
272 +# )
273 +# except Exception as e:
274 +# logger.error(f"Error retrieving atomic tests: {str(e)}")
275 +# raise HTTPException(status_code=500, detail=f"Error retrieving atomic tests: {str(e)}")
276 +
277 +
278 @wazuh_manager_mitre_router.get(
279 "/atomic-tests",
280 response_model=AtomicTestsListResponse,
@@ -230,6 +284,7 @@ async def list_mitre_techniques(
284 async def list_atomic_tests(
285 size: int = Query(25, description="Maximum number of techniques to return per page"),
286 page: int = Query(1, description="Page number for pagination", gt=0),
287 + os_category: Optional[str] = Query(None, description="Filter by operating system category (windows, linux, macos)"),
288 ):
289 """
290 List all available Atomic Red Team tests across all techniques.
@@ -237,19 +292,29 @@ async def list_atomic_tests(
292 Args:
293 size: Maximum number of techniques to return per page
294 page: Page number for pagination
295 + os_category: Optional filter for operating system category
296
297 Returns:
298 AtomicTestsListResponse: A paginated list of techniques with Atomic Red Team tests.
299 """
244 - logger.info(f"Request for list of all Atomic Red Team tests (page {page}, size {size})")
300 + logger.info(f"Request for list of all Atomic Red Team tests (page {page}, size {size}, os_category: {os_category})")
301
302 try:
303 # Get the list of all atomic tests
304 result = await AtomicRedTeamService.list_all_atomic_tests()
305
250 - # Apply pagination to the results
251 - total_techniques = result["total_techniques"]
306 + # Filter by OS category if provided
307 all_tests = result["tests"]
308 + if os_category:
309 + os_category_lower = os_category.lower()
310 + # Filter tests that have the specified OS category in their categories list
311 + filtered_tests = [test for test in all_tests if os_category_lower in [cat.lower() for cat in test.get("categories", [])]]
312 + logger.info(f"Filtered {len(all_tests)} tests down to {len(filtered_tests)} tests for OS category '{os_category}'")
313 + else:
314 + filtered_tests = all_tests
315 +
316 + # Apply pagination to the filtered results
317 + total_techniques = len(filtered_tests)
318
319 # Calculate total pages
320 total_pages = (total_techniques + size - 1) // size if total_techniques > 0 else 1
@@ -257,11 +322,17 @@ async def list_atomic_tests(
322 # Apply pagination
323 start_idx = (page - 1) * size
324 end_idx = start_idx + size
260 - paginated_tests = all_tests[start_idx:end_idx]
325 + paginated_tests = filtered_tests[start_idx:end_idx]
326 +
327 + # Build the message
328 + if os_category:
329 + message = f"Found {total_techniques} MITRE techniques for OS '{os_category}' (page {page} of {total_pages})"
330 + else:
331 + message = f"Found {total_techniques} MITRE techniques (page {page} of {total_pages})"
332
333 return AtomicTestsListResponse(
334 success=True,
264 - message=f"Found {total_techniques} MITRE techniques in {result['total_techniques']} alerts (page {page} of {total_pages},)",
335 + message=message,
336 total_techniques=total_techniques,
337 total_tests=result.get("total_tests"),
338 tests=paginated_tests,
backend/app/connectors/wazuh_manager/services/mitre.py
+62 -24
@@ -40,18 +40,22 @@ class AtomicRedTeamService:
40 _tests_cache: Dict[str, Tuple[List[Dict], float]] = {} # Cache for all tests
41
42 @classmethod
43 - async def list_all_atomic_tests(cls) -> Dict:
43 + async def list_all_atomic_tests(cls, os_category: Optional[str] = None) -> Dict:
44 """
45 Get a list of all available Atomic Red Team tests.
46
47 + Args:
48 + os_category: Optional filter for operating system category
49 +
50 Returns:
51 Dict containing test information and metadata
52 """
53 # Check cache first
51 - if "all_tests" in cls._tests_cache:
52 - tests, timestamp = cls._tests_cache["all_tests"]
54 + cache_key = f"all_tests_{os_category}" if os_category else "all_tests"
55 + if cache_key in cls._tests_cache:
56 + tests, timestamp = cls._tests_cache[cache_key]
57 if time.time() - timestamp < CACHE_EXPIRY:
54 - logger.debug("Returning cached list of all atomic tests")
58 + logger.debug(f"Returning cached list of atomic tests for OS category: {os_category}")
59 return {"total_techniques": len(tests), "tests": tests, "last_updated": datetime.fromtimestamp(timestamp).isoformat()}
60
61 # Fetch the list of all techniques with atomic tests
@@ -61,17 +65,17 @@ class AtomicRedTeamService:
65 url = "https://raw.githubusercontent.com/redcanaryco/atomic-red-team/refs/heads/master/atomics/Indexes/Indexes-Markdown/atomic-red-team-index.md"
66 async with session.get(url) as response:
67 if response.status == 200:
64 - return await cls._parse_atomic_index_markdown(await response.text())
68 + return await cls._parse_atomic_index_markdown(await response.text(), os_category)
69
70 # If markdown index not available, try alternate approach
71 logger.warning(f"Could not fetch atomic-red-team-index.md: {response.status}. Trying alternate method.")
68 - return await cls._fetch_techniques_from_atomics_folder()
72 + return await cls._fetch_techniques_from_atomics_folder(os_category)
73 except Exception as e:
74 logger.error(f"Error listing atomic tests: {str(e)}")
75 raise HTTPException(status_code=500, detail=f"Error listing atomic tests: {str(e)}")
76
77 @classmethod
74 - async def _parse_atomic_index_markdown(cls, content: str) -> Dict:
78 + async def _parse_atomic_index_markdown(cls, content: str, os_category: Optional[str] = None) -> Dict:
79 """Parse the atomic-red-team-index.md file to extract test information."""
80 techniques = []
81 technique_pattern = r"\|\s*\[([^]]+)\]\([^)]+\)\s*\|\s*([T\d\.]+)\s*\|\s*(\d+)\s*\|"
@@ -83,18 +87,30 @@ class AtomicRedTeamService:
87 try:
88 count = int(test_count)
89 total_tests += count
86 - techniques.append(
87 - {
88 - "technique_id": technique_id,
89 - "technique_name": name,
90 - "test_count": count,
91 - "categories": [], # Would require additional requests to determine
92 - "has_prerequisites": False, # Would require additional requests to determine
93 - },
94 - )
90 +
91 + # For now, we'll need to fetch individual technique details to get platform info
92 + # This is a limitation of parsing just the index markdown
93 + technique_data = {
94 + "technique_id": technique_id,
95 + "technique_name": name,
96 + "test_count": count,
97 + "categories": [], # Would require additional requests to determine
98 + "has_prerequisites": False, # Would require additional requests to determine
99 + }
100 +
101 + # If filtering by OS category, we'd need to fetch individual technique data
102 + # For performance, we'll apply the filter after getting all data
103 + techniques.append(technique_data)
104 +
105 except ValueError:
106 continue # Skip if test_count isn't a valid integer
107
108 + # Apply OS category filter if specified
109 + if os_category:
110 + # Note: This approach has limitations because the index doesn't contain platform info
111 + # We'd need to fetch individual technique data for accurate filtering
112 + logger.warning("OS category filtering from index markdown has limitations. Consider using the alternate method.")
113 +
114 result = {
115 "total_techniques": len(techniques),
116 "total_tests": total_tests,
@@ -103,12 +119,13 @@ class AtomicRedTeamService:
119 }
120
121 # Cache the result
106 - cls._tests_cache["all_tests"] = (techniques, time.time())
122 + cache_key = f"all_tests_{os_category}" if os_category else "all_tests"
123 + cls._tests_cache[cache_key] = (techniques, time.time())
124
125 return result
126
127 @classmethod
111 - async def _fetch_techniques_from_atomics_folder(cls) -> Dict:
128 + async def _fetch_techniques_from_atomics_folder(cls, os_category: Optional[str] = None) -> Dict:
129 """Fetch and parse techniques directly from the Atomic Red Team repository."""
130 # This is a fallback method that fetches the techniques directly from the GitHub API
131 try:
@@ -148,7 +165,6 @@ class AtomicRedTeamService:
165 try:
166 data = yaml.safe_load(yaml_content)
167 test_count = len(data.get("atomic_tests", []))
151 - total_tests += test_count
168 platforms = set()
169 has_prereqs = False
170
@@ -158,13 +174,23 @@ class AtomicRedTeamService:
174 if test.get("dependencies"):
175 has_prereqs = True
176
161 - return {
177 + technique_data = {
178 "technique_id": technique_id,
179 "technique_name": data.get("display_name", technique_id),
180 "test_count": test_count,
181 "categories": list(platforms),
182 "has_prerequisites": has_prereqs,
183 }
184 +
185 + # Apply OS category filter if specified
186 + if os_category:
187 + os_category_lower = os_category.lower()
188 + if os_category_lower not in [cat.lower() for cat in platforms]:
189 + return None # Skip this technique
190 +
191 + total_tests += test_count
192 + return technique_data
193 +
194 except Exception as e:
195 logger.warning(f"Error parsing YAML for {technique_id}: {e}")
196
@@ -180,7 +206,6 @@ class AtomicRedTeamService:
206 # Count atomic tests by headers
207 test_headers = re.findall(r"## Atomic Test #\d+", md_content)
208 test_count = len(test_headers)
183 - total_tests += test_count
209
210 # Look for platform indicators
211 platforms = []
@@ -191,7 +216,7 @@ class AtomicRedTeamService:
216 if "linux" in md_content.lower():
217 platforms.append("linux")
218
194 - return {
219 + technique_data = {
220 "technique_id": technique_id,
221 "technique_name": name.replace(f"- {technique_id}", "").strip(),
222 "test_count": test_count,
@@ -199,6 +224,15 @@ class AtomicRedTeamService:
224 "has_prerequisites": "dependency" in md_content.lower() or "dependencies" in md_content.lower(),
225 }
226
227 + # Apply OS category filter if specified
228 + if os_category:
229 + os_category_lower = os_category.lower()
230 + if os_category_lower not in [cat.lower() for cat in platforms]:
231 + return None # Skip this technique
232 +
233 + total_tests += test_count
234 + return technique_data
235 +
236 # If both methods fail, return basic info
237 return {
238 "technique_id": technique_id,
@@ -210,7 +244,10 @@ class AtomicRedTeamService:
244
245 # Process all techniques concurrently but with rate limiting
246 technique_tasks = [process_technique(folder) for folder in technique_folders]
213 - techniques = [t for t in await asyncio.gather(*technique_tasks) if t["test_count"] > 0]
247 + technique_results = await asyncio.gather(*technique_tasks)
248 +
249 + # Filter out None results and techniques with 0 tests
250 + techniques = [t for t in technique_results if t is not None and t["test_count"] > 0]
251
252 result = {
253 "total_techniques": len(techniques),
@@ -220,7 +257,8 @@ class AtomicRedTeamService:
257 }
258
259 # Cache the result
223 - cls._tests_cache["all_tests"] = (techniques, time.time())
260 + cache_key = f"all_tests_{os_category}" if os_category else "all_tests"
261 + cls._tests_cache[cache_key] = (techniques, time.time())
262
263 return result
264
backend/app/customer_provisioning/schema/wazuh_worker.py
+5
@@ -66,6 +66,11 @@ class ProvisionWorkerRequest(BaseModel):
66 example="4.10.1",
67 description="The version of the Wazuh manager",
68 )
69 + node_id: Optional[str] = Field(
70 + "1",
71 + example="1",
72 + description="The ID of the node in the swarm",
73 + )
74
75
76 class ProvisionWorkerResponse(BaseModel):
backend/app/customer_provisioning/services/provision.py
+7 -2
@@ -345,8 +345,12 @@ async def provision_wazuh_worker(
345 request.portainer_deployment = True
346 swarm_node_ips = await list_node_ips()
347 logger.info(f"Invoking the customer provisioning application on the swarm node IPs: {swarm_node_ips}")
348 - for ip in swarm_node_ips:
349 - logger.info(f"Provisioning Wazuh worker on IP: {ip}")
348 + # Loop through each node IP and set the node_id based on position
349 + for index, ip in enumerate(swarm_node_ips, start=1):
350 + # Set the node_id to the current position in the list (1, 2, 3, etc.)
351 + request.node_id = str(index)
352 + logger.info(f"Provisioning Wazuh worker on IP: {ip} with node_id: {request.node_id}")
353 +
354 response = requests.post(
355 url=f"http://{ip}:5003/provision_worker",
356 json=request.dict(),
@@ -357,6 +361,7 @@ async def provision_wazuh_worker(
361 success=False,
362 message=f"Failed to provision Wazuh worker: {response.text}",
363 )
364 +
365 # Create the stack and get the response
366 stack_response = await create_wazuh_customer_stack(request)
367
backend/app/utils.py
+110 -29
@@ -788,49 +788,130 @@ async def get_customer_alert_event_configs(
788
789 ################## ! Wazuh Worker Provisioning App ! ##################
790 ################## ! https://github.com/socfortress/Customer-Provisioning-Worker ! ##################
791 +# async def verify_wazuh_worker_provisioning_healtcheck(
792 +# attributes: Dict[str, Any],
793 +# ) -> Dict[str, Any]:
794 +# """
795 +# Verifies the connection to Wazuh Worker Provisioning service.
796 +
797 +# Returns:
798 +# dict: A dictionary containing 'connectionSuccessful' status.
799 +# """
800 +# logger.info(
801 +# f"Verifying the wazuh-worker provisioning connection to {attributes['connector_url']}",
802 +# )
803 +
804 +# try:
805 +# wazuh_worker_provisioning_healthcheck = requests.get(
806 +# f"{attributes['connector_url']}/provision_worker/healthcheck",
807 +# verify=False,
808 +# )
809 +
810 +# if wazuh_worker_provisioning_healthcheck.status_code == 200:
811 +# return {
812 +# "connectionSuccessful": True,
813 +# "message": "Wazuh Worker Provisioning healthcheck successful",
814 +# }
815 +# else:
816 +# logger.error(
817 +# f"Connection to {attributes['connector_url']} failed with error: {wazuh_worker_provisioning_healthcheck.text}",
818 +# )
819 +
820 +# return {
821 +# "connectionSuccessful": False,
822 +# "message": f"Connection to {attributes['connector_url']} failed",
823 +# }
824 +# except Exception as e:
825 +# logger.error(
826 +# f"Connection to {attributes['connector_url']} failed with error: {e}",
827 +# )
828 +
829 +# return {
830 +# "connectionSuccessful": False,
831 +# "message": f"Connection to {attributes['connector_url']} failed with error.",
832 +# }
833 +
834 +
835 async def verify_wazuh_worker_provisioning_healtcheck(
836 attributes: Dict[str, Any],
837 ) -> Dict[str, Any]:
838 """
839 Verifies the connection to Wazuh Worker Provisioning service.
840 + Supports multiple hosts separated by commas.
841
842 Returns:
798 - dict: A dictionary containing 'connectionSuccessful' status.
843 + dict: A dictionary containing 'connectionSuccessful' status and details.
844 """
800 - logger.info(
801 - f"Verifying the wazuh-worker provisioning connection to {attributes['connector_url']}",
802 - )
845 + connector_url = attributes["connector_url"]
846 + logger.info(f"Verifying the wazuh-worker provisioning connection to {connector_url}")
847
804 - try:
805 - wazuh_worker_provisioning_healthcheck = requests.get(
806 - f"{attributes['connector_url']}/provision_worker/healthcheck",
807 - verify=False,
808 - )
809 -
810 - if wazuh_worker_provisioning_healthcheck.status_code == 200:
811 - return {
812 - "connectionSuccessful": True,
813 - "message": "Wazuh Worker Provisioning healthcheck successful",
814 - }
815 - else:
816 - logger.error(
817 - f"Connection to {attributes['connector_url']} failed with error: {wazuh_worker_provisioning_healthcheck.text}",
818 - )
819 -
820 - return {
821 - "connectionSuccessful": False,
822 - "message": f"Connection to {attributes['connector_url']} failed",
823 - }
824 - except Exception as e:
825 - logger.error(
826 - f"Connection to {attributes['connector_url']} failed with error: {e}",
827 - )
848 + # Parse multiple hosts if comma-separated
849 + hosts = [host.strip() for host in connector_url.split(",") if host.strip()]
850
851 + if not hosts:
852 return {
853 "connectionSuccessful": False,
831 - "message": f"Connection to {attributes['connector_url']} failed with error.",
854 + "message": "No valid hosts found in connector_url",
855 }
856
857 + successful_hosts = []
858 + failed_hosts = []
859 + connection_details = []
860 +
861 + # Test each host
862 + for host in hosts:
863 + try:
864 + logger.info(f"Testing connection to host: {host}")
865 +
866 + wazuh_worker_provisioning_healthcheck = requests.get(
867 + f"{host}/provision_worker/healthcheck",
868 + verify=False,
869 + timeout=10, # Add timeout to prevent hanging
870 + )
871 +
872 + if wazuh_worker_provisioning_healthcheck.status_code == 200:
873 + successful_hosts.append(host)
874 + connection_details.append({"host": host, "status": "success", "status_code": 200, "message": "Connection successful"})
875 + logger.info(f"Connection to {host} successful")
876 + else:
877 + failed_hosts.append(host)
878 + connection_details.append(
879 + {
880 + "host": host,
881 + "status": "failed",
882 + "status_code": wazuh_worker_provisioning_healthcheck.status_code,
883 + "message": f"HTTP {wazuh_worker_provisioning_healthcheck.status_code}: {wazuh_worker_provisioning_healthcheck.text}",
884 + },
885 + )
886 + logger.error(f"Connection to {host} failed with status {wazuh_worker_provisioning_healthcheck.status_code}")
887 +
888 + except Exception as e:
889 + failed_hosts.append(host)
890 + connection_details.append({"host": host, "status": "error", "status_code": None, "message": f"Connection error: {str(e)}"})
891 + logger.error(f"Connection to {host} failed with error: {e}")
892 +
893 + # Determine overall success
894 + overall_success = len(successful_hosts) > 0
895 +
896 + if overall_success:
897 + if len(failed_hosts) == 0:
898 + message = f"All {len(successful_hosts)} hosts connected successfully"
899 + else:
900 + message = f"{len(successful_hosts)} of {len(hosts)} hosts connected successfully"
901 + else:
902 + message = f"All {len(hosts)} hosts failed to connect"
903 +
904 + return {
905 + "connectionSuccessful": overall_success,
906 + "message": message,
907 + "total_hosts": len(hosts),
908 + "successful_hosts": len(successful_hosts),
909 + "failed_hosts": len(failed_hosts),
910 + "successful_host_list": successful_hosts,
911 + "failed_host_list": failed_hosts,
912 + "connection_details": connection_details,
913 + }
914 +
915
916 async def verify_wazuh_worker_provisioning_connection(connector_name: str) -> str:
917 """
frontend/package.json
+8 -8
@@ -45,7 +45,7 @@
45 "@fontsource/jetbrains-mono": "^5.2.5",
46 "@fontsource/lexend": "^5.2.8",
47 "@fontsource/public-sans": "^5.2.5",
48 - "@shikijs/markdown-it": "^3.4.2",
48 + "@shikijs/markdown-it": "^3.6.0",
49 "@vueuse/core": "^13.3.0",
50 "@vueuse/motion": "^3.0.3",
51 "axios": "^1.9.0",
@@ -64,10 +64,10 @@
64 "naive-ui": "^2.41.0",
65 "nanoid": "^5.1.5",
66 "password-validator": "^5.3.0",
67 - "pinia": "^3.0.2",
67 + "pinia": "^3.0.3",
68 "pinia-plugin-persistedstate": "^4.3.0",
69 "secure-ls": "^2.0.0",
70 - "shiki": "^3.4.2",
70 + "shiki": "^3.6.0",
71 "thememirror": "^2.0.1",
72 "validator": "^13.15.15",
73 "vue": "^3.5.16",
@@ -82,12 +82,12 @@
82 "vuedraggable": "^4.1.0"
83 },
84 "optionalDependencies": {
85 - "@rollup/rollup-linux-x64-gnu": "^4.41.1",
85 + "@rollup/rollup-linux-x64-gnu": "^4.42.0",
86 "treemate": "^0.3.11",
87 "vueuc": "^0.4.64"
88 },
89 "devDependencies": {
90 - "@antfu/eslint-config": "^4.13.2",
90 + "@antfu/eslint-config": "^4.14.1",
91 "@clack/prompts": "^0.11.0",
92 "@iconify/vue": "^5.0.0",
93 "@tailwindcss/vite": "^4.1.8",
@@ -98,13 +98,13 @@
98 "@types/jsdom": "^21.1.7",
99 "@types/lodash": "^4.17.17",
100 "@types/markdown-it": "^14.1.2",
101 - "@types/node": "^22.15.29",
101 + "@types/node": "^22.15.30",
102 "@types/validator": "^13.15.1",
103 "@vitejs/plugin-vue": "^5.2.4",
104 "@vitejs/plugin-vue-jsx": "^4.2.0",
105 "@vue/test-utils": "^2.4.6",
106 "@vue/tsconfig": "^0.7.0",
107 - "cypress": "^14.4.0",
107 + "cypress": "^14.4.1",
108 "depcheck": "^1.4.7",
109 "eslint": "^9.28.0",
110 "flourite": "^1.3.0",
@@ -123,7 +123,7 @@
123 "vite-bundle-visualizer": "^1.2.1",
124 "vite-plugin-vue-devtools": "^7.7.6",
125 "vite-svg-loader": "^5.1.0",
126 - "vitest": "^3.2.0",
126 + "vitest": "^3.2.2",
127 "vue-tsc": "^2.2.10"
128 },
129 "pnpm": {
frontend/pnpm-lock.yaml
+275 -547
@@ -36,8 +36,8 @@ importers:
36 specifier: ^5.2.5
37 version: 5.2.5
38 '@shikijs/markdown-it':
39 - specifier: ^3.4.2
40 - version: 3.4.2
39 + specifier: ^3.6.0
40 + version: 3.6.0
41 '@vueuse/core':
42 specifier: ^13.3.0
43 version: 13.3.0(vue@3.5.16(typescript@5.8.3))
@@ -93,17 +93,17 @@ importers:
93 specifier: ^5.3.0
94 version: 5.3.0
95 pinia:
96 - specifier: ^3.0.2
97 - version: 3.0.2(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))
96 + specifier: ^3.0.3
97 + version: 3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))
98 pinia-plugin-persistedstate:
99 specifier: ^4.3.0
100 - version: 4.3.0(pinia@3.0.2(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)))
100 + version: 4.3.0(pinia@3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)))
101 secure-ls:
102 specifier: ^2.0.0
103 version: 2.0.0
104 shiki:
105 - specifier: ^3.4.2
106 - version: 3.4.2
105 + specifier: ^3.6.0
106 + version: 3.6.0
107 thememirror:
108 specifier: ^2.0.1
109 version: 2.0.1(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.8)
@@ -142,8 +142,8 @@ importers:
142 version: 4.1.0(vue@3.5.16(typescript@5.8.3))
143 devDependencies:
144 '@antfu/eslint-config':
145 - specifier: ^4.13.2
146 - version: 4.13.2(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
145 + specifier: ^4.14.1
146 + version: 4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
147 '@clack/prompts':
148 specifier: ^0.11.0
149 version: 0.11.0
@@ -152,7 +152,7 @@ importers:
152 version: 5.0.0(vue@3.5.16(typescript@5.8.3))
153 '@tailwindcss/vite':
154 specifier: ^4.1.8
155 - version: 4.1.8(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
155 + version: 4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
156 '@tsconfig/node20':
157 specifier: ^20.1.5
158 version: 20.1.5
@@ -175,17 +175,17 @@ importers:
175 specifier: ^14.1.2
176 version: 14.1.2
177 '@types/node':
178 - specifier: ^22.15.29
179 - version: 22.15.29
178 + specifier: ^22.15.30
179 + version: 22.15.30
180 '@types/validator':
181 specifier: ^13.15.1
182 version: 13.15.1
183 '@vitejs/plugin-vue':
184 specifier: ^5.2.4
185 - version: 5.2.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
185 + version: 5.2.4(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
186 '@vitejs/plugin-vue-jsx':
187 specifier: ^4.2.0
188 - version: 4.2.0(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
188 + version: 4.2.0(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
189 '@vue/test-utils':
190 specifier: ^2.4.6
191 version: 2.4.6
@@ -193,8 +193,8 @@ importers:
193 specifier: ^0.7.0
194 version: 0.7.0(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))
195 cypress:
196 - specifier: ^14.4.0
197 - version: 14.4.0
196 + specifier: ^14.4.1
197 + version: 14.4.1
198 depcheck:
199 specifier: ^1.4.7
200 version: 1.4.7
@@ -239,26 +239,26 @@ importers:
239 version: 5.8.3
240 vite:
241 specifier: ^6.3.5
242 - version: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
242 + version: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
243 vite-bundle-visualizer:
244 specifier: ^1.2.1
245 version: 1.2.1(rollup@4.41.1)
246 vite-plugin-vue-devtools:
247 specifier: ^7.7.6
248 - version: 7.7.6(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
248 + version: 7.7.6(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
249 vite-svg-loader:
250 specifier: ^5.1.0
251 version: 5.1.0(vue@3.5.16(typescript@5.8.3))
252 vitest:
253 - specifier: ^3.2.0
254 - version: 3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
253 + specifier: ^3.2.2
254 + version: 3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
255 vue-tsc:
256 specifier: ^2.2.10
257 version: 2.2.10(typescript@5.8.3)
258 optionalDependencies:
259 '@rollup/rollup-linux-x64-gnu':
260 - specifier: ^4.41.1
261 - version: 4.41.1
260 + specifier: ^4.42.0
261 + version: 4.42.0
262 treemate:
263 specifier: ^0.3.11
264 version: 0.3.11
@@ -275,8 +275,8 @@ packages:
275 resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
276 engines: {node: '>=6.0.0'}
277
278 - '@antfu/eslint-config@4.13.2':
279 - resolution: {integrity: sha512-F+IVIQUCfw6eW4H06c9a9USJ3UOnoBx4I0qsTL3kO6GcyJB6mwk+nawFf95DfHKT3fJKv58YPPz0XCmsY/w0XA==}
278 + '@antfu/eslint-config@4.14.1':
279 + resolution: {integrity: sha512-SVGR33/jSUwMWvC8q3NGF/XEHWFJVfMg8yaQJDtRSGISXm23DVA/ANTADpRKhXpk7IjfnjzPpbT/+T6wFzOmUA==}
280 hasBin: true
281 peerDependencies:
282 '@eslint-react/eslint-plugin': ^1.38.4
@@ -473,15 +473,9 @@ packages:
473 resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==}
474 engines: {node: '>=6.9.0'}
475
476 - '@clack/core@0.4.2':
477 - resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==}
478 -
476 '@clack/core@0.5.0':
477 resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==}
478
482 - '@clack/prompts@0.10.1':
483 - resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==}
484 -
479 '@clack/prompts@0.11.0':
480 resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==}
481
@@ -560,15 +554,6 @@ packages:
554 '@cypress/xvfb@1.2.4':
555 resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
556
563 - '@emnapi/core@1.4.3':
564 - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==}
565 -
566 - '@emnapi/runtime@1.4.3':
567 - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==}
568 -
569 - '@emnapi/wasi-threads@1.0.2':
570 - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==}
571 -
557 '@emotion/hash@0.8.0':
558 resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
559
@@ -759,10 +744,6 @@ packages:
744 resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==}
745 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
746
762 - '@eslint/core@0.10.0':
763 - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
764 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
765 -
747 '@eslint/core@0.13.0':
748 resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==}
749 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -779,8 +760,8 @@ packages:
760 resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==}
761 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
762
782 - '@eslint/markdown@6.4.0':
783 - resolution: {integrity: sha512-J07rR8uBSNFJ9iliNINrchilpkmCihPmTVotpThUeKEn5G8aBBZnkjNBy/zovhJA5LBk1vWU9UDlhqKSc/dViQ==}
763 + '@eslint/markdown@6.5.0':
764 + resolution: {integrity: sha512-oSkF0p8X21vKEEAGTZASi7q3tbdTvlGduQ02Xz2A1AFncUP4RLVcNz27XurxVW4fs1JXuh0xBtvokXdtp/nN+Q==}
765 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
766
767 '@eslint/object-schema@2.1.6':
@@ -902,9 +883,6 @@ packages:
883 '@marijn/find-cluster-break@1.0.2':
884 resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
885
905 - '@napi-rs/wasm-runtime@0.2.10':
906 - resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==}
907 -
886 '@nodelib/fs.scandir@2.1.5':
887 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
888 engines: {node: '>= 8'}
@@ -1113,6 +1091,11 @@ packages:
1091 cpu: [x64]
1092 os: [linux]
1093
1094 + '@rollup/rollup-linux-x64-gnu@4.42.0':
1095 + resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==}
1096 + cpu: [x64]
1097 + os: [linux]
1098 +
1099 '@rollup/rollup-linux-x64-musl@4.41.1':
1100 resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==}
1101 cpu: [x64]
@@ -1136,31 +1119,31 @@ packages:
1119 '@sec-ant/readable-stream@0.4.1':
1120 resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
1121
1139 - '@shikijs/core@3.4.2':
1140 - resolution: {integrity: sha512-AG8vnSi1W2pbgR2B911EfGqtLE9c4hQBYkv/x7Z+Kt0VxhgQKcW7UNDVYsu9YxwV6u+OJrvdJrMq6DNWoBjihQ==}
1122 + '@shikijs/core@3.6.0':
1123 + resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==}
1124
1142 - '@shikijs/engine-javascript@3.4.2':
1143 - resolution: {integrity: sha512-1/adJbSMBOkpScCE/SB6XkjJU17ANln3Wky7lOmrnpl+zBdQ1qXUJg2GXTYVHRq+2j3hd1DesmElTXYDgtfSOQ==}
1125 + '@shikijs/engine-javascript@3.6.0':
1126 + resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==}
1127
1145 - '@shikijs/engine-oniguruma@3.4.2':
1146 - resolution: {integrity: sha512-zcZKMnNndgRa3ORja6Iemsr3DrLtkX3cAF7lTJkdMB6v9alhlBsX9uNiCpqofNrXOvpA3h6lHcLJxgCIhVOU5Q==}
1128 + '@shikijs/engine-oniguruma@3.6.0':
1129 + resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==}
1130
1148 - '@shikijs/langs@3.4.2':
1149 - resolution: {integrity: sha512-H6azIAM+OXD98yztIfs/KH5H4PU39t+SREhmM8LaNXyUrqj2mx+zVkr8MWYqjceSjDw9I1jawm1WdFqU806rMA==}
1131 + '@shikijs/langs@3.6.0':
1132 + resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==}
1133
1151 - '@shikijs/markdown-it@3.4.2':
1152 - resolution: {integrity: sha512-koJ4Mm5HcTJw2v5X9RFEfbc/4pho+p2co5xNtLSQNNWaCZWSTB7WDxZS+OYX6OkQ1HUgxu7WK/1mxtfiKCPVbw==}
1134 + '@shikijs/markdown-it@3.6.0':
1135 + resolution: {integrity: sha512-OFJb0EY1GOfWEpeXyfav4mDXt4QjqURwhQLTYaBeWP4QjBUUYIdPri+Jf8Fgkds+i4I6WcmX47Wu9vAq8USZsA==}
1136 peerDependencies:
1137 markdown-it-async: ^2.2.0
1138 peerDependenciesMeta:
1139 markdown-it-async:
1140 optional: true
1141
1159 - '@shikijs/themes@3.4.2':
1160 - resolution: {integrity: sha512-qAEuAQh+brd8Jyej2UDDf+b4V2g1Rm8aBIdvt32XhDPrHvDkEnpb7Kzc9hSuHUxz0Iuflmq7elaDuQAP9bHIhg==}
1142 + '@shikijs/themes@3.6.0':
1143 + resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==}
1144
1162 - '@shikijs/types@3.4.2':
1163 - resolution: {integrity: sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg==}
1145 + '@shikijs/types@3.6.0':
1146 + resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==}
1147
1148 '@shikijs/vscode-textmate@10.0.2':
1149 resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -1178,8 +1161,8 @@ packages:
1161 resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
1162 engines: {node: '>=18'}
1163
1181 - '@stylistic/eslint-plugin@4.4.0':
1182 - resolution: {integrity: sha512-bIh/d9X+OQLCAMdhHtps+frvyjvAM4B1YlSJzcEEhl7wXLIqPar3ngn9DrHhkBOrTA/z9J0bUMtctAspe0dxdQ==}
1164 + '@stylistic/eslint-plugin@5.0.0-beta.1':
1165 + resolution: {integrity: sha512-26syM7oRlnfUVoQ58GoPVXAXS3rSknWtD9dAx3XHIYxSQsqmd1Uuw7ILG0E6YSO+VYTlhuOcmikP/dg8Cu9d0Q==}
1166 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1167 peerDependencies:
1168 eslint: '>=9.0.0'
@@ -1306,9 +1289,6 @@ packages:
1289 '@tsconfig/node20@20.1.5':
1290 resolution: {integrity: sha512-Vm8e3WxDTqMGPU4GATF9keQAIy1Drd7bPwlgzKJnZtoOsTm1tduUTbDjg0W5qERvGuxPI2h9RbMufH0YdfBylA==}
1291
1309 - '@tybys/wasm-util@0.9.0':
1310 - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
1311 -
1292 '@types/bytes@3.1.5':
1293 resolution: {integrity: sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==}
1294
@@ -1369,8 +1349,8 @@ packages:
1349 '@types/ms@2.1.0':
1350 resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
1351
1372 - '@types/node@22.15.29':
1373 - resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==}
1352 + '@types/node@22.15.30':
1353 + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==}
1354
1355 '@types/parse-json@4.0.2':
1356 resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -1396,151 +1376,68 @@ packages:
1376 '@types/yauzl@2.10.3':
1377 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
1378
1399 - '@typescript-eslint/eslint-plugin@8.33.0':
1400 - resolution: {integrity: sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==}
1379 + '@typescript-eslint/eslint-plugin@8.33.1':
1380 + resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==}
1381 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1382 peerDependencies:
1403 - '@typescript-eslint/parser': ^8.33.0
1383 + '@typescript-eslint/parser': ^8.33.1
1384 eslint: ^8.57.0 || ^9.0.0
1385 typescript: '>=4.8.4 <5.9.0'
1386
1407 - '@typescript-eslint/parser@8.33.0':
1408 - resolution: {integrity: sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==}
1387 + '@typescript-eslint/parser@8.33.1':
1388 + resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==}
1389 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1390 peerDependencies:
1391 eslint: ^8.57.0 || ^9.0.0
1392 typescript: '>=4.8.4 <5.9.0'
1393
1414 - '@typescript-eslint/project-service@8.33.0':
1415 - resolution: {integrity: sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==}
1394 + '@typescript-eslint/project-service@8.33.1':
1395 + resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==}
1396 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1397 + peerDependencies:
1398 + typescript: '>=4.8.4 <5.9.0'
1399
1418 - '@typescript-eslint/scope-manager@8.33.0':
1419 - resolution: {integrity: sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==}
1400 + '@typescript-eslint/scope-manager@8.33.1':
1401 + resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==}
1402 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1403
1422 - '@typescript-eslint/tsconfig-utils@8.33.0':
1423 - resolution: {integrity: sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==}
1404 + '@typescript-eslint/tsconfig-utils@8.33.1':
1405 + resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==}
1406 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1407 peerDependencies:
1408 typescript: '>=4.8.4 <5.9.0'
1409
1428 - '@typescript-eslint/type-utils@8.33.0':
1429 - resolution: {integrity: sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==}
1410 + '@typescript-eslint/type-utils@8.33.1':
1411 + resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==}
1412 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1413 peerDependencies:
1414 eslint: ^8.57.0 || ^9.0.0
1415 typescript: '>=4.8.4 <5.9.0'
1416
1435 - '@typescript-eslint/types@8.33.0':
1436 - resolution: {integrity: sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==}
1417 + '@typescript-eslint/types@8.33.1':
1418 + resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==}
1419 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1420
1439 - '@typescript-eslint/typescript-estree@8.33.0':
1440 - resolution: {integrity: sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==}
1421 + '@typescript-eslint/typescript-estree@8.33.1':
1422 + resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==}
1423 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1424 peerDependencies:
1425 typescript: '>=4.8.4 <5.9.0'
1426
1445 - '@typescript-eslint/utils@8.33.0':
1446 - resolution: {integrity: sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==}
1427 + '@typescript-eslint/utils@8.33.1':
1428 + resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==}
1429 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1430 peerDependencies:
1431 eslint: ^8.57.0 || ^9.0.0
1432 typescript: '>=4.8.4 <5.9.0'
1433
1452 - '@typescript-eslint/visitor-keys@8.33.0':
1453 - resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==}
1434 + '@typescript-eslint/visitor-keys@8.33.1':
1435 + resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==}
1436 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1437
1438 '@ungap/structured-clone@1.3.0':
1439 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
1440
1459 - '@unrs/resolver-binding-darwin-arm64@1.7.5':
1460 - resolution: {integrity: sha512-efMrMFYcAY+Bg3TjHS9TIxyLW7DCkbmWyaePXA/FTuNNgzUgM9ffBoeA+4g90DjHMUuGyIcM4+96w1RoxNP3Tw==}
1461 - cpu: [arm64]
1462 - os: [darwin]
1463 -
1464 - '@unrs/resolver-binding-darwin-x64@1.7.5':
1465 - resolution: {integrity: sha512-K5Usy9LwmeLohtZGOC0IxhybYluGMrtBP/l73jVNKvuk240KmblE6lphSbydrocvEZEVfTfLmba8UeoSUfnh4A==}
1466 - cpu: [x64]
1467 - os: [darwin]
1468 -
1469 - '@unrs/resolver-binding-freebsd-x64@1.7.5':
1470 - resolution: {integrity: sha512-4vur1vMwq/hOkruiR24shuatm56jZo098x8ETchIewX8RbSwyTqHjnnJZ1WTLX2Vkg9hgy4RQqFpLnrL6Xp/hQ==}
1471 - cpu: [x64]
1472 - os: [freebsd]
1473 -
1474 - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5':
1475 - resolution: {integrity: sha512-/hD8IHDjlTUb1/ePHavsaHYRF8lMDh+14TXHmxC8cwqrBVoHIzGZV66z2VjBDpDUtmAutptOhfKBpRLv0O0ywA==}
1476 - cpu: [arm]
1477 - os: [linux]
1478 -
1479 - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.5':
1480 - resolution: {integrity: sha512-UPrkyN5ziuT+uRATrwabvl8JZNMt1T/fN96bZVnK3E34lQLbku99biFEUHZgXh0knJzoSoAKWfyMyyrcv4Dqfg==}
1481 - cpu: [arm]
1482 - os: [linux]
1483 -
1484 - '@unrs/resolver-binding-linux-arm64-gnu@1.7.5':
1485 - resolution: {integrity: sha512-btpXWiZystUjfNviOWjf7gwjak0h1dSrzjDGn4b8OkSIMw3Gp4yYtOMZRXxUtaaZRdnOQHqRh9+39PyK6LXQbQ==}
1486 - cpu: [arm64]
1487 - os: [linux]
1488 -
1489 - '@unrs/resolver-binding-linux-arm64-musl@1.7.5':
1490 - resolution: {integrity: sha512-fzTDlm/RWRgHomLSabeV+/iKkAld+kUQaBJ2h0OveaV6+ZmZqEbdG9WDCe8U3/dax49mlPwZIvEnMZujzTPWCg==}
1491 - cpu: [arm64]
1492 - os: [linux]
1493 -
1494 - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.5':
1495 - resolution: {integrity: sha512-i+9usBSko2DyFvB7iimhfDtIk9tWhg4sKh7kZC8JGfGMdhYWZ8a40VvgE/Xj8iDsX6ngVRsIsgsNCU9jPx86zw==}
1496 - cpu: [ppc64]
1497 - os: [linux]
1498 -
1499 - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.5':
1500 - resolution: {integrity: sha512-gpdNeCckfTMOWyZ+AjB0KpgHE2aCCoGtKDSocKwU9RkfWpeVvpcokey5l1A68WXCDE33sonekbe8Wm4+E0z7VQ==}
1501 - cpu: [riscv64]
1502 - os: [linux]
1503 -
1504 - '@unrs/resolver-binding-linux-riscv64-musl@1.7.5':
1505 - resolution: {integrity: sha512-avni2nC47b0ZBCXL3lg6I3z9lyP1kKVYZXIyIsA/pcTra+Uuq0RgeWeEBc8IJ6DjGrpft7gWyyekrYK58VomGQ==}
1506 - cpu: [riscv64]
1507 - os: [linux]
1508 -
1509 - '@unrs/resolver-binding-linux-s390x-gnu@1.7.5':
1510 - resolution: {integrity: sha512-GLv1+kVnVluyG8KRIl176jIoExlhgl3ASZz+VGyQpv5EwD5FqOtZHFzsRJA3xXNQlnHj3iMO4SA/HX4dc6iOvA==}
1511 - cpu: [s390x]
1512 - os: [linux]
1513 -
1514 - '@unrs/resolver-binding-linux-x64-gnu@1.7.5':
1515 - resolution: {integrity: sha512-frsoBmP2ww2axFqZvIexnDF5UuO0exCZjrchM7uvPbNzZCaU+B43r6Y3ywEFsXXH6MbZNpw10Ntuwb9N0orfcg==}
1516 - cpu: [x64]
1517 - os: [linux]
1518 -
1519 - '@unrs/resolver-binding-linux-x64-musl@1.7.5':
1520 - resolution: {integrity: sha512-kdI20RI0k+XcA+vuW6KB/EJbzUvRfo8PsKy2DFlX1fhTVsEXaf21nkU9C3NdTwlTkl9YvvLGNTKoJDH7yn7K8w==}
1521 - cpu: [x64]
1522 - os: [linux]
1523 -
1524 - '@unrs/resolver-binding-wasm32-wasi@1.7.5':
1525 - resolution: {integrity: sha512-6F+PAhfsokXDtLihQzomvVK0rYzSP/qkgJg4+R4RaCmE3pwFspLeyUi1Wd11hwP4FQQn5/5Yw9jraUMQpMPWCg==}
1526 - engines: {node: '>=14.0.0'}
1527 - cpu: [wasm32]
1528 -
1529 - '@unrs/resolver-binding-win32-arm64-msvc@1.7.5':
1530 - resolution: {integrity: sha512-rZ1SRHK95gOqy7hQBcG2sxKMoKFRFAl8f+cGYayA3RRNidkY86uNsXZiWDGgIuelYXSudvAd9RElDib/Lkx7pQ==}
1531 - cpu: [arm64]
1532 - os: [win32]
1533 -
1534 - '@unrs/resolver-binding-win32-ia32-msvc@1.7.5':
1535 - resolution: {integrity: sha512-49JiW5JickDuC/VqSBlbZTqwX8sJBGBfodU/v4+vM8Eig63JOAK7bOtG8M8kxXRrkJIGhumba4cTf4QcWbMRcg==}
1536 - cpu: [ia32]
1537 - os: [win32]
1538 -
1539 - '@unrs/resolver-binding-win32-x64-msvc@1.7.5':
1540 - resolution: {integrity: sha512-69JcsNlbafX/FsafXswKb5M+jPXC9IRcNVz5SqEKH9+PA5jmJ6+fFyjFX1pipBRADGn+EuPhCeDcQl+CAxP+2g==}
1541 - cpu: [x64]
1542 - os: [win32]
1543 -
1441 '@vitejs/plugin-vue-jsx@4.2.0':
1442 resolution: {integrity: sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==}
1443 engines: {node: ^18.0.0 || >=20.0.0}
@@ -1567,11 +1464,11 @@ packages:
1464 vitest:
1465 optional: true
1466
1570 - '@vitest/expect@3.2.0':
1571 - resolution: {integrity: sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA==}
1467 + '@vitest/expect@3.2.2':
1468 + resolution: {integrity: sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==}
1469
1573 - '@vitest/mocker@3.2.0':
1574 - resolution: {integrity: sha512-HFcW0lAMx3eN9vQqis63H0Pscv0QcVMo1Kv8BNysZbxcmHu3ZUYv59DS6BGYiGQ8F5lUkmsfMMlPm4DJFJdf/A==}
1470 + '@vitest/mocker@3.2.2':
1471 + resolution: {integrity: sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==}
1472 peerDependencies:
1473 msw: ^2.4.9
1474 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
@@ -1581,20 +1478,20 @@ packages:
1478 vite:
1479 optional: true
1480
1584 - '@vitest/pretty-format@3.2.0':
1585 - resolution: {integrity: sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw==}
1481 + '@vitest/pretty-format@3.2.2':
1482 + resolution: {integrity: sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==}
1483
1587 - '@vitest/runner@3.2.0':
1588 - resolution: {integrity: sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA==}
1484 + '@vitest/runner@3.2.2':
1485 + resolution: {integrity: sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==}
1486
1590 - '@vitest/snapshot@3.2.0':
1591 - resolution: {integrity: sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A==}
1487 + '@vitest/snapshot@3.2.2':
1488 + resolution: {integrity: sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==}
1489
1593 - '@vitest/spy@3.2.0':
1594 - resolution: {integrity: sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw==}
1490 + '@vitest/spy@3.2.2':
1491 + resolution: {integrity: sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==}
1492
1596 - '@vitest/utils@3.2.0':
1597 - resolution: {integrity: sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw==}
1493 + '@vitest/utils@3.2.2':
1494 + resolution: {integrity: sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==}
1495
1496 '@volar/language-core@2.4.14':
1497 resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==}
@@ -1784,6 +1681,10 @@ packages:
1681 resolution: {integrity: sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw==}
1682 engines: {node: '>=14'}
1683
1684 + ansis@4.1.0:
1685 + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==}
1686 + engines: {node: '>=14'}
1687 +
1688 apexcharts@4.7.0:
1689 resolution: {integrity: sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==}
1690
@@ -2147,8 +2048,8 @@ packages:
2048 csstype@3.1.3:
2049 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
2050
2150 - cypress@14.4.0:
2151 - resolution: {integrity: sha512-/I59Fqxo7fqdiDi3IM2QKA65gZ7+PVejXg404/I8ZSq+NOnrmw+2pnMUJzpoNyg7KABcEBmgpkfAqhV98p7wJA==}
2051 + cypress@14.4.1:
2052 + resolution: {integrity: sha512-YSGvVXtTqSGRTyHbaxHI5dHU/9xc5ymaTIM4BU85GKhj980y6XgA3fShSpj5DatS8knXMsAvYItQxVQFHGpUtw==}
2053 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2054 hasBin: true
2055
@@ -2405,18 +2306,6 @@ packages:
2306 eslint-flat-config-utils@2.1.0:
2307 resolution: {integrity: sha512-6fjOJ9tS0k28ketkUcQ+kKptB4dBZY2VijMZ9rGn8Cwnn1SH0cZBoPXT8AHBFHxmHcLFQK9zbELDinZ2Mr1rng==}
2308
2408 - eslint-import-context@0.1.6:
2409 - resolution: {integrity: sha512-/e2ZNPDLCrU8niIy0pddcvXuoO2YrKjf3NAIX+60mHJBT4yv7mqCqvVdyCW2E720e25e4S/1OSVef4U6efGLFg==}
2410 - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
2411 - peerDependencies:
2412 - unrs-resolver: ^1.0.0
2413 - peerDependenciesMeta:
2414 - unrs-resolver:
2415 - optional: true
2416 -
2417 - eslint-import-resolver-node@0.3.9:
2418 - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
2419 -
2309 eslint-json-compat-utils@0.2.1:
2310 resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==}
2311 engines: {node: '>=12'}
@@ -2449,14 +2338,8 @@ packages:
2338 peerDependencies:
2339 eslint: '>=8'
2340
2452 - eslint-plugin-import-x@4.13.3:
2453 - resolution: {integrity: sha512-CDewJDEeYQhm94KGCDYiuwU1SdaWc/vh+SziSKkF7kichAqAFnQYtSYUvSwSBbiBjYLxV5uUxocxxQobRI9YXA==}
2454 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2455 - peerDependencies:
2456 - eslint: ^8.57.0 || ^9.0.0
2457 -
2458 - eslint-plugin-jsdoc@50.6.17:
2459 - resolution: {integrity: sha512-hq+VQylhd12l8qjexyriDsejZhqiP33WgMTy2AmaGZ9+MrMWVqPECsM87GPxgHfQn0zw+YTuhqjUfk1f+q67aQ==}
2341 + eslint-plugin-jsdoc@50.7.1:
2342 + resolution: {integrity: sha512-XBnVA5g2kUVokTNUiE1McEPse5n9/mNUmuJcx52psT6zBs2eVcXSmQBvjfa7NZdfLVSy3u1pEDDUxoxpwy89WA==}
2343 engines: {node: '>=18'}
2344 peerDependencies:
2345 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -2467,8 +2350,8 @@ packages:
2350 peerDependencies:
2351 eslint: '>=6.0.0'
2352
2470 - eslint-plugin-n@17.18.0:
2471 - resolution: {integrity: sha512-hvZ/HusueqTJ7VDLoCpjN0hx4N4+jHIWTXD4TMLHy9F23XkDagR9v+xQWRWR57yY55GPF8NnD4ox9iGTxirY8A==}
2353 + eslint-plugin-n@17.19.0:
2354 + resolution: {integrity: sha512-qxn1NaDHtizbhVAPpbMT8wWFaLtPnwhfN/e+chdu2i6Vgzmo/tGM62tcJ1Hf7J5Ie4dhse3DOPMmDxduzfifzw==}
2355 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2356 peerDependencies:
2357 eslint: '>=8.23.0'
@@ -2477,8 +2360,8 @@ packages:
2360 resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
2361 engines: {node: '>=5.0.0'}
2362
2480 - eslint-plugin-perfectionist@4.13.0:
2481 - resolution: {integrity: sha512-dsPwXwV7IrG26PJ+h1crQ1f5kxay/gQAU0NJnbVTQc91l5Mz9kPjyIZ7fXgie+QSgi8a+0TwGbfaJx+GIhzuoQ==}
2363 + eslint-plugin-perfectionist@4.14.0:
2364 + resolution: {integrity: sha512-BkhiOqzdum8vQSFgj1/q5+6UUWPMn4GELdxuX7uIsGegmAeH/+LnWsiVxgMrxalD0p68sYfMeKaHF1NfrpI/mg==}
2365 engines: {node: ^18.0.0 || >=20.0.0}
2366 peerDependencies:
2367 eslint: '>=8.45.0'
@@ -2488,8 +2371,8 @@ packages:
2371 peerDependencies:
2372 eslint: ^9.0.0
2373
2491 - eslint-plugin-regexp@2.7.0:
2492 - resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==}
2374 + eslint-plugin-regexp@2.8.0:
2375 + resolution: {integrity: sha512-xme90IvkMgdyS+NJC21FM0H6ek4urGsdlIFTXpZRqH2BKJKVSd8hRbyrCpbcqfGBi2jth3eQoLiO3RC1gxZHiw==}
2376 engines: {node: ^18 || >=20}
2377 peerDependencies:
2378 eslint: '>=8.44.0'
@@ -2515,8 +2398,8 @@ packages:
2398 '@typescript-eslint/eslint-plugin':
2399 optional: true
2400
2518 - eslint-plugin-vue@10.1.0:
2519 - resolution: {integrity: sha512-/VTiJ1eSfNLw6lvG9ENySbGmcVvz6wZ9nA7ZqXlLBY2RkaF15iViYKxglWiIch12KiLAj0j1iXPYU6W4wTROFA==}
2401 + eslint-plugin-vue@10.2.0:
2402 + resolution: {integrity: sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==}
2403 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2404 peerDependencies:
2405 eslint: ^8.57.0 || ^9.0.0
@@ -3512,10 +3395,6 @@ packages:
3395 resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
3396 engines: {node: '>=4'}
3397
3515 - minimatch@10.0.1:
3516 - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
3517 - engines: {node: 20 || >=22}
3518 -
3398 minimatch@3.1.2:
3399 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
3400
@@ -3582,11 +3461,6 @@ packages:
3461 engines: {node: ^18 || >=20}
3462 hasBin: true
3463
3585 - napi-postinstall@0.2.4:
3586 - resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==}
3587 - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
3588 - hasBin: true
3589 -
3464 natural-compare@1.4.0:
3465 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
3466
@@ -3805,8 +3679,8 @@ packages:
3679 pinia:
3680 optional: true
3681
3808 - pinia@3.0.2:
3809 - resolution: {integrity: sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==}
3682 + pinia@3.0.3:
3683 + resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==}
3684 peerDependencies:
3685 typescript: '>=4.4.4'
3686 vue: ^2.7.0 || ^3.5.11
@@ -4124,8 +3998,8 @@ packages:
3998 resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
3999 engines: {node: '>= 0.4'}
4000
4127 - shiki@3.4.2:
4128 - resolution: {integrity: sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==}
4001 + shiki@3.6.0:
4002 + resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==}
4003
4004 side-channel-list@1.0.0:
4005 resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
@@ -4206,9 +4080,6 @@ packages:
4080 engines: {node: '>=0.10.0'}
4081 hasBin: true
4082
4209 - stable-hash@0.0.5:
4210 - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
4211 -
4083 stackback@0.0.2:
4084 resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
4085
@@ -4395,6 +4266,11 @@ packages:
4266 peerDependencies:
4267 typescript: '>=4.8.4'
4268
4269 + ts-declaration-location@1.0.7:
4270 + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==}
4271 + peerDependencies:
4272 + typescript: '>=4.0.0'
4273 +
4274 tslib@2.3.0:
4275 resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
4276
@@ -4477,9 +4353,6 @@ packages:
4353 resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==}
4354 engines: {node: '>=18.12.0'}
4355
4480 - unrs-resolver@1.7.5:
4481 - resolution: {integrity: sha512-DnuJxogme0dCRIdH+yIwpaNLWfff9DqcpfDh4J8qca17rOnu6e3AfNzB8mnUzjv7EgayXQkwnt1A2vT8BM9ZHA==}
4482 -
4356 untildify@4.0.0:
4357 resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
4358 engines: {node: '>=8'}
@@ -4533,8 +4406,8 @@ packages:
4406 peerDependencies:
4407 vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
4408
4536 - vite-node@3.2.0:
4537 - resolution: {integrity: sha512-8Fc5Ko5Y4URIJkmMF/iFP1C0/OJyY+VGVe9Nw6WAdZyw4bTO+eVg9mwxWkQp/y8NnAoQY3o9KAvE1ZdA2v+Vmg==}
4409 + vite-node@3.2.2:
4410 + resolution: {integrity: sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==}
4411 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
4412 hasBin: true
4413
@@ -4604,16 +4477,16 @@ packages:
4477 yaml:
4478 optional: true
4479
4607 - vitest@3.2.0:
4608 - resolution: {integrity: sha512-P7Nvwuli8WBNmeMHHek7PnGW4oAZl9za1fddfRVidZar8wDZRi7hpznLKQePQ8JPLwSBEYDK11g+++j7uFJV8Q==}
4480 + vitest@3.2.2:
4481 + resolution: {integrity: sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==}
4482 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
4483 hasBin: true
4484 peerDependencies:
4485 '@edge-runtime/vm': '*'
4486 '@types/debug': ^4.1.12
4487 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
4615 - '@vitest/browser': 3.2.0
4616 - '@vitest/ui': 3.2.0
4488 + '@vitest/browser': 3.2.2
4489 + '@vitest/ui': 3.2.2
4490 happy-dom: '*'
4491 jsdom: '*'
4492 peerDependenciesMeta:
@@ -4878,17 +4751,17 @@ snapshots:
4751 '@jridgewell/gen-mapping': 0.3.8
4752 '@jridgewell/trace-mapping': 0.3.25
4753
4881 - '@antfu/eslint-config@4.13.2(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
4754 + '@antfu/eslint-config@4.14.1(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
4755 dependencies:
4756 '@antfu/install-pkg': 1.1.0
4884 - '@clack/prompts': 0.10.1
4757 + '@clack/prompts': 0.11.0
4758 '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.28.0(jiti@2.4.2))
4886 - '@eslint/markdown': 6.4.0
4887 - '@stylistic/eslint-plugin': 4.4.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4888 - '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4889 - '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4890 - '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
4891 - ansis: 4.0.0
4759 + '@eslint/markdown': 6.5.0
4760 + '@stylistic/eslint-plugin': 5.0.0-beta.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4761 + '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4762 + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4763 + '@vitest/eslint-plugin': 1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
4764 + ansis: 4.1.0
4765 cac: 6.7.14
4766 eslint: 9.28.0(jiti@2.4.2)
4767 eslint-config-flat-gitignore: 2.1.0(eslint@9.28.0(jiti@2.4.2))
@@ -4896,18 +4769,17 @@ snapshots:
4769 eslint-merge-processors: 2.0.0(eslint@9.28.0(jiti@2.4.2))
4770 eslint-plugin-antfu: 3.1.1(eslint@9.28.0(jiti@2.4.2))
4771 eslint-plugin-command: 3.2.1(eslint@9.28.0(jiti@2.4.2))
4899 - eslint-plugin-import-x: 4.13.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4900 - eslint-plugin-jsdoc: 50.6.17(eslint@9.28.0(jiti@2.4.2))
4772 + eslint-plugin-jsdoc: 50.7.1(eslint@9.28.0(jiti@2.4.2))
4773 eslint-plugin-jsonc: 2.20.1(eslint@9.28.0(jiti@2.4.2))
4902 - eslint-plugin-n: 17.18.0(eslint@9.28.0(jiti@2.4.2))
4774 + eslint-plugin-n: 17.19.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4775 eslint-plugin-no-only-tests: 3.3.0
4904 - eslint-plugin-perfectionist: 4.13.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4776 + eslint-plugin-perfectionist: 4.14.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
4777 eslint-plugin-pnpm: 0.3.1(eslint@9.28.0(jiti@2.4.2))
4906 - eslint-plugin-regexp: 2.7.0(eslint@9.28.0(jiti@2.4.2))
4778 + eslint-plugin-regexp: 2.8.0(eslint@9.28.0(jiti@2.4.2))
4779 eslint-plugin-toml: 0.12.0(eslint@9.28.0(jiti@2.4.2))
4780 eslint-plugin-unicorn: 59.0.1(eslint@9.28.0(jiti@2.4.2))
4909 - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))
4910 - eslint-plugin-vue: 10.1.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)))
4781 + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))
4782 + eslint-plugin-vue: 10.2.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)))
4783 eslint-plugin-yml: 1.18.0(eslint@9.28.0(jiti@2.4.2))
4784 eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.16)(eslint@9.28.0(jiti@2.4.2))
4785 globals: 16.2.0
@@ -5135,22 +5007,11 @@ snapshots:
5007 '@babel/helper-string-parser': 7.27.1
5008 '@babel/helper-validator-identifier': 7.27.1
5009
5138 - '@clack/core@0.4.2':
5139 - dependencies:
5140 - picocolors: 1.1.1
5141 - sisteransi: 1.0.5
5142 -
5010 '@clack/core@0.5.0':
5011 dependencies:
5012 picocolors: 1.1.1
5013 sisteransi: 1.0.5
5014
5148 - '@clack/prompts@0.10.1':
5149 - dependencies:
5150 - '@clack/core': 0.4.2
5151 - picocolors: 1.1.1
5152 - sisteransi: 1.0.5
5153 -
5015 '@clack/prompts@0.11.0':
5016 dependencies:
5017 '@clack/core': 0.5.0
@@ -5284,28 +5145,12 @@ snapshots:
5145 transitivePeerDependencies:
5146 - supports-color
5147
5287 - '@emnapi/core@1.4.3':
5288 - dependencies:
5289 - '@emnapi/wasi-threads': 1.0.2
5290 - tslib: 2.8.1
5291 - optional: true
5292 -
5293 - '@emnapi/runtime@1.4.3':
5294 - dependencies:
5295 - tslib: 2.8.1
5296 - optional: true
5297 -
5298 - '@emnapi/wasi-threads@1.0.2':
5299 - dependencies:
5300 - tslib: 2.8.1
5301 - optional: true
5302 -
5148 '@emotion/hash@0.8.0': {}
5149
5150 '@es-joy/jsdoccomment@0.50.2':
5151 dependencies:
5152 '@types/estree': 1.0.7
5308 - '@typescript-eslint/types': 8.33.0
5153 + '@typescript-eslint/types': 8.33.1
5154 comment-parser: 1.4.1
5155 esquery: 1.6.0
5156 jsdoc-type-pratt-parser: 4.1.0
@@ -5412,10 +5257,6 @@ snapshots:
5257
5258 '@eslint/config-helpers@0.2.2': {}
5259
5415 - '@eslint/core@0.10.0':
5416 - dependencies:
5417 - '@types/json-schema': 7.0.15
5418 -
5260 '@eslint/core@0.13.0':
5261 dependencies:
5262 '@types/json-schema': 7.0.15
@@ -5440,10 +5281,10 @@ snapshots:
5281
5282 '@eslint/js@9.28.0': {}
5283
5443 - '@eslint/markdown@6.4.0':
5284 + '@eslint/markdown@6.5.0':
5285 dependencies:
5445 - '@eslint/core': 0.10.0
5446 - '@eslint/plugin-kit': 0.2.8
5286 + '@eslint/core': 0.14.0
5287 + '@eslint/plugin-kit': 0.3.1
5288 mdast-util-from-markdown: 2.0.2
5289 mdast-util-frontmatter: 2.0.1
5290 mdast-util-gfm: 3.1.0
@@ -5569,13 +5410,6 @@ snapshots:
5410
5411 '@marijn/find-cluster-break@1.0.2': {}
5412
5572 - '@napi-rs/wasm-runtime@0.2.10':
5573 - dependencies:
5574 - '@emnapi/core': 1.4.3
5575 - '@emnapi/runtime': 1.4.3
5576 - '@tybys/wasm-util': 0.9.0
5577 - optional: true
5578 -
5413 '@nodelib/fs.scandir@2.1.5':
5414 dependencies:
5415 '@nodelib/fs.stat': 2.0.5
@@ -5747,6 +5581,9 @@ snapshots:
5581 '@rollup/rollup-linux-x64-gnu@4.41.1':
5582 optional: true
5583
5584 + '@rollup/rollup-linux-x64-gnu@4.42.0':
5585 + optional: true
5586 +
5587 '@rollup/rollup-linux-x64-musl@4.41.1':
5588 optional: true
5589
@@ -5761,38 +5598,38 @@ snapshots:
5598
5599 '@sec-ant/readable-stream@0.4.1': {}
5600
5764 - '@shikijs/core@3.4.2':
5601 + '@shikijs/core@3.6.0':
5602 dependencies:
5766 - '@shikijs/types': 3.4.2
5603 + '@shikijs/types': 3.6.0
5604 '@shikijs/vscode-textmate': 10.0.2
5605 '@types/hast': 3.0.4
5606 hast-util-to-html: 9.0.5
5607
5771 - '@shikijs/engine-javascript@3.4.2':
5608 + '@shikijs/engine-javascript@3.6.0':
5609 dependencies:
5773 - '@shikijs/types': 3.4.2
5610 + '@shikijs/types': 3.6.0
5611 '@shikijs/vscode-textmate': 10.0.2
5612 oniguruma-to-es: 4.3.3
5613
5777 - '@shikijs/engine-oniguruma@3.4.2':
5614 + '@shikijs/engine-oniguruma@3.6.0':
5615 dependencies:
5779 - '@shikijs/types': 3.4.2
5616 + '@shikijs/types': 3.6.0
5617 '@shikijs/vscode-textmate': 10.0.2
5618
5782 - '@shikijs/langs@3.4.2':
5619 + '@shikijs/langs@3.6.0':
5620 dependencies:
5784 - '@shikijs/types': 3.4.2
5621 + '@shikijs/types': 3.6.0
5622
5786 - '@shikijs/markdown-it@3.4.2':
5623 + '@shikijs/markdown-it@3.6.0':
5624 dependencies:
5625 markdown-it: 14.1.0
5789 - shiki: 3.4.2
5626 + shiki: 3.6.0
5627
5791 - '@shikijs/themes@3.4.2':
5628 + '@shikijs/themes@3.6.0':
5629 dependencies:
5793 - '@shikijs/types': 3.4.2
5630 + '@shikijs/types': 3.6.0
5631
5795 - '@shikijs/types@3.4.2':
5632 + '@shikijs/types@3.6.0':
5633 dependencies:
5634 '@shikijs/vscode-textmate': 10.0.2
5635 '@types/hast': 3.0.4
@@ -5809,9 +5646,9 @@ snapshots:
5646
5647 '@sindresorhus/merge-streams@4.0.0': {}
5648
5812 - '@stylistic/eslint-plugin@4.4.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5649 + '@stylistic/eslint-plugin@5.0.0-beta.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5650 dependencies:
5814 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5651 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5652 eslint: 9.28.0(jiti@2.4.2)
5653 eslint-visitor-keys: 4.2.0
5654 espree: 10.3.0
@@ -5904,22 +5741,17 @@ snapshots:
5741 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.8
5742 '@tailwindcss/oxide-win32-x64-msvc': 4.1.8
5743
5907 - '@tailwindcss/vite@4.1.8(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5744 + '@tailwindcss/vite@4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5745 dependencies:
5746 '@tailwindcss/node': 4.1.8
5747 '@tailwindcss/oxide': 4.1.8
5748 tailwindcss: 4.1.8
5912 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5749 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5750
5751 '@trysound/sax@0.2.0': {}
5752
5753 '@tsconfig/node20@20.1.5': {}
5754
5918 - '@tybys/wasm-util@0.9.0':
5919 - dependencies:
5920 - tslib: 2.8.1
5921 - optional: true
5922 -
5755 '@types/bytes@3.1.5': {}
5756
5757 '@types/chai@5.2.2':
@@ -5939,7 +5771,7 @@ snapshots:
5771 '@types/fs-extra@11.0.4':
5772 dependencies:
5773 '@types/jsonfile': 6.1.4
5942 - '@types/node': 22.15.29
5774 + '@types/node': 22.15.30
5775
5776 '@types/hast@3.0.4':
5777 dependencies:
@@ -5947,7 +5779,7 @@ snapshots:
5779
5780 '@types/jsdom@21.1.7':
5781 dependencies:
5950 - '@types/node': 22.15.29
5782 + '@types/node': 22.15.30
5783 '@types/tough-cookie': 4.0.5
5784 parse5: 7.3.0
5785
@@ -5955,7 +5787,7 @@ snapshots:
5787
5788 '@types/jsonfile@6.1.4':
5789 dependencies:
5958 - '@types/node': 22.15.29
5790 + '@types/node': 22.15.30
5791
5792 '@types/katex@0.16.7': {}
5793
@@ -5982,7 +5814,7 @@ snapshots:
5814
5815 '@types/ms@2.1.0': {}
5816
5985 - '@types/node@22.15.29':
5817 + '@types/node@22.15.30':
5818 dependencies:
5819 undici-types: 6.21.0
5820
@@ -6002,17 +5834,17 @@ snapshots:
5834
5835 '@types/yauzl@2.10.3':
5836 dependencies:
6005 - '@types/node': 22.15.29
5837 + '@types/node': 22.15.30
5838 optional: true
5839
6008 - '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5840 + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5841 dependencies:
5842 '@eslint-community/regexpp': 4.12.1
6011 - '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6012 - '@typescript-eslint/scope-manager': 8.33.0
6013 - '@typescript-eslint/type-utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6014 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6015 - '@typescript-eslint/visitor-keys': 8.33.0
5843 + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5844 + '@typescript-eslint/scope-manager': 8.33.1
5845 + '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5846 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5847 + '@typescript-eslint/visitor-keys': 8.33.1
5848 eslint: 9.28.0(jiti@2.4.2)
5849 graphemer: 1.4.0
5850 ignore: 7.0.4
@@ -6022,40 +5854,40 @@ snapshots:
5854 transitivePeerDependencies:
5855 - supports-color
5856
6025 - '@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5857 + '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5858 dependencies:
6027 - '@typescript-eslint/scope-manager': 8.33.0
6028 - '@typescript-eslint/types': 8.33.0
6029 - '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3)
6030 - '@typescript-eslint/visitor-keys': 8.33.0
5859 + '@typescript-eslint/scope-manager': 8.33.1
5860 + '@typescript-eslint/types': 8.33.1
5861 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
5862 + '@typescript-eslint/visitor-keys': 8.33.1
5863 debug: 4.4.1(supports-color@8.1.1)
5864 eslint: 9.28.0(jiti@2.4.2)
5865 typescript: 5.8.3
5866 transitivePeerDependencies:
5867 - supports-color
5868
6037 - '@typescript-eslint/project-service@8.33.0(typescript@5.8.3)':
5869 + '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)':
5870 dependencies:
6039 - '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3)
6040 - '@typescript-eslint/types': 8.33.0
5871 + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3)
5872 + '@typescript-eslint/types': 8.33.1
5873 debug: 4.4.1(supports-color@8.1.1)
5874 + typescript: 5.8.3
5875 transitivePeerDependencies:
5876 - supports-color
6044 - - typescript
5877
6046 - '@typescript-eslint/scope-manager@8.33.0':
5878 + '@typescript-eslint/scope-manager@8.33.1':
5879 dependencies:
6048 - '@typescript-eslint/types': 8.33.0
6049 - '@typescript-eslint/visitor-keys': 8.33.0
5880 + '@typescript-eslint/types': 8.33.1
5881 + '@typescript-eslint/visitor-keys': 8.33.1
5882
6051 - '@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.8.3)':
5883 + '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)':
5884 dependencies:
5885 typescript: 5.8.3
5886
6055 - '@typescript-eslint/type-utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5887 + '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5888 dependencies:
6057 - '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3)
6058 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5889 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
5890 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5891 debug: 4.4.1(supports-color@8.1.1)
5892 eslint: 9.28.0(jiti@2.4.2)
5893 ts-api-utils: 2.1.0(typescript@5.8.3)
@@ -6063,14 +5895,14 @@ snapshots:
5895 transitivePeerDependencies:
5896 - supports-color
5897
6066 - '@typescript-eslint/types@8.33.0': {}
5898 + '@typescript-eslint/types@8.33.1': {}
5899
6068 - '@typescript-eslint/typescript-estree@8.33.0(typescript@5.8.3)':
5900 + '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)':
5901 dependencies:
6070 - '@typescript-eslint/project-service': 8.33.0(typescript@5.8.3)
6071 - '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3)
6072 - '@typescript-eslint/types': 8.33.0
6073 - '@typescript-eslint/visitor-keys': 8.33.0
5902 + '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3)
5903 + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3)
5904 + '@typescript-eslint/types': 8.33.1
5905 + '@typescript-eslint/visitor-keys': 8.33.1
5906 debug: 4.4.1(supports-color@8.1.1)
5907 fast-glob: 3.3.3
5908 is-glob: 4.0.3
@@ -6081,141 +5913,88 @@ snapshots:
5913 transitivePeerDependencies:
5914 - supports-color
5915
6084 - '@typescript-eslint/utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5916 + '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)':
5917 dependencies:
5918 '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
6087 - '@typescript-eslint/scope-manager': 8.33.0
6088 - '@typescript-eslint/types': 8.33.0
6089 - '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3)
5919 + '@typescript-eslint/scope-manager': 8.33.1
5920 + '@typescript-eslint/types': 8.33.1
5921 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3)
5922 eslint: 9.28.0(jiti@2.4.2)
5923 typescript: 5.8.3
5924 transitivePeerDependencies:
5925 - supports-color
5926
6095 - '@typescript-eslint/visitor-keys@8.33.0':
5927 + '@typescript-eslint/visitor-keys@8.33.1':
5928 dependencies:
6097 - '@typescript-eslint/types': 8.33.0
5929 + '@typescript-eslint/types': 8.33.1
5930 eslint-visitor-keys: 4.2.0
5931
5932 '@ungap/structured-clone@1.3.0': {}
5933
6102 - '@unrs/resolver-binding-darwin-arm64@1.7.5':
6103 - optional: true
6104 -
6105 - '@unrs/resolver-binding-darwin-x64@1.7.5':
6106 - optional: true
6107 -
6108 - '@unrs/resolver-binding-freebsd-x64@1.7.5':
6109 - optional: true
6110 -
6111 - '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.5':
6112 - optional: true
6113 -
6114 - '@unrs/resolver-binding-linux-arm-musleabihf@1.7.5':
6115 - optional: true
6116 -
6117 - '@unrs/resolver-binding-linux-arm64-gnu@1.7.5':
6118 - optional: true
6119 -
6120 - '@unrs/resolver-binding-linux-arm64-musl@1.7.5':
6121 - optional: true
6122 -
6123 - '@unrs/resolver-binding-linux-ppc64-gnu@1.7.5':
6124 - optional: true
6125 -
6126 - '@unrs/resolver-binding-linux-riscv64-gnu@1.7.5':
6127 - optional: true
6128 -
6129 - '@unrs/resolver-binding-linux-riscv64-musl@1.7.5':
6130 - optional: true
6131 -
6132 - '@unrs/resolver-binding-linux-s390x-gnu@1.7.5':
6133 - optional: true
6134 -
6135 - '@unrs/resolver-binding-linux-x64-gnu@1.7.5':
6136 - optional: true
6137 -
6138 - '@unrs/resolver-binding-linux-x64-musl@1.7.5':
6139 - optional: true
6140 -
6141 - '@unrs/resolver-binding-wasm32-wasi@1.7.5':
6142 - dependencies:
6143 - '@napi-rs/wasm-runtime': 0.2.10
6144 - optional: true
6145 -
6146 - '@unrs/resolver-binding-win32-arm64-msvc@1.7.5':
6147 - optional: true
6148 -
6149 - '@unrs/resolver-binding-win32-ia32-msvc@1.7.5':
6150 - optional: true
6151 -
6152 - '@unrs/resolver-binding-win32-x64-msvc@1.7.5':
6153 - optional: true
6154 -
6155 - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
5934 + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
5935 dependencies:
5936 '@babel/core': 7.27.3
5937 '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.3)
5938 '@rolldown/pluginutils': 1.0.0-beta.10
5939 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.27.3)
6161 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5940 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5941 vue: 3.5.16(typescript@5.8.3)
5942 transitivePeerDependencies:
5943 - supports-color
5944
6166 - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
5945 + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
5946 dependencies:
6168 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5947 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5948 vue: 3.5.16(typescript@5.8.3)
5949
6171 - '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5950 + '@vitest/eslint-plugin@1.2.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5951 dependencies:
6173 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5952 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
5953 eslint: 9.28.0(jiti@2.4.2)
5954 optionalDependencies:
5955 typescript: 5.8.3
6177 - vitest: 3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5956 + vitest: 3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5957 transitivePeerDependencies:
5958 - supports-color
5959
6181 - '@vitest/expect@3.2.0':
5960 + '@vitest/expect@3.2.2':
5961 dependencies:
5962 '@types/chai': 5.2.2
6184 - '@vitest/spy': 3.2.0
6185 - '@vitest/utils': 3.2.0
5963 + '@vitest/spy': 3.2.2
5964 + '@vitest/utils': 3.2.2
5965 chai: 5.2.0
5966 tinyrainbow: 2.0.0
5967
6189 - '@vitest/mocker@3.2.0(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5968 + '@vitest/mocker@3.2.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))':
5969 dependencies:
6191 - '@vitest/spy': 3.2.0
5970 + '@vitest/spy': 3.2.2
5971 estree-walker: 3.0.3
5972 magic-string: 0.30.17
5973 optionalDependencies:
6195 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5974 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
5975
6197 - '@vitest/pretty-format@3.2.0':
5976 + '@vitest/pretty-format@3.2.2':
5977 dependencies:
5978 tinyrainbow: 2.0.0
5979
6201 - '@vitest/runner@3.2.0':
5980 + '@vitest/runner@3.2.2':
5981 dependencies:
6203 - '@vitest/utils': 3.2.0
5982 + '@vitest/utils': 3.2.2
5983 pathe: 2.0.3
5984
6206 - '@vitest/snapshot@3.2.0':
5985 + '@vitest/snapshot@3.2.2':
5986 dependencies:
6208 - '@vitest/pretty-format': 3.2.0
5987 + '@vitest/pretty-format': 3.2.2
5988 magic-string: 0.30.17
5989 pathe: 2.0.3
5990
6212 - '@vitest/spy@3.2.0':
5991 + '@vitest/spy@3.2.2':
5992 dependencies:
5993 tinyspy: 4.0.3
5994
6216 - '@vitest/utils@3.2.0':
5995 + '@vitest/utils@3.2.2':
5996 dependencies:
6218 - '@vitest/pretty-format': 3.2.0
5997 + '@vitest/pretty-format': 3.2.2
5998 loupe: 3.1.3
5999 tinyrainbow: 2.0.0
6000
@@ -6331,14 +6110,14 @@ snapshots:
6110 dependencies:
6111 '@vue/devtools-kit': 7.7.6
6112
6334 - '@vue/devtools-core@7.7.6(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
6113 + '@vue/devtools-core@7.7.6(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))':
6114 dependencies:
6115 '@vue/devtools-kit': 7.7.6
6116 '@vue/devtools-shared': 7.7.6
6117 mitt: 3.0.1
6118 nanoid: 5.1.5
6119 pathe: 2.0.3
6341 - vite-hot-client: 2.0.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
6120 + vite-hot-client: 2.0.4(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
6121 vue: 3.5.16(typescript@5.8.3)
6122 transitivePeerDependencies:
6123 - vite
@@ -6477,6 +6256,8 @@ snapshots:
6256
6257 ansis@4.0.0: {}
6258
6259 + ansis@4.1.0: {}
6260 +
6261 apexcharts@4.7.0:
6262 dependencies:
6263 '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.4)
@@ -6818,7 +6599,7 @@ snapshots:
6599
6600 csstype@3.1.3: {}
6601
6821 - cypress@14.4.0:
6602 + cypress@14.4.1:
6603 dependencies:
6604 '@cypress/request': 3.0.8
6605 '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
@@ -7124,21 +6905,6 @@ snapshots:
6905 dependencies:
6906 pathe: 2.0.3
6907
7127 - eslint-import-context@0.1.6(unrs-resolver@1.7.5):
7128 - dependencies:
7129 - get-tsconfig: 4.10.1
7130 - stable-hash: 0.0.5
7131 - optionalDependencies:
7132 - unrs-resolver: 1.7.5
7133 -
7134 - eslint-import-resolver-node@0.3.9:
7135 - dependencies:
7136 - debug: 3.2.7(supports-color@8.1.1)
7137 - is-core-module: 2.16.1
7138 - resolve: 1.22.10
7139 - transitivePeerDependencies:
7140 - - supports-color
7141 -
6908 eslint-json-compat-utils@0.2.1(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
6909 dependencies:
6910 eslint: 9.28.0(jiti@2.4.2)
@@ -7165,25 +6931,7 @@ snapshots:
6931 eslint: 9.28.0(jiti@2.4.2)
6932 eslint-compat-utils: 0.5.1(eslint@9.28.0(jiti@2.4.2))
6933
7168 - eslint-plugin-import-x@4.13.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
7169 - dependencies:
7170 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
7171 - comment-parser: 1.4.1
7172 - debug: 4.4.1(supports-color@8.1.1)
7173 - eslint: 9.28.0(jiti@2.4.2)
7174 - eslint-import-context: 0.1.6(unrs-resolver@1.7.5)
7175 - eslint-import-resolver-node: 0.3.9
7176 - is-glob: 4.0.3
7177 - minimatch: 10.0.1
7178 - semver: 7.7.2
7179 - stable-hash: 0.0.5
7180 - tslib: 2.8.1
7181 - unrs-resolver: 1.7.5
7182 - transitivePeerDependencies:
7183 - - supports-color
7184 - - typescript
7185 -
7186 - eslint-plugin-jsdoc@50.6.17(eslint@9.28.0(jiti@2.4.2)):
6934 + eslint-plugin-jsdoc@50.7.1(eslint@9.28.0(jiti@2.4.2)):
6935 dependencies:
6936 '@es-joy/jsdoccomment': 0.50.2
6937 are-docs-informative: 0.0.2
@@ -7213,9 +6961,10 @@ snapshots:
6961 transitivePeerDependencies:
6962 - '@eslint/json'
6963
7216 - eslint-plugin-n@17.18.0(eslint@9.28.0(jiti@2.4.2)):
6964 + eslint-plugin-n@17.19.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
6965 dependencies:
6966 '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
6967 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6968 enhanced-resolve: 5.18.1
6969 eslint: 9.28.0(jiti@2.4.2)
6970 eslint-plugin-es-x: 7.8.0(eslint@9.28.0(jiti@2.4.2))
@@ -7224,13 +6973,17 @@ snapshots:
6973 ignore: 5.3.2
6974 minimatch: 9.0.5
6975 semver: 7.7.2
6976 + ts-declaration-location: 1.0.7(typescript@5.8.3)
6977 + transitivePeerDependencies:
6978 + - supports-color
6979 + - typescript
6980
6981 eslint-plugin-no-only-tests@3.3.0: {}
6982
7230 - eslint-plugin-perfectionist@4.13.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
6983 + eslint-plugin-perfectionist@4.14.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3):
6984 dependencies:
7232 - '@typescript-eslint/types': 8.33.0
7233 - '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6985 + '@typescript-eslint/types': 8.33.1
6986 + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
6987 eslint: 9.28.0(jiti@2.4.2)
6988 natural-orderby: 5.0.0
6989 transitivePeerDependencies:
@@ -7247,7 +7000,7 @@ snapshots:
7000 tinyglobby: 0.2.14
7001 yaml-eslint-parser: 1.3.0
7002
7250 - eslint-plugin-regexp@2.7.0(eslint@9.28.0(jiti@2.4.2)):
7003 + eslint-plugin-regexp@2.8.0(eslint@9.28.0(jiti@2.4.2)):
7004 dependencies:
7005 '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
7006 '@eslint-community/regexpp': 4.12.1
@@ -7289,13 +7042,13 @@ snapshots:
7042 semver: 7.7.2
7043 strip-indent: 4.0.0
7044
7292 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)):
7045 + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)):
7046 dependencies:
7047 eslint: 9.28.0(jiti@2.4.2)
7048 optionalDependencies:
7296 - '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
7049 + '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)
7050
7298 - eslint-plugin-vue@10.1.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2))):
7051 + eslint-plugin-vue@10.2.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2))):
7052 dependencies:
7053 '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2))
7054 eslint: 9.28.0(jiti@2.4.2)
@@ -8493,10 +8246,6 @@ snapshots:
8246
8247 min-indent@1.0.1: {}
8248
8496 - minimatch@10.0.1:
8497 - dependencies:
8498 - brace-expansion: 2.0.1
8499 -
8249 minimatch@3.1.2:
8250 dependencies:
8251 brace-expansion: 1.1.11
@@ -8573,8 +8322,6 @@ snapshots:
8322
8323 nanoid@5.1.5: {}
8324
8576 - napi-postinstall@0.2.4: {}
8577 -
8325 natural-compare@1.4.0: {}
8326
8327 natural-orderby@5.0.0: {}
@@ -8766,18 +8513,18 @@ snapshots:
8513
8514 pify@2.3.0: {}
8515
8769 - pinia-plugin-persistedstate@4.3.0(pinia@3.0.2(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))):
8516 + pinia-plugin-persistedstate@4.3.0(pinia@3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))):
8517 dependencies:
8518 '@nuxt/kit': 3.17.4
8519 deep-pick-omit: 1.2.1
8520 defu: 6.1.4
8521 destr: 2.0.5
8522 optionalDependencies:
8776 - pinia: 3.0.2(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))
8523 + pinia: 3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))
8524 transitivePeerDependencies:
8525 - magicast
8526
8780 - pinia@3.0.2(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)):
8527 + pinia@3.0.3(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)):
8528 dependencies:
8529 '@vue/devtools-api': 7.7.6
8530 vue: 3.5.16(typescript@5.8.3)
@@ -9041,14 +8788,14 @@ snapshots:
8788
8789 shell-quote@1.8.2: {}
8790
9044 - shiki@3.4.2:
8791 + shiki@3.6.0:
8792 dependencies:
9046 - '@shikijs/core': 3.4.2
9047 - '@shikijs/engine-javascript': 3.4.2
9048 - '@shikijs/engine-oniguruma': 3.4.2
9049 - '@shikijs/langs': 3.4.2
9050 - '@shikijs/themes': 3.4.2
9051 - '@shikijs/types': 3.4.2
8793 + '@shikijs/core': 3.6.0
8794 + '@shikijs/engine-javascript': 3.6.0
8795 + '@shikijs/engine-oniguruma': 3.6.0
8796 + '@shikijs/langs': 3.6.0
8797 + '@shikijs/themes': 3.6.0
8798 + '@shikijs/types': 3.6.0
8799 '@shikijs/vscode-textmate': 10.0.2
8800 '@types/hast': 3.0.4
8801
@@ -9143,8 +8890,6 @@ snapshots:
8890 safer-buffer: 2.1.2
8891 tweetnacl: 0.14.5
8892
9146 - stable-hash@0.0.5: {}
9147 -
8893 stackback@0.0.2: {}
8894
8895 start-server-and-test@2.0.12:
@@ -9333,6 +9078,11 @@ snapshots:
9078 dependencies:
9079 typescript: 5.8.3
9080
9081 + ts-declaration-location@1.0.7(typescript@5.8.3):
9082 + dependencies:
9083 + picomatch: 4.0.2
9084 + typescript: 5.8.3
9085 +
9086 tslib@2.3.0: {}
9087
9088 tslib@2.4.0: {}
@@ -9430,28 +9180,6 @@ snapshots:
9180 picomatch: 4.0.2
9181 webpack-virtual-modules: 0.6.2
9182
9433 - unrs-resolver@1.7.5:
9434 - dependencies:
9435 - napi-postinstall: 0.2.4
9436 - optionalDependencies:
9437 - '@unrs/resolver-binding-darwin-arm64': 1.7.5
9438 - '@unrs/resolver-binding-darwin-x64': 1.7.5
9439 - '@unrs/resolver-binding-freebsd-x64': 1.7.5
9440 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.5
9441 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.5
9442 - '@unrs/resolver-binding-linux-arm64-gnu': 1.7.5
9443 - '@unrs/resolver-binding-linux-arm64-musl': 1.7.5
9444 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.5
9445 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.5
9446 - '@unrs/resolver-binding-linux-riscv64-musl': 1.7.5
9447 - '@unrs/resolver-binding-linux-s390x-gnu': 1.7.5
9448 - '@unrs/resolver-binding-linux-x64-gnu': 1.7.5
9449 - '@unrs/resolver-binding-linux-x64-musl': 1.7.5
9450 - '@unrs/resolver-binding-wasm32-wasi': 1.7.5
9451 - '@unrs/resolver-binding-win32-arm64-msvc': 1.7.5
9452 - '@unrs/resolver-binding-win32-ia32-msvc': 1.7.5
9453 - '@unrs/resolver-binding-win32-x64-msvc': 1.7.5
9454 -
9183 untildify@4.0.0: {}
9184
9185 untyped@2.0.0:
@@ -9510,17 +9238,17 @@ snapshots:
9238 - rollup
9239 - supports-color
9240
9513 - vite-hot-client@2.0.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9241 + vite-hot-client@2.0.4(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9242 dependencies:
9515 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9243 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9244
9517 - vite-node@3.2.0(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9245 + vite-node@3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9246 dependencies:
9247 cac: 6.7.14
9248 debug: 4.4.1(supports-color@8.1.1)
9249 es-module-lexer: 1.7.0
9250 pathe: 2.0.3
9523 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9251 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9252 transitivePeerDependencies:
9253 - '@types/node'
9254 - jiti
@@ -9535,7 +9263,7 @@ snapshots:
9263 - tsx
9264 - yaml
9265
9538 - vite-plugin-inspect@0.8.9(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9266 + vite-plugin-inspect@0.8.9(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9267 dependencies:
9268 '@antfu/utils': 0.7.10
9269 '@rollup/pluginutils': 5.1.4(rollup@4.41.1)
@@ -9546,28 +9274,28 @@ snapshots:
9274 perfect-debounce: 1.0.0
9275 picocolors: 1.1.1
9276 sirv: 3.0.1
9549 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9277 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9278 transitivePeerDependencies:
9279 - rollup
9280 - supports-color
9281
9554 - vite-plugin-vue-devtools@7.7.6(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)):
9282 + vite-plugin-vue-devtools@7.7.6(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)):
9283 dependencies:
9556 - '@vue/devtools-core': 7.7.6(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
9284 + '@vue/devtools-core': 7.7.6(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))
9285 '@vue/devtools-kit': 7.7.6
9286 '@vue/devtools-shared': 7.7.6
9287 execa: 9.6.0
9288 sirv: 3.0.1
9561 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9562 - vite-plugin-inspect: 0.8.9(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9563 - vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9289 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9290 + vite-plugin-inspect: 0.8.9(rollup@4.41.1)(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9291 + vite-plugin-vue-inspector: 5.3.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9292 transitivePeerDependencies:
9293 - '@nuxt/kit'
9294 - rollup
9295 - supports-color
9296 - vue
9297
9570 - vite-plugin-vue-inspector@5.3.1(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9298 + vite-plugin-vue-inspector@5.3.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)):
9299 dependencies:
9300 '@babel/core': 7.27.3
9301 '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.3)
@@ -9578,7 +9306,7 @@ snapshots:
9306 '@vue/compiler-dom': 3.5.15
9307 kolorist: 1.8.0
9308 magic-string: 0.30.17
9581 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9309 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9310 transitivePeerDependencies:
9311 - supports-color
9312
@@ -9587,7 +9315,7 @@ snapshots:
9315 svgo: 3.3.2
9316 vue: 3.5.16(typescript@5.8.3)
9317
9590 - vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9318 + vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9319 dependencies:
9320 esbuild: 0.25.5
9321 fdir: 6.4.5(picomatch@4.0.2)
@@ -9596,23 +9324,23 @@ snapshots:
9324 rollup: 4.41.1
9325 tinyglobby: 0.2.14
9326 optionalDependencies:
9599 - '@types/node': 22.15.29
9327 + '@types/node': 22.15.30
9328 fsevents: 2.3.3
9329 jiti: 2.4.2
9330 lightningcss: 1.30.1
9331 sass: 1.89.1
9332 yaml: 2.8.0
9333
9606 - vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.29)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9334 + vitest@3.2.2(@types/debug@4.1.12)(@types/node@22.15.30)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0):
9335 dependencies:
9336 '@types/chai': 5.2.2
9609 - '@vitest/expect': 3.2.0
9610 - '@vitest/mocker': 3.2.0(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9611 - '@vitest/pretty-format': 3.2.0
9612 - '@vitest/runner': 3.2.0
9613 - '@vitest/snapshot': 3.2.0
9614 - '@vitest/spy': 3.2.0
9615 - '@vitest/utils': 3.2.0
9337 + '@vitest/expect': 3.2.2
9338 + '@vitest/mocker': 3.2.2(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0))
9339 + '@vitest/pretty-format': 3.2.2
9340 + '@vitest/runner': 3.2.2
9341 + '@vitest/snapshot': 3.2.2
9342 + '@vitest/spy': 3.2.2
9343 + '@vitest/utils': 3.2.2
9344 chai: 5.2.0
9345 debug: 4.4.1(supports-color@8.1.1)
9346 expect-type: 1.2.1
@@ -9625,12 +9353,12 @@ snapshots:
9353 tinyglobby: 0.2.14
9354 tinypool: 1.1.0
9355 tinyrainbow: 2.0.0
9628 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9629 - vite-node: 3.2.0(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9356 + vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9357 + vite-node: 3.2.2(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.1)(yaml@2.8.0)
9358 why-is-node-running: 2.3.0
9359 optionalDependencies:
9360 '@types/debug': 4.1.12
9633 - '@types/node': 22.15.29
9361 + '@types/node': 22.15.30
9362 jsdom: 26.1.0
9363 transitivePeerDependencies:
9364 - jiti
frontend/src/api/endpoints/mitre.ts
+5 -1
@@ -71,11 +71,14 @@ export interface MitreEventsQuery {
71 index_pattern?: string
72 }
73
74 +export type MitreAtomicOsCategory = "windows" | "linux" | "macos"
75 +
76 export interface MitreAtomicTestsQuery {
77 /** Maximum number of techniques to return per page */
78 size?: number
79 /** Page number for pagination */
80 page?: number
81 + os_category?: MitreAtomicOsCategory
82 }
83
84 export default {
@@ -225,7 +228,8 @@ export default {
228 >(`/wazuh_manager/mitre/atomic-tests`, {
229 params: {
230 size: query?.size || 25,
228 - page: query?.page || 1
231 + page: query?.page || 1,
232 + os_category: query?.os_category || undefined
233 },
234 signal
235 })
frontend/src/app-layouts/common/Toolbar/Search.vue
+2 -2
@@ -14,7 +14,7 @@ import { NText } from "naive-ui"
14 import { onMounted, ref } from "vue"
15 import Icon from "@/components/common/Icon.vue"
16 import { useSearchDialog } from "@/composables/useSearchDialog"
17 -import { getOS } from "@/utils"
17 +import { getNavigatorOS } from "@/utils"
18
19 const SearchIcon = "ion:search-outline"
20 const commandIcon = ref("⌘")
@@ -24,7 +24,7 @@ function openBox() {
24 }
25
26 onMounted(() => {
27 - const isWindows = getOS() === "Windows"
27 + const isWindows = getNavigatorOS() === "Windows"
28 commandIcon.value = isWindows ? "CTRL" : "⌘"
29 })
30 </script>
frontend/src/components/common/SearchDialog.vue
+2 -2
@@ -81,7 +81,7 @@ import { useGoto } from "@/composables/useGoto"
81 import { useSearchDialog } from "@/composables/useSearchDialog"
82 import { useThemeSwitch } from "@/composables/useThemeSwitch"
83 import { emitter } from "@/emitter"
84 -import { getOS } from "@/utils"
84 +import { getNavigatorOS } from "@/utils"
85
86 interface GroupItem {
87 iconName: string | null
@@ -274,7 +274,7 @@ function centerItem() {
274 }
275
276 onMounted(() => {
277 - const isWindows = getOS() === "Windows"
277 + const isWindows = getNavigatorOS() === "Windows"
278 commandIcon.value = isWindows ? "CTRL" : "⌘"
279
280 const keys = useMagicKeys()
frontend/src/components/mitre/AtomicTests/List.vue
+21 -5
@@ -2,7 +2,7 @@
2 <div class="flex flex-col gap-4">
3 <div class="flex flex-col">
4 <div ref="header" class="header flex items-center justify-end gap-2">
5 - <div class="info flex grow gap-5">
5 + <div class="info flex grow gap-2">
6 <n-popover overlap placement="bottom-start">
7 <template #trigger>
8 <div class="bg-default rounded-lg">
@@ -20,6 +20,15 @@
20 </div>
21 </div>
22 </n-popover>
23 +
24 + <n-select
25 + v-model:value="osCategory"
26 + :options="osCategoryOptions"
27 + clearable
28 + size="small"
29 + placeholder="OS Category"
30 + class="max-w-32"
31 + />
32 </div>
33 <n-pagination
34 v-model:page="currentPage"
@@ -56,11 +65,11 @@
65 </template>
66
67 <script setup lang="ts">
59 -import type { MitreAtomicTestsQuery } from "@/api/endpoints/mitre"
68 +import type { MitreAtomicOsCategory, MitreAtomicTestsQuery } from "@/api/endpoints/mitre"
69 import type { MitreAtomicTest } from "@/types/mitre.d"
70 import { useResizeObserver, watchDebounced } from "@vueuse/core"
71 import axios from "axios"
63 -import { NButton, NEmpty, NPagination, NPopover, NSpin, useMessage } from "naive-ui"
72 +import { NButton, NEmpty, NPagination, NPopover, NSelect, NSpin, useMessage } from "naive-ui"
73 import { computed, ref } from "vue"
74 import Api from "@/api"
75 import Icon from "@/components/common/Icon.vue"
@@ -78,8 +87,14 @@ const showSizePicker = computed(() => !compactMode.value)
87 const pageSizes = [25, 50, 100, 150, 200]
88 const pageSize = ref(pageSizes[0])
89 const pageSlot = ref(8)
90 +const osCategory = ref<MitreAtomicOsCategory | null>(null)
91 const InfoIcon = "carbon:information"
92
93 +const osCategoryOptions: { label: string; value: MitreAtomicOsCategory }[] = ["windows", "linux", "macos"].map(o => ({
94 + label: o,
95 + value: o as MitreAtomicOsCategory
96 +}))
97 +
98 let abortController: AbortController | null = null
99
100 function getList() {
@@ -90,7 +105,8 @@ function getList() {
105
106 const query: MitreAtomicTestsQuery = {
107 size: pageSize.value,
93 - page: currentPage.value
108 + page: currentPage.value,
109 + os_category: osCategory.value || undefined
110 }
111
112 Api.mitre
@@ -128,7 +144,7 @@ useResizeObserver(header, entries => {
144 simpleMode.value = width < 450
145 })
146
131 -watchDebounced([currentPage, pageSize], getList, {
147 +watchDebounced([currentPage, pageSize, osCategory], getList, {
148 deep: true,
149 debounce: 300,
150 immediate: true
frontend/src/components/mitre/AtomicTests/TechniqueCard.vue
+2 -2
@@ -20,7 +20,7 @@
20 </div>
21 </template>
22 <template #footerExtra>
23 - <SimulatorButton :technique-id="entity.technique_id" size="small" />
23 + <SimulatorButton :technique-id="entity.technique_id" size="small" :os-list="entity.categories" />
24 </template>
25 </CardEntity>
26
@@ -45,7 +45,7 @@ import Badge from "@/components/common/Badge.vue"
45 import CardEntity from "@/components/common/cards/CardEntity.vue"
46 import Icon from "@/components/common/Icon.vue"
47 import { iconFromOs } from "@/utils"
48 -import SimulatorButton from "../WindowsAttackSimulator/SimulatorButton.vue"
48 +import SimulatorButton from "../AttackSimulator/SimulatorButton.vue"
49 import TechniqueCardContent from "./TechniqueCardContent.vue"
50
51 const { entity } = defineProps<{ entity: MitreAtomicTest; embedded?: boolean }>()
frontend/src/components/mitre/AttackSimulator/AgentsList.vue renamed
+7 -1
@@ -26,7 +26,12 @@
26 <code>{{ item.label }}</code>
27 </template>
28 <template #footer>
29 - {{ item.os }}
29 + <div class="flex flex-wrap items-center gap-2">
30 + <Icon :name="iconFromOs(item.os)" :size="14" />
31 + <span>
32 + {{ item.os }}
33 + </span>
34 + </div>
35 </template>
36 </CardEntity>
37 </template>
@@ -45,6 +50,7 @@ import Api from "@/api"
50 import CardEntity from "@/components/common/cards/CardEntity.vue"
51 import Icon from "@/components/common/Icon.vue"
52 import { useGoto } from "@/composables/useGoto"
53 +import { iconFromOs } from "@/utils"
54
55 const { agentsList, filter } = defineProps<{
56 agentsList?: Agent[] | null
frontend/src/components/mitre/AttackSimulator/ParametersList.vue renamed
+29 -17
@@ -29,14 +29,17 @@
29
30 <script setup lang="ts">
31 import type { MatchingParameter } from "@/types/artifacts"
32 +import _uniq from "lodash/uniqBy"
33 import { NEmpty, NSpin, useMessage } from "naive-ui"
34 import { onBeforeMount, ref } from "vue"
35 import Api from "@/api"
36 import CardEntity from "@/components/common/cards/CardEntity.vue"
37 +import { getOS } from "@/utils"
38
37 -const { techniqueId, parametersList } = defineProps<{
39 +const { techniqueId, parametersList, osList } = defineProps<{
40 techniqueId: string
41 parametersList?: MatchingParameter[] | null
42 + osList: string[]
43 }>()
44
45 const emit = defineEmits<{
@@ -49,25 +52,34 @@ const message = useMessage()
52 const loading = ref(false)
53 const list = ref<MatchingParameter[]>([])
54
52 -function getList() {
55 +async function getList() {
56 loading.value = true
57
55 - Api.artifacts
56 - .getParameters("Windows.AttackSimulation.AtomicRedTeam", techniqueId)
57 - .then(res => {
58 - if (res.data.success) {
59 - list.value = res.data?.matching_parameters || []
60 - emit("loaded", list.value)
61 - } else {
62 - message.warning(res.data?.message || "An error occurred. Please try again later.")
58 + try {
59 + const proms = []
60 + for (const os of osList) {
61 + if (getOS(os) === "Linux") {
62 + proms.push(Api.artifacts.getParameters("Linux.AttackSimulation.AtomicRedTeam", techniqueId))
63 + } else if (getOS(os) === "Windows") {
64 + proms.push(Api.artifacts.getParameters("Windows.AttackSimulation.AtomicRedTeam", techniqueId))
65 }
64 - })
65 - .catch(err => {
66 - message.error(err.response?.data?.message || "An error occurred. Please try again later.")
67 - })
68 - .finally(() => {
69 - loading.value = false
70 - })
66 + }
67 +
68 + const parametersListResponse = await Promise.all(proms)
69 +
70 + let fullList: MatchingParameter[] = []
71 +
72 + for (const res of parametersListResponse) {
73 + fullList = [...fullList, ...res.data.matching_parameters]
74 + }
75 +
76 + list.value = _uniq(fullList, "name")
77 + emit("loaded", list.value)
78 + } catch (err: any) {
79 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
80 + } finally {
81 + loading.value = false
82 + }
83 }
84
85 function setItem(item: MatchingParameter) {
frontend/src/components/mitre/AttackSimulator/SimulatorButton.vue renamed
+7 -5
@@ -3,7 +3,7 @@
3 <template #icon>
4 <Icon :name="AttackIcon" />
5 </template>
6 - Simulate Windows Attack
6 + Simulate Attack
7 </n-button>
8
9 <n-modal
@@ -11,24 +11,26 @@
11 display-directive="show"
12 preset="card"
13 :style="{ maxWidth: 'min(600px, 90vw)', minHeight: 'min(250px, 90vh)', overflow: 'hidden' }"
14 - :title="`${techniqueId}: Simulate Windows Attack`"
14 + :title="`${techniqueId}: Simulate Attack`"
15 :bordered="false"
16 segmented
17 content-class="p-0!"
18 >
19 - <SimulatorWizard :technique-id />
19 + <SimulatorWizard :technique-id :os-list="checkedOsList" />
20 </n-modal>
21 </template>
22
23 <script setup lang="ts">
24 import type { Size } from "naive-ui/es/button/src/interface"
25 import { NButton, NModal } from "naive-ui"
26 -import { ref } from "vue"
26 +import { computed, ref } from "vue"
27 import Icon from "@/components/common/Icon.vue"
28 import SimulatorWizard from "./SimulatorWizard.vue"
29
30 -const { size, techniqueId } = defineProps<{ size?: Size; techniqueId: string }>()
30 +const { size, techniqueId, osList } = defineProps<{ size?: Size; techniqueId: string; osList: string[] }>()
31
32 const AttackIcon = "mdi:target"
33 const showForm = ref(false)
34 +
35 +const checkedOsList = computed(() => (osList?.length ? osList.filter(o => o.toLowerCase() !== "macos") : []))
36 </script>
frontend/src/components/mitre/AttackSimulator/SimulatorWizard.vue renamed
+40 -7
@@ -20,6 +20,7 @@
20 v-model:selected="selectedAttack"
21 :technique-id
22 class="px-7"
23 + :os-list
24 :parameters-list
25 @loaded="parametersList = $event"
26 />
@@ -67,7 +68,12 @@
68 <code>{{ selectedAgent.label }}</code>
69 </template>
70 <template #footer>
70 - {{ selectedAgent.os }}
71 + <div class="flex flex-wrap items-center gap-2">
72 + <Icon :name="iconFromOs(selectedAgent.os)" :size="14" />
73 + <span>
74 + {{ selectedAgent.os }}
75 + </span>
76 + </div>
77 </template>
78 </CardEntity>
79 </div>
@@ -138,13 +144,13 @@ import type { CollectRequest } from "@/api/endpoints/artifacts"
144 import type { Agent } from "@/types/agents.d"
145 import type { MatchingParameter } from "@/types/artifacts.d"
146 import { NButton, NScrollbar, NSkeleton, NStep, NSteps, useMessage } from "naive-ui"
141 -import { computed, ref, watch } from "vue"
147 +import { computed, onMounted, ref, watch } from "vue"
148 import Api from "@/api"
149 import CardEntity from "@/components/common/cards/CardEntity.vue"
150 import Icon from "@/components/common/Icon.vue"
151 import { useGoto } from "@/composables/useGoto"
152 import { useSettingsStore } from "@/stores/settings"
147 -import { formatDate } from "@/utils"
153 +import { formatDate, getOS, iconFromOs } from "@/utils"
154 import AgentsList from "./AgentsList.vue"
155 import ParametersList from "./ParametersList.vue"
156
@@ -159,14 +165,16 @@ export interface Report {
165 GUID: string
166 }
167
162 -const { techniqueId } = defineProps<{
168 +const { techniqueId, osList } = defineProps<{
169 techniqueId: string
170 + osList: string[]
171 }>()
172
173 const emit = defineEmits<{
174 (e: "update:loading", value: boolean): void
175 (e: "close"): void
176 (e: "submitted"): void
177 + (e: "mounted", value: { reset: () => void }): void
178 }>()
179
180 const ArrowRightIcon = "carbon:arrow-right"
@@ -210,12 +218,26 @@ const isSubmitValid = computed(() => {
218
219 function submit() {
220 if (selectedAttack.value && selectedAgent.value) {
221 + if (getOS(selectedAgent.value.os) === "MacOS") {
222 + return
223 + }
224 +
225 currentStatus.value = "finish"
226 loading.value = true
227
228 + let artifact_name = ""
229 +
230 + if (getOS(selectedAgent.value.os) === "Linux") {
231 + artifact_name = "Linux.AttackSimulation.AtomicRedTeam"
232 + }
233 +
234 + if (getOS(selectedAgent.value.os) === "Windows") {
235 + artifact_name = "Windows.AttackSimulation.AtomicRedTeam"
236 + }
237 +
238 const payload: CollectRequest = {
239 hostname: selectedAgent.value.hostname,
218 - artifact_name: "Windows.AttackSimulation.AtomicRedTeam",
240 + artifact_name,
241 parameters: {
242 env: [
243 {
@@ -278,7 +300,7 @@ function submit() {
300 }
301 }
302
281 -function _reset() {
303 +function reset() {
304 currentStatus.value = "process"
305 slideFormDirection.value = "right"
306 current.value = 1
@@ -302,7 +324,12 @@ function prev() {
324 }
325
326 function agentsListFilter(agent: Agent) {
305 - return agent.os.toLowerCase().includes("window")
327 + for (const os of osList) {
328 + if (agent.os.toLowerCase().includes(os.toLowerCase())) {
329 + return true
330 + }
331 + }
332 + return false
333 }
334
335 function scrollInView(scrollContainer: ScrollbarInst) {
@@ -346,6 +373,12 @@ watch([current, parametersList, agentsList], () => {
373 }, 200)
374 }
375 })
376 +
377 +onMounted(() => {
378 + emit("mounted", {
379 + reset
380 + })
381 +})
382 </script>
383
384 <style lang="scss" scoped>
frontend/src/utils/dayjs.ts
+1
@@ -10,6 +10,7 @@ import "dayjs/locale/de"
10 import "dayjs/locale/es"
11 import "dayjs/locale/fr"
12 import "dayjs/locale/ja"
13 +
14 /*
15 import isSameOrAfter from "dayjs/plugin/isSameOrAfter"
16 dayjs.extend(isSameOrAfter)
frontend/src/utils/index.ts
+19 -5
@@ -46,12 +46,26 @@ export function renderIcon(icon: Component | string) {
46 }
47
48 export function iconFromOs(os: string): string {
49 + switch (getOS(os)) {
50 + case "Windows":
51 + return "mdi:microsoft"
52 + case "MacOS":
53 + return "mdi:apple"
54 + case "Linux":
55 + case "UNIX":
56 + return "mdi:linux"
57 + default:
58 + return "mdi:help-box"
59 + }
60 +}
61 +
62 +export function getOS(os: string): OsTypesFull {
63 const test = os.toLowerCase()
64 if (test.includes("mac") || test.includes("darwin") || test.includes("apple")) {
51 - return "mdi:apple"
65 + return "MacOS"
66 }
67 if (test.includes("win") || test.includes("microsoft")) {
54 - return "mdi:microsoft"
68 + return "Windows"
69 }
70 if (
71 test.includes("linux") ||
@@ -60,13 +74,13 @@ export function iconFromOs(os: string): string {
74 test.includes("debian") ||
75 test.includes("centos")
76 ) {
63 - return "mdi:linux"
77 + return "Linux"
78 }
79
66 - return "mdi:help-box"
80 + return "Unknown"
81 }
82
69 -export function getOS(): OsTypesFull {
83 +export function getNavigatorOS(): OsTypesFull {
84 let os: OsTypesFull = "Unknown"
85 if (navigator.userAgent.includes("Win")) os = "Windows"
86 if (navigator.userAgent.includes("Mac")) os = "MacOS"