@cryptotaxi247 / CoPilot / commits / 8365c23c

Sysmon config reload (#419)

* feat: add sysmon config upload and management endpoints * feat: add endpoint to retrieve specific customer sysmon config content * feat: enhance sysmon config upload and retrieval endpoints with validation and response models * feat: add deployment endpoint for customer Sysmon config and update response models * feat: enhance sysmon config existence check and improve error handling * feat: add support for retrieving endpoint ID for 'primary' endpoint * feat: update Docker workflow to use 'sysmon-config-reload' branch and tags for testing * feat: update Docker workflow to use 'main' branch and latest tags for image builds * Update docker.yml for testing * feat: add Graylog integration for active response invocation and event notification schema * feat: enhance Graylog active response route with sysmon_config_reload command support * chore: update frontend dependencies * feat: add sysmon Config apis * feat: add Graylog integration for domain sinkhole active response and enhance logging * feat: add Graylog API header value configuration and update active response schema * docs: add important note regarding cluster manager requirements for active response * feat: xml editor * feat: sysmon config page * feat: update sysmon config page * chore: update frontend dependencies * feat: update xml editor * feat: update sysmon config page * fix: update active_response/invoke payload * feat: update sysmon config page * chore: update frontend dependencies * precommit fixes * feat: update sysmon config page * fix: codemirror version * Update docker.yml --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Mar 6, 2025 at 11:02 UTC 8365c23ca3cc6d6b46c16e9dbc7b8848a3f9458f
31 files changed +2362 -681
.env.example
+1
@@ -1,5 +1,6 @@
1 # Leave this as is if connecting from a remote machine
2 SERVER_IP=0.0.0.0
3 +GRAYLOG_API_HEADER_VALUE=ab73de7a-6f61-4dde-87cd-3af5175a7281
4
5 MYSQL_URL=copilot-mysql
6 # ! Avoid using special characters in the password ! #
.vscode/settings.json
+3 -1
@@ -60,6 +60,7 @@
60 "Sysmon",
61 "tabler",
62 "taze",
63 + "thememirror",
64 "timefield",
65 "timerange",
66 "timesec",
@@ -76,5 +77,6 @@
77 ],
78 "i18n-ally.localesPaths": [
79 "frontend/src/lang"
79 - ]
80 + ],
81 + "tailwindCSS.classAttributes": ["class", "className", "ngClass", "class:list", "content-class"]
82 }
backend/app/active_response/routes/active_response.py
+8 -1
@@ -157,10 +157,17 @@ async def invoke_active_response_route(
157 request.command = f"{request.command.value}0"
158 # Create a dictionary with the request data
159 data_dict = {"command": request.command, "arguments": request.arguments, "alert": request.alert}
160 - await send_put_request(
160 + response = await send_put_request(
161 endpoint=request.endpoint,
162 data=json.dumps(data_dict),
163 params=request.params,
164 + debug=True,
165 )
166 + if not response["success"]:
167 + logger.error(f"Request failed: {response.get('message')}")
168 + if "raw_response" in response:
169 + logger.error(f"Raw response: {response['raw_response']}")
170 + if "error_detail" in response:
171 + logger.error(f"Error details: {response['error_detail']}")
172
173 return InvokeActiveResponseResponse(success=True, message="Wazuh Active Response invoked successfully")
backend/app/active_response/routes/graylog.py new
+70
@@ -0,0 +1,70 @@
1 +import json
2 +import os
3 +
4 +from fastapi import APIRouter
5 +from fastapi import Depends
6 +from fastapi import Header
7 +from fastapi import HTTPException
8 +from loguru import logger
9 +
10 +from app.active_response.schema.active_response import InvokeActiveResponseResponse
11 +from app.active_response.schema.graylog import GraylogEventNotification
12 +from app.connectors.wazuh_manager.utils.universal import send_put_request
13 +
14 +active_response_graylog_router = APIRouter()
15 +
16 +
17 +# Function to validate the Graylog header
18 +async def verify_graylog_header(graylog: str = Header(None)):
19 + """Verify that the request has the correct Graylog header."""
20 + # Get the header value from environment variable or use "ab73de7a-6f61-4dde-87cd-3af5175a7281" as default
21 + expected_header = os.getenv("GRAYLOG_API_HEADER_VALUE", "ab73de7a-6f61-4dde-87cd-3af5175a7281")
22 +
23 + if graylog != expected_header:
24 + raise HTTPException(status_code=403, detail="Invalid or missing Graylog header")
25 + return graylog
26 +
27 +
28 +@active_response_graylog_router.post(
29 + "/invoke",
30 + response_model=InvokeActiveResponseResponse,
31 + description="Invoke an active response via a Graylog Alert notification.",
32 + dependencies=[Depends(verify_graylog_header)],
33 +)
34 +async def invoke_active_response_graylog_route(
35 + request: GraylogEventNotification,
36 +) -> InvokeActiveResponseResponse:
37 + """
38 + This route accepts an HTTP Post from Graylog. Required fields are:
39 + 1. Agent ID - The ID of the agent that triggered the alert
40 + 2. Command - The command to execute (i.e. 'dns_block.py')
41 + 3. Arguments - The arguments to pass to the command such as IP addresses, domains, etc.
42 + 4. Required Graylog Event Fields:
43 + COMMAND: str - this is the active response command to execute i.e 'domain_sinkhole' (do not include the '.py')
44 + AGENT_ID: str - the agent ID that triggered the alert
45 + ACTION: str - the action to take i.e 'sinkhole' - this is defined in the python script of the valid actions
46 + VALUE: str - the value to use i.e 'example.com' - this is the value that the action will be taken on
47 +
48 + #### IMPORTANT: IF THE MANAGERS ARE IN A CLUSTER, THE WORKER FOR THE AGENT MUST GET THE COMMAND AND ACTIVE RESPONSE BLOCKS
49 +
50 + Args:
51 + request (InvokeActiveResponseRequest): The request object containing the command, custom, arguments, and alert.
52 +
53 + Returns:
54 + InvokeActiveResponseResponse: The response object indicating the success or failure of the active response invocation.
55 + """
56 + logger.info("Invoking Wazuh Active Response...")
57 + # Append '0' to the command - This is required for Wazuh Active Response
58 + command = f"{request.event.fields.COMMAND}0"
59 + # Create a dictionary with the request data
60 + # {"endpoint":"active-response","arguments":[],"command":"windows_firewall","custom":true,"alert":{"action":"block","ip":"1.1.1.1"},"params":{"wait_for_complete":true,"agents_list":["086"]}}
61 +
62 + data_dict = {"command": command, "arguments": [], "alert": {"action": request.event.fields.ACTION, "value": request.event.fields.VALUE}}
63 + await send_put_request(
64 + endpoint="/active-response",
65 + data=json.dumps(data_dict),
66 + params={"wait_for_complete": True, "agents_list": [request.event.fields.AGENT_ID]},
67 + debug=True,
68 + )
69 +
70 + return InvokeActiveResponseResponse(success=True, message="Wazuh Active Response invoked successfully")
backend/app/active_response/routes/sysmon_config.py new
+118
@@ -0,0 +1,118 @@
1 +from fastapi import APIRouter
2 +from fastapi import Depends
3 +from fastapi import File
4 +from fastapi import Form
5 +from fastapi import HTTPException
6 +from fastapi import Response
7 +from fastapi import UploadFile
8 +from sqlalchemy.ext.asyncio import AsyncSession
9 +
10 +from app.active_response.schema.sysmon_config import SysmonConfigContentResponse
11 +from app.active_response.schema.sysmon_config import SysmonConfigDeploymentResult
12 +from app.active_response.schema.sysmon_config import SysmonConfigListResponse
13 +from app.active_response.schema.sysmon_config import SysmonConfigUploadResponse
14 +from app.active_response.services.sysmon_config import check_config_exists
15 +from app.active_response.services.sysmon_config import deploy_sysmon_config_to_worker
16 +from app.active_response.services.sysmon_config import validate_sysmon_config
17 +from app.data_store.data_store_operations import download_sysmon_config
18 +from app.data_store.data_store_operations import list_sysmon_configs
19 +from app.data_store.data_store_operations import upload_sysmon_config
20 +from app.db.db_session import get_db
21 +
22 +sysmon_config_router = APIRouter()
23 +
24 +
25 +@sysmon_config_router.post("/upload", response_model=SysmonConfigUploadResponse)
26 +async def upload_customer_sysmon_config(
27 + customer_code: str = Form(...),
28 + file: UploadFile = File(...),
29 + session: AsyncSession = Depends(get_db),
30 +):
31 + """Upload a sysmon config XML file for a specific customer."""
32 + # Validate file extension
33 + if not file.filename.endswith(".xml"):
34 + raise HTTPException(status_code=400, detail="Only XML files are accepted for sysmon configs")
35 +
36 + try:
37 + # Read and validate file content
38 + file_content = await file.read()
39 + xml_content = file_content.decode("utf-8")
40 + await validate_sysmon_config(xml_content)
41 +
42 + # Reset file pointer for upload
43 + await file.seek(0)
44 +
45 + # Check if file exists already
46 + file_exists = await check_config_exists(customer_code)
47 +
48 + # Upload file
49 + await upload_sysmon_config(customer_code, file)
50 +
51 + return SysmonConfigUploadResponse(
52 + success=True,
53 + message=f"Successfully {'updated' if file_exists else 'uploaded'} Sysmon config",
54 + customer_code=customer_code,
55 + filename="sysmon_config.xml",
56 + overwritten=file_exists,
57 + )
58 + except UnicodeDecodeError:
59 + raise HTTPException(status_code=400, detail="File is not valid UTF-8 encoded text")
60 +
61 +
62 +# This route must come before the /{customer_code} route
63 +@sysmon_config_router.get("/content/{customer_code}", response_model=SysmonConfigContentResponse)
64 +async def get_customer_sysmon_config_content(customer_code: str, session: AsyncSession = Depends(get_db)):
65 + """Get the sysmon config for a specific customer as a string."""
66 + try:
67 + data_bytes = await download_sysmon_config(customer_code)
68 + xml_content = data_bytes.decode("utf-8")
69 +
70 + return SysmonConfigContentResponse(
71 + success=True,
72 + message="Successfully retrieved Sysmon config",
73 + customer_code=customer_code,
74 + config_content=xml_content,
75 + )
76 + except UnicodeDecodeError:
77 + raise HTTPException(status_code=500, detail="Failed to decode config file as UTF-8")
78 + except HTTPException:
79 + raise
80 + except Exception as e:
81 + raise HTTPException(status_code=500, detail=f"Error retrieving config: {str(e)}")
82 +
83 +
84 +@sysmon_config_router.get("", response_model=SysmonConfigListResponse)
85 +async def get_all_sysmon_configs(session: AsyncSession = Depends(get_db)):
86 + """List all customers that have sysmon configs."""
87 + customers = await list_sysmon_configs()
88 +
89 + return SysmonConfigListResponse(
90 + success=True,
91 + message="Successfully retrieved list of customer sysmon configs",
92 + customer_codes=customers,
93 + )
94 +
95 +
96 +@sysmon_config_router.get("/{customer_code}")
97 +async def get_customer_sysmon_config(customer_code: str, session: AsyncSession = Depends(get_db)):
98 + """Download the sysmon config for a specific customer."""
99 + try:
100 + data = await download_sysmon_config(customer_code)
101 + return Response(
102 + content=data,
103 + media_type="application/xml",
104 + headers={"Content-Disposition": f"attachment; filename=sysmon_config_{customer_code}.xml"},
105 + )
106 + except HTTPException:
107 + raise
108 + except Exception as e:
109 + raise HTTPException(status_code=500, detail=f"Error retrieving config: {str(e)}")
110 +
111 +
112 +@sysmon_config_router.post("/deploy/{customer_code}", response_model=SysmonConfigDeploymentResult)
113 +async def deploy_sysmon_config(customer_code: str, session: AsyncSession = Depends(get_db)):
114 + """
115 + Deploy a customer's Sysmon config to the Wazuh master.
116 + Fetches the config from MinIO storage and sends it to the Wazuh master.
117 + """
118 + return await deploy_sysmon_config_to_worker(customer_code=customer_code, session=session)
backend/app/active_response/schema/active_response.py
+21 -1
@@ -46,6 +46,7 @@ class ActiveResponseDetailsResponse(BaseModel):
46 class AlertAction(str, Enum):
47 unblock = "unblock"
48 block = "block"
49 + sysmon_config_reload = "sysmon_config_reload"
50
51
52 class BaseModelWithEnum(BaseModel):
@@ -63,9 +64,14 @@ class LinuxFirewallAlert(BaseModelWithEnum):
64 ip: str
65
66
67 +class SysmonConfigReloadAlert(BaseModelWithEnum):
68 + action: AlertAction = Field(default=AlertAction.sysmon_config_reload, const=True)
69 +
70 +
71 class ActiveResponseCommand(str, Enum):
72 windows_firewall = "windows_firewall"
73 linux_firewall = "linux_firewall"
74 + sysmon_config_reload = "sysmon_config_reload"
75
76 @classmethod
77 def _missing_(cls, value):
@@ -95,7 +101,7 @@ class ParamsModel(BaseModel):
101
102
103 class InvokeActiveResponseRequest(BaseModel):
98 - endpoint: str = Field("active-response", const=True)
104 + endpoint: str = Field("/active-response", const=True)
105 arguments: list[str] = Field(default_factory=list)
106 command: ActiveResponseCommand
107 custom: bool = Field(True, const=True)
@@ -110,11 +116,25 @@ class InvokeActiveResponseRequest(BaseModel):
116 values["alert"] = WindowsFirewallAlert(**alert)
117 elif command == ActiveResponseCommand.linux_firewall:
118 values["alert"] = LinuxFirewallAlert(**alert)
119 + elif command == ActiveResponseCommand.sysmon_config_reload:
120 + values["alert"] = SysmonConfigReloadAlert(**alert)
121 else:
122 raise HTTPException(status_code=400, detail="Invalid command for alert")
123
124 return values
125
126 + class Config:
127 + schema_extra = {
128 + "example": {
129 + "endpoint": "/active-response",
130 + "arguments": [],
131 + "command": "windows_firewall",
132 + "custom": True,
133 + "alert": {"action": "block", "ip": "1.1.1.1"},
134 + "params": {"wait_for_complete": True, "agents_list": ["032"]},
135 + },
136 + }
137 +
138
139 class InvokeActiveResponseResponse(BaseModel):
140 success: bool
backend/app/active_response/schema/graylog.py new
+106
@@ -0,0 +1,106 @@
1 +from datetime import datetime
2 +from typing import Any
3 +from typing import Dict
4 +from typing import List
5 +from typing import Optional
6 +
7 +from pydantic import BaseModel
8 +from pydantic import Field
9 +
10 +
11 +class ReplayInfo(BaseModel):
12 + timerange_start: datetime
13 + timerange_end: datetime
14 + query: str
15 + streams: List[str]
16 + filters: List[Any] = Field(default_factory=list)
17 +
18 +
19 +class GraylogEventFields(BaseModel):
20 + COMMAND: str
21 + AGENT_ID: str
22 + ACTION: str
23 + VALUE: str
24 + # Allow additional fields
25 + additional_fields: Dict[str, Any] = Field(default_factory=dict, alias="__extra__")
26 +
27 + class Config:
28 + extra = "allow" # Allow extra fields
29 + populate_by_name = True # Process alias fields
30 +
31 +
32 +class GraylogEvent(BaseModel):
33 + id: str
34 + event_definition_type: str
35 + event_definition_id: str
36 + origin_context: str
37 + timestamp: datetime
38 + timestamp_processing: datetime
39 + timerange_start: Optional[datetime] = None
40 + timerange_end: Optional[datetime] = None
41 + streams: List[str] = Field(default_factory=list)
42 + source_streams: List[str]
43 + message: str
44 + source: str
45 + key_tuple: List[Any] = Field(default_factory=list)
46 + key: str
47 + priority: int
48 + scores: Dict[str, Any] = Field(default_factory=dict)
49 + associated_assets: List[Any] = Field(default_factory=list)
50 + alert: bool
51 + fields: GraylogEventFields
52 + group_by_fields: Dict[str, Any] = Field(default_factory=dict)
53 + replay_info: ReplayInfo
54 +
55 +
56 +class GraylogEventNotification(BaseModel):
57 + event_definition_id: str
58 + event_definition_type: str
59 + event_definition_title: str
60 + event_definition_description: str = ""
61 + job_definition_id: str
62 + job_trigger_id: str
63 + event: GraylogEvent
64 + backlog: List[Any] = Field(default_factory=list)
65 +
66 + class Config:
67 + schema_extra = {
68 + "example": {
69 + "event_definition_id": "67c78b93cf26aa2045bdc2ea",
70 + "event_definition_type": "aggregation-v1",
71 + "event_definition_title": "ACTIVE RESPONSE WEBSERVER THREAT INTEL",
72 + "event_definition_description": "",
73 + "job_definition_id": "67c78befcf26aa2045bdc4e9",
74 + "job_trigger_id": "67c78c0bcf26aa2045bdc5b5",
75 + "event": {
76 + "id": "01JNHQP35THD48VH8601F6EMHE",
77 + "event_definition_type": "aggregation-v1",
78 + "event_definition_id": "67c78b93cf26aa2045bdc2ea",
79 + "origin_context": "urn:graylog:message:es:graylog-01_3:766b70b4-f94f-11ef-be9a-005056b6f13d",
80 + "timestamp": "2025-03-04T23:21:55.840Z",
81 + "timestamp_processing": "2025-03-04T23:26:03.450Z",
82 + "timerange_start": None,
83 + "timerange_end": None,
84 + "streams": [],
85 + "source_streams": ["679945aa7c4dd06afcef5feb", "679945a47c4dd06afcef5ef3"],
86 + "message": "ACTIVE RESPONSE WEBSERVER THREAT INTEL",
87 + "source": "soc-grlog01",
88 + "key_tuple": [],
89 + "key": "",
90 + "priority": 2,
91 + "scores": {},
92 + "associated_assets": [],
93 + "alert": True,
94 + "fields": {"COMMAND": "domain_sinkhole", "AGENT_ID": "032", "ACTION": "sinkhole", "VALUE": "example.com"},
95 + "group_by_fields": {},
96 + "replay_info": {
97 + "timerange_start": "2025-03-04T23:21:03.360Z",
98 + "timerange_end": "2025-03-04T23:26:03.360Z",
99 + "query": "_exists_:threat_intel_score",
100 + "streams": ["679945aa7c4dd06afcef5feb", "679945a47c4dd06afcef5ef3"],
101 + "filters": [],
102 + },
103 + },
104 + "backlog": [],
105 + },
106 + }
backend/app/active_response/schema/sysmon_config.py new
+40
@@ -0,0 +1,40 @@
1 +from typing import List
2 +from typing import Optional
3 +
4 +from pydantic import BaseModel
5 +
6 +
7 +class SysmonConfigDataStoreCreation(BaseModel):
8 + customer_code: str
9 + content_type: str = "application/xml"
10 + bucket_name: str = "sysmon-configs"
11 +
12 +
13 +class SysmonConfigUploadResponse(BaseModel):
14 + success: bool
15 + message: str
16 + customer_code: str
17 + filename: str
18 + overwritten: bool
19 +
20 +
21 +class SysmonConfigListResponse(BaseModel):
22 + success: bool
23 + message: str
24 + customer_codes: List[str]
25 +
26 +
27 +class SysmonConfigContentResponse(BaseModel):
28 + success: bool
29 + message: str
30 + customer_code: str
31 + config_content: str
32 +
33 +
34 +class SysmonConfigDeploymentResult(BaseModel):
35 + success: bool
36 + message: str
37 + customer_code: str
38 + worker_success: bool = False
39 + worker_message: Optional[str] = None
40 + error_detail: Optional[str] = None
backend/app/active_response/scripts/linux/domain_sinkhole.py new
+175
@@ -0,0 +1,175 @@
1 +#!/usr/bin/python3
2 +# Copyright (C) 2025, SOCFortress LLC.
3 +# All rights reserved.
4 +
5 +# This program is free software; you can redistribute it
6 +# and/or modify it under the terms of the GNU General Public
7 +# License (version 2) as published by the FSF - Free Software
8 +# Foundation.
9 +
10 +import datetime
11 +import json
12 +import os
13 +import re
14 +import subprocess
15 +import sys
16 +
17 +LOG_FILE = "/var/ossec/logs/active-responses.log"
18 +HOSTS_FILE = "/etc/hosts"
19 +SINKHOLE_IP = "127.0.0.1" # Loopback address for sinkholing
20 +
21 +COMMANDS = {"add": 0, "delete": 1, "continue": 2, "abort": 3}
22 +
23 +OS_SUCCESS = 0
24 +OS_INVALID = -1
25 +
26 +
27 +class Message:
28 + def __init__(self, alert="", command=0):
29 + self.alert = alert
30 + self.command = command
31 +
32 +
33 +def write_debug_file(ar_name, msg):
34 + """Writes a debug message to the log file."""
35 + with open(LOG_FILE, mode="a") as log_file:
36 + log_msg = {
37 + "timestamp": datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"),
38 + "active_response": "domain_sinkhole",
39 + "message": json.loads(msg) if isinstance(msg, str) and msg.strip().startswith("{") else msg,
40 + }
41 + log_file.write(json.dumps(log_msg) + "\n")
42 +
43 +
44 +def setup_and_check_message(argv):
45 + """Reads and validates the input message."""
46 + input_str = next(sys.stdin, "")
47 + write_debug_file(argv[0], input_str)
48 + try:
49 + data = json.loads(input_str)
50 + except ValueError:
51 + write_debug_file(argv[0], "Decoding JSON has failed, invalid input format")
52 + return Message(command=OS_INVALID)
53 + command = COMMANDS.get(data.get("command"), OS_INVALID)
54 + if command == OS_INVALID:
55 + write_debug_file(argv[0], "Not valid command: " + data.get("command"))
56 + return Message(alert=data, command=command)
57 +
58 +
59 +def is_valid_domain(domain):
60 + """Checks if a domain name is valid."""
61 + # Basic domain validation regex
62 + pattern = r"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"
63 + return bool(re.match(pattern, domain))
64 +
65 +
66 +def sinkhole_domain(domain):
67 + """Adds a domain to /etc/hosts pointing to loopback."""
68 + try:
69 + # Check if domain already exists in hosts file
70 + with open(HOSTS_FILE, "r") as f:
71 + hosts_content = f.read()
72 +
73 + if f"{SINKHOLE_IP} {domain}" in hosts_content:
74 + return f"Domain {domain} is already sinkholed"
75 +
76 + # Add the domain to hosts file
77 + with open(HOSTS_FILE, "a") as f:
78 + f.write(f"\n{SINKHOLE_IP} {domain} # Added by SOCFortress sinkhole\n")
79 +
80 + # Flush DNS cache if dnsmasq is running
81 + try:
82 + subprocess.run(["systemctl", "restart", "dnsmasq"], check=False)
83 + except (subprocess.SubprocessError, FileNotFoundError):
84 + # More specific exceptions for when systemctl doesn't exist or fails
85 + pass # It's okay if dnsmasq isn't installed
86 +
87 + return f"Sinkholed domain {domain} to {SINKHOLE_IP}"
88 + except Exception as e:
89 + return f"Failed to sinkhole domain {domain}: {str(e)}"
90 +
91 +
92 +def remove_sinkholed_domain(domain):
93 + """Removes a domain from the /etc/hosts file."""
94 + try:
95 + # Read hosts file
96 + with open(HOSTS_FILE, "r") as f:
97 + hosts_lines = f.readlines()
98 +
99 + # Filter out the domain entry
100 + new_hosts = [line for line in hosts_lines if not (domain in line and "Added by SOCFortress sinkhole" in line)]
101 +
102 + # Write back the file without the domain
103 + with open(HOSTS_FILE, "w") as f:
104 + f.writelines(new_hosts)
105 +
106 + # Flush DNS cache if dnsmasq is running
107 + try:
108 + subprocess.run(["systemctl", "restart", "dnsmasq"], check=False)
109 + except (subprocess.SubprocessError, FileNotFoundError):
110 + # More specific exceptions for when systemctl doesn't exist or fails
111 + pass # It's okay if dnsmasq isn't installed
112 +
113 + return f"Removed sinkholed domain {domain}"
114 + except Exception as e:
115 + return f"Failed to remove sinkholed domain {domain}: {str(e)}"
116 +
117 +
118 +def extract_alert_info(msg, argv):
119 + """Extracts the action and domain from the alert message."""
120 + try:
121 + alert = msg.alert["parameters"]["alert"]
122 + action = alert.get("action", "sinkhole") # Default to block if not specified
123 + domain = alert.get("value")
124 +
125 + if not domain:
126 + write_debug_file(argv[0], "No domain specified in alert")
127 + sys.exit(OS_INVALID)
128 + except KeyError as e:
129 + write_debug_file(argv[0], f"Missing key in alert message: {str(e)}")
130 + sys.exit(OS_INVALID)
131 + return action, domain
132 +
133 +
134 +def main(argv):
135 + write_debug_file(argv[0], {"status": "Started"})
136 +
137 + # Check if running as root (required to modify /etc/hosts)
138 + if os.geteuid() != 0:
139 + write_debug_file(argv[0], {"status": "failed", "message": "This script must run as root to modify /etc/hosts"})
140 + sys.exit(OS_INVALID)
141 +
142 + msg = setup_and_check_message(argv)
143 + if msg.command < 0:
144 + sys.exit(OS_INVALID)
145 +
146 + if msg.command == COMMANDS["add"]:
147 + action, domain = extract_alert_info(msg, argv)
148 +
149 + if not is_valid_domain(domain):
150 + write_debug_file(argv[0], {"status": "failed", "message": f"Invalid domain name: {domain}"})
151 + sys.exit(OS_INVALID)
152 +
153 + if action == "sinkhole": # Handle both "block" and "sinkhole" actions
154 + result = sinkhole_domain(domain)
155 + write_debug_file(argv[0], result)
156 + elif action == "remove_sinkhole":
157 + result = remove_sinkholed_domain(domain)
158 + write_debug_file(argv[0], result)
159 + else:
160 + write_debug_file(argv[0], f"Unknown action: {action}")
161 +
162 + elif msg.command == COMMANDS["delete"]:
163 + # The delete command could be used to clean up any persistent changes
164 + # For this implementation, we don't need any cleanup
165 + pass
166 +
167 + else:
168 + write_debug_file(argv[0], "Invalid command")
169 +
170 + write_debug_file(argv[0], "Ended")
171 + sys.exit(OS_SUCCESS)
172 +
173 +
174 +if __name__ == "__main__":
175 + main(sys.argv)
backend/app/active_response/scripts/windows/windows_firewall.py
+1 -1
@@ -1,5 +1,5 @@
1 #!/usr/bin/python3
2 -# Copyright (C) 2024, SOCFortress LLP.
2 +# Copyright (C) 2025, SOCFortress LLC.
3 # All rights reserved.
4
5 # This program is free software; you can redistribute it
backend/app/active_response/services/sysmon_config.py new
+239
@@ -0,0 +1,239 @@
1 +import os
2 +import tempfile
3 +import xml.etree.ElementTree as ET
4 +from typing import Optional
5 +from typing import Tuple
6 +from urllib.parse import urlparse
7 +
8 +import aiohttp
9 +from fastapi import HTTPException
10 +from loguru import logger
11 +from sqlalchemy.ext.asyncio import AsyncSession
12 +
13 +from app.active_response.schema.sysmon_config import SysmonConfigDeploymentResult
14 +from app.data_store.data_store_operations import download_sysmon_config
15 +from app.utils import get_connector_attribute
16 +
17 +
18 +async def validate_sysmon_config(xml_content: str) -> None:
19 + """Validate a Sysmon configuration XML string."""
20 + try:
21 + root = ET.fromstring(xml_content)
22 +
23 + # Verify root element
24 + if root.tag != "Sysmon":
25 + raise HTTPException(status_code=400, detail="Root element must be 'Sysmon'")
26 +
27 + # Verify EventFiltering element
28 + event_filtering = root.find("EventFiltering")
29 + if event_filtering is None:
30 + raise HTTPException(status_code=400, detail="Missing required 'EventFiltering' element")
31 +
32 + # Check for direct text content in EventFiltering
33 + if event_filtering.text and event_filtering.text.strip():
34 + raise HTTPException(status_code=400, detail="Invalid text content found directly in EventFiltering element")
35 +
36 + # Check for RuleGroup elements
37 + rule_groups = event_filtering.findall("RuleGroup")
38 + if not rule_groups:
39 + raise HTTPException(status_code=400, detail="EventFiltering must contain at least one RuleGroup")
40 +
41 + # Check that each RuleGroup has required attributes
42 + for rule_group in rule_groups:
43 + if not rule_group.attrib.get("groupRelation"):
44 + raise HTTPException(status_code=400, detail="RuleGroup must have 'groupRelation' attribute")
45 +
46 + except ET.ParseError as e:
47 + raise HTTPException(status_code=400, detail=f"Invalid XML syntax: {str(e)}")
48 +
49 +
50 +async def check_config_exists(customer_code: str) -> bool:
51 + """
52 + Check if a sysmon config exists for the given customer.
53 + Creates the bucket if it doesn't exist.
54 + """
55 + from app.data_store.data_store_session import create_session
56 +
57 + bucket_name = "sysmon-configs"
58 + object_name = f"{customer_code}/sysmon_config.xml"
59 +
60 + try:
61 + # Get MinIO client
62 + client = await create_session()
63 +
64 + # Create bucket if it doesn't exist
65 + if not await client.bucket_exists(bucket_name):
66 + logger.info(f"Bucket {bucket_name} doesn't exist. Creating it.")
67 + await client.make_bucket(bucket_name)
68 + return False
69 +
70 + # Check if object exists directly using stat_object
71 + try:
72 + await client.stat_object(bucket_name, object_name)
73 + logger.info(f"Found existing sysmon config for customer {customer_code}")
74 + return True
75 + except Exception as e:
76 + # If stat_object fails, the file doesn't exist
77 + logger.info(f"No existing sysmon config found for customer {customer_code} - {str(e)}")
78 + return False
79 +
80 + except Exception as e:
81 + logger.error(f"Error checking if config exists for customer {customer_code}: {str(e)}")
82 + raise HTTPException(status_code=500, detail=f"Error checking config existence: {str(e)}")
83 +
84 +
85 +async def fetch_sysmon_config(customer_code: str) -> bytes:
86 + """Fetch a customer's sysmon config from MinIO storage."""
87 + try:
88 + config_data = await download_sysmon_config(customer_code)
89 + logger.info(f"Successfully fetched Sysmon config for {customer_code} from storage")
90 + return config_data
91 + except Exception as e:
92 + logger.error(f"Failed to fetch Sysmon config for {customer_code}: {str(e)}")
93 + raise
94 +
95 +
96 +async def save_to_temp_file(data: bytes) -> str:
97 + """Save binary data to a temporary file and return the path."""
98 + temp_fd, temp_path = tempfile.mkstemp(suffix=".xml")
99 + try:
100 + with os.fdopen(temp_fd, "wb") as temp_file:
101 + temp_file.write(data)
102 + logger.info(f"Saved data to temporary file: {temp_path}")
103 + return temp_path
104 + except Exception as e:
105 + # Clean up if we fail to write
106 + if os.path.exists(temp_path):
107 + os.remove(temp_path)
108 + logger.error(f"Failed to save to temporary file: {str(e)}")
109 + raise
110 +
111 +
112 +async def get_wazuh_endpoint(session: AsyncSession) -> str:
113 + """Get the Wazuh API endpoint for deploying sysmon configs."""
114 + # Get the base URL from connector
115 + wazuh_api_base_url = await get_connector_attribute(column_name="connector_url", connector_name="Wazuh-Manager", session=session)
116 +
117 + # Parse the URL to extract hostname
118 + parsed_url = urlparse(wazuh_api_base_url)
119 + hostname = parsed_url.netloc.split(":")[0]
120 +
121 + # Create endpoint with correct port and path
122 + endpoint = f"http://{hostname}:5003/provision_worker/sysmon-config"
123 + logger.info(f"Constructed Wazuh API endpoint: {endpoint}")
124 +
125 + return endpoint
126 +
127 +
128 +async def upload_to_wazuh(endpoint: str, customer_code: str, file_path: str) -> Tuple[bool, dict, Optional[str]]:
129 + """Upload a sysmon config file to the Wazuh master."""
130 + # Replace spaces with underscores
131 + wazuh_customer_code = customer_code.replace(" ", "_")
132 +
133 + logger.info(f"Uploading Sysmon config for customer {wazuh_customer_code} to {endpoint}")
134 +
135 + async with aiohttp.ClientSession() as http_session:
136 + # Create form data
137 + form_data = aiohttp.FormData()
138 + form_data.add_field("customer_code", wazuh_customer_code)
139 +
140 + # Add the file
141 + with open(file_path, "rb") as file_to_upload:
142 + form_data.add_field("sysmon_config", file_to_upload, filename="sysmon_config.xml", content_type="application/xml")
143 +
144 + # Send the POST request
145 + async with http_session.post(endpoint, data=form_data) as response:
146 + if response.status == 200:
147 + response_data = await response.json()
148 + return True, response_data, None
149 + else:
150 + error_text = await response.text()
151 + return False, {}, error_text
152 +
153 +
154 +async def deploy_sysmon_config_to_worker(customer_code: str, session: AsyncSession) -> SysmonConfigDeploymentResult:
155 + """
156 + Fetch and deploy a customer's sysmon config to the Wazuh master.
157 +
158 + Args:
159 + customer_code: The customer code to deploy config for
160 + session: Database session for connector lookup
161 +
162 + Returns:
163 + SysmonConfigDeploymentResult: Results of the deployment operation
164 + """
165 + temp_path = None
166 +
167 + try:
168 + # Step 1: Fetch the config file
169 + try:
170 + config_data = await fetch_sysmon_config(customer_code)
171 + except Exception as fetch_error:
172 + return SysmonConfigDeploymentResult(
173 + success=False,
174 + message=f"Failed to fetch Sysmon config for {customer_code}",
175 + customer_code=customer_code,
176 + error_detail=str(fetch_error),
177 + )
178 +
179 + # Step 2: Save to temporary file
180 + try:
181 + temp_path = await save_to_temp_file(config_data)
182 + except Exception as temp_error:
183 + return SysmonConfigDeploymentResult(
184 + success=False,
185 + message="Failed to create temporary file",
186 + customer_code=customer_code,
187 + error_detail=str(temp_error),
188 + )
189 +
190 + # Step 3: Get Wazuh endpoint
191 + try:
192 + endpoint = await get_wazuh_endpoint(session)
193 + except Exception as endpoint_error:
194 + return SysmonConfigDeploymentResult(
195 + success=False,
196 + message="Failed to get Wazuh endpoint",
197 + customer_code=customer_code,
198 + error_detail=str(endpoint_error),
199 + )
200 +
201 + # Step 4: Upload to Wazuh
202 + success, response_data, error_text = await upload_to_wazuh(endpoint, customer_code, temp_path)
203 +
204 + if success:
205 + logger.info(f"Successfully deployed Sysmon config to Wazuh for {customer_code}")
206 + return SysmonConfigDeploymentResult(
207 + success=True,
208 + message=f"Sysmon config successfully deployed for {customer_code}",
209 + customer_code=customer_code,
210 + worker_success=response_data.get("success", True),
211 + worker_message=response_data.get("message", "Deployed successfully"),
212 + )
213 + else:
214 + logger.error(f"Failed to deploy Sysmon config to Wazuh: {error_text}")
215 + return SysmonConfigDeploymentResult(
216 + success=False,
217 + message="Error from Wazuh master when deploying Sysmon config",
218 + customer_code=customer_code,
219 + error_detail=error_text,
220 + )
221 +
222 + except Exception as e:
223 + error_msg = f"Error deploying Sysmon config: {str(e)}"
224 + logger.error(error_msg)
225 + return SysmonConfigDeploymentResult(
226 + success=False,
227 + message="Exception occurred during Sysmon config deployment",
228 + customer_code=customer_code,
229 + error_detail=str(e),
230 + )
231 +
232 + finally:
233 + # Clean up the temporary file
234 + if temp_path and os.path.exists(temp_path):
235 + try:
236 + os.remove(temp_path)
237 + logger.debug(f"Cleaned up temporary file: {temp_path}")
238 + except Exception as cleanup_error:
239 + logger.warning(f"Failed to clean up temporary file {temp_path}: {str(cleanup_error)}")
backend/app/connectors/portainer/utils/universal.py
+2
@@ -25,6 +25,8 @@ async def get_endpoint_id() -> int:
25 if endpoint["Name"] == "local":
26 # Convert the ID to an integer
27 return int(endpoint["Id"])
28 + if endpoint["Name"] == "primary":
29 + return int(endpoint["Id"])
30 return None
31
32
backend/app/connectors/wazuh_manager/utils/universal.py
+115 -6
@@ -1,3 +1,4 @@
1 +import json
2 from typing import Any
3 from typing import Dict
4 from typing import Optional
@@ -226,6 +227,64 @@ async def send_post_request(
227 }
228
229
230 +# async def send_put_request(
231 +# endpoint: str,
232 +# data: Optional[Dict[str, Any]],
233 +# params: Optional[Dict[str, str]] = None,
234 +# xml_data: Optional[bool] = False,
235 +# binary_data: Optional[bool] = False,
236 +# connector_name: str = "Wazuh-Manager",
237 +# ) -> Dict[str, Any]:
238 +# """
239 +# Sends a PUT request to the Wazuh Manager service.
240 +
241 +# Args:
242 +# endpoint (str): The endpoint to send the PUT request to.
243 +# data (Dict[str, Any]): The data to send with the PUT request.
244 +# params (Optional[Dict[str, str]], optional): The parameters to send with the PUT request. Defaults to None.
245 +# xml_data (Optional[bool], optional): Whether or not the data is XML. Defaults to False.
246 +# connector_name (str, optional): The name of the connector to use. Defaults to "Wazuh-Manager".
247 +
248 +# Returns:
249 +# Dict[str, Any]: The response from the PUT request.
250 +# """
251 +# logger.info(f"Sending PUT request to {endpoint}")
252 +# wazuh_manager_client = await create_wazuh_manager_client(connector_name)
253 +# async with AsyncSessionLocal() as session:
254 +# attributes = await get_connector_info_from_db(connector_name, session)
255 +# if attributes is None:
256 +# logger.error("No Wazuh Manager connector found in the database")
257 +# return None
258 +# # Add the default `Content-Type` header to the request
259 +# wazuh_manager_client["Content-Type"] = "application/json"
260 +# # Add the `Content-Type` header to the request if the data is XML
261 +# if xml_data:
262 +# wazuh_manager_client["Content-Type"] = "application/xml"
263 +# if binary_data:
264 +# wazuh_manager_client["Content-Type"] = "application/octet-stream"
265 +# try:
266 +# logger.debug(f"Sending PUT request to {endpoint} with data: {data}")
267 +# response = requests.put(
268 +# f"{attributes['connector_url']}{endpoint}",
269 +# headers=wazuh_manager_client,
270 +# params=params,
271 +# data=data,
272 +# verify=False,
273 +# )
274 +# response.raise_for_status()
275 +# return {
276 +# "data": response.json(),
277 +# "success": True,
278 +# "message": "Successfully retrieved data",
279 +# }
280 +# except Exception as e:
281 +# logger.error(f"Failed to send PUT request to {endpoint} with error: {e}")
282 +# return {
283 +# "success": False,
284 +# "message": f"Failed to send PUT request to {endpoint} with error: {e}",
285 +# }
286 +
287 +
288 async def send_put_request(
289 endpoint: str,
290 data: Optional[Dict[str, Any]],
@@ -233,6 +292,7 @@ async def send_put_request(
292 xml_data: Optional[bool] = False,
293 binary_data: Optional[bool] = False,
294 connector_name: str = "Wazuh-Manager",
295 + debug: bool = False,
296 ) -> Dict[str, Any]:
297 """
298 Sends a PUT request to the Wazuh Manager service.
@@ -242,7 +302,9 @@ async def send_put_request(
302 data (Dict[str, Any]): The data to send with the PUT request.
303 params (Optional[Dict[str, str]], optional): The parameters to send with the PUT request. Defaults to None.
304 xml_data (Optional[bool], optional): Whether or not the data is XML. Defaults to False.
305 + binary_data (Optional[bool], optional): Whether or not the data is binary. Defaults to False.
306 connector_name (str, optional): The name of the connector to use. Defaults to "Wazuh-Manager".
307 + debug (bool, optional): Whether to enable detailed debug logging. Defaults to False.
308
309 Returns:
310 Dict[str, Any]: The response from the PUT request.
@@ -251,18 +313,30 @@ async def send_put_request(
313 wazuh_manager_client = await create_wazuh_manager_client(connector_name)
314 async with AsyncSessionLocal() as session:
315 attributes = await get_connector_info_from_db(connector_name, session)
316 +
317 if attributes is None:
318 logger.error("No Wazuh Manager connector found in the database")
319 return None
320 +
321 # Add the default `Content-Type` header to the request
322 wazuh_manager_client["Content-Type"] = "application/json"
323 +
324 # Add the `Content-Type` header to the request if the data is XML
325 if xml_data:
326 wazuh_manager_client["Content-Type"] = "application/xml"
327 if binary_data:
328 wazuh_manager_client["Content-Type"] = "application/octet-stream"
329 +
330 + # Enhanced debugging
331 + if debug:
332 + logger.debug(f"Request URL: {attributes['connector_url']}{endpoint}")
333 + logger.debug(f"Request headers: {wazuh_manager_client}")
334 + logger.debug(f"Request params: {params}")
335 + logger.debug(f"Request data: {data}")
336 +
337 try:
338 logger.debug(f"Sending PUT request to {endpoint} with data: {data}")
339 +
340 response = requests.put(
341 f"{attributes['connector_url']}{endpoint}",
342 headers=wazuh_manager_client,
@@ -270,18 +344,53 @@ async def send_put_request(
344 data=data,
345 verify=False,
346 )
273 - response.raise_for_status()
347 +
348 + # Log response details before checking status
349 + if debug:
350 + logger.debug(f"Response status: {response.status_code}")
351 + logger.debug(f"Response headers: {response.headers}")
352 + try:
353 + logger.debug(f"Response body: {response.text}")
354 + except Exception as e: # Specify Exception instead of bare except
355 + logger.debug(f"Could not parse response body: {str(e)}")
356 +
357 + # Handle HTTP errors with detailed logging
358 + try:
359 + response.raise_for_status()
360 + except requests.exceptions.HTTPError:
361 + error_detail = ""
362 + try:
363 + error_json = response.json()
364 + if isinstance(error_json, dict):
365 + # Extract Wazuh API specific error details
366 + if "detail" in error_json:
367 + error_detail = error_json["detail"]
368 + elif "message" in error_json:
369 + error_detail = error_json["message"]
370 + elif "data" in error_json and "detail" in error_json["data"]:
371 + error_detail = error_json["data"]["detail"]
372 + except (ValueError, json.JSONDecodeError) as e: # Specify exceptions instead of bare except
373 + # If can't parse JSON, use text response
374 + error_detail = response.text
375 + logger.debug(f"Could not parse JSON response: {str(e)}")
376 +
377 + logger.error(f"HTTP error {response.status_code}: {error_detail}")
378 + return {
379 + "success": False,
380 + "status_code": response.status_code,
381 + "message": f"HTTP error {response.status_code}: {error_detail}",
382 + "error_detail": error_detail,
383 + "raw_response": response.text,
384 + }
385 +
386 return {
387 "data": response.json(),
388 "success": True,
389 "message": "Successfully retrieved data",
390 }
391 except Exception as e:
280 - logger.error(f"Failed to send PUT request to {endpoint} with error: {e}")
281 - return {
282 - "success": False,
283 - "message": f"Failed to send PUT request to {endpoint} with error: {e}",
284 - }
392 + logger.exception(f"Failed to send PUT request to {endpoint}")
393 + return {"success": False, "message": f"Failed to send PUT request to {endpoint} with error: {str(e)}", "exception": str(e)}
394
395
396 async def send_delete_request(
backend/app/data_store/data_store_operations.py
+87
@@ -130,3 +130,90 @@ async def delete_file(bucket_name: str, object_name: str) -> None:
130 # If an exception is raised, the file does not exist
131 logger.info(f"Error: {e}")
132 raise HTTPException(status_code=404, detail=f"File {object_name} not found in bucket {bucket_name}")
133 +
134 +
135 +# ! Handle Sysmon Config Files ! #
136 +
137 +
138 +async def upload_sysmon_config(customer_code: str, file: UploadFile) -> None:
139 + """
140 + Upload a sysmon config XML file to the specified customer folder in the sysmon-configs bucket.
141 + Creates the customer folder if it doesn't exist.
142 +
143 + Args:
144 + customer_code: The customer code used as folder name
145 + file: The uploaded XML file
146 + """
147 + bucket_name = "sysmon-configs"
148 + client = await create_session()
149 +
150 + # Create bucket if it doesn't exist
151 + await create_bucket_if_not_exists(bucket_name)
152 +
153 + logger.info(f"Uploading sysmon config for customer {customer_code}")
154 +
155 + # Define the temporary file path
156 + temp_file_path = os.path.join(os.getcwd(), file.filename)
157 +
158 + # Save the file to the temporary location
159 + async with aiofiles.open(temp_file_path, "wb") as out_file:
160 + content = await file.read()
161 + await out_file.write(content)
162 +
163 + # Upload the file to MinIO with customer folder structure
164 + object_name = f"{customer_code}/sysmon_config.xml"
165 +
166 + await client.fput_object(bucket_name=bucket_name, object_name=object_name, file_path=temp_file_path, content_type="application/xml")
167 +
168 + # Remove the temporary file after upload
169 + os.remove(temp_file_path)
170 +
171 + logger.info(f"Successfully uploaded sysmon config for customer {customer_code}")
172 +
173 +
174 +async def download_sysmon_config(customer_code: str) -> bytes:
175 + """
176 + Download the sysmon config XML file for the specified customer.
177 +
178 + Args:
179 + customer_code: The customer code
180 +
181 + Returns:
182 + bytes: The content of the sysmon config file
183 + """
184 + bucket_name = "sysmon-configs"
185 + object_name = f"{customer_code}/sysmon_config.xml"
186 +
187 + return await download_data_store(bucket_name, object_name)
188 +
189 +
190 +async def list_sysmon_configs() -> list:
191 + """
192 + List all customer sysmon configs available in the sysmon-configs bucket.
193 +
194 + Returns:
195 + list: List of customer codes with sysmon configs
196 + """
197 + bucket_name = "sysmon-configs"
198 + client = await create_session()
199 +
200 + try:
201 + # Make sure bucket exists
202 + if not await client.bucket_exists(bucket_name):
203 + await client.make_bucket(bucket_name)
204 + return []
205 +
206 + # Get all objects
207 + objects = client.list_objects(bucket_name, recursive=True)
208 + customers = set()
209 +
210 + # Extract customer codes from paths
211 + async for obj in objects:
212 + if obj.object_name.endswith("sysmon_config.xml"):
213 + customer_code = obj.object_name.split("/")[0]
214 + customers.add(customer_code)
215 +
216 + return list(customers)
217 + except Exception as e:
218 + logger.error(f"Error listing sysmon configs: returning empty list - {e}")
219 + return []
backend/app/data_store/data_store_setup.py
+1
@@ -15,3 +15,4 @@ async def create_bucket_if_not_exists(bucket_name: str) -> None:
15 async def create_buckets() -> None:
16 await create_bucket_if_not_exists("copilot-cases")
17 await create_bucket_if_not_exists("copilot-case-report-templates")
18 + await create_bucket_if_not_exists("sysmon-configs")
backend/app/routers/active_response.py
+14
@@ -1,6 +1,8 @@
1 from fastapi import APIRouter
2
3 from app.active_response.routes.active_response import active_response_router
4 +from app.active_response.routes.graylog import active_response_graylog_router
5 +from app.active_response.routes.sysmon_config import sysmon_config_router
6
7 # Instantiate the APIRouter
8 router = APIRouter()
@@ -11,3 +13,15 @@ router.include_router(
13 prefix="/active_response",
14 tags=["Active Response"],
15 )
16 +
17 +router.include_router(
18 + sysmon_config_router,
19 + prefix="/sysmon_config",
20 + tags=["Sysmon Config"],
21 +)
22 +
23 +router.include_router(
24 + active_response_graylog_router,
25 + prefix="/graylog",
26 + tags=["Active Response"],
27 +)
frontend/cypress.config.cjs renamed
+2 -2
@@ -1,6 +1,6 @@
1 -import { defineConfig } from "cypress"
1 +const { defineConfig } = require("cypress")
2
3 -export default defineConfig({
3 +module.exports = defineConfig({
4 e2e: {
5 specPattern: "cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}",
6 baseUrl: "http://localhost:4173"
frontend/package.json
+21 -14
@@ -3,7 +3,7 @@
3 "type": "module",
4 "version": "1.0.0",
5 "private": true,
6 - "packageManager": "pnpm@10.4.1",
6 + "packageManager": "pnpm@10.5.2+sha256.79a98daa90248b50815e31460790f118c56fe099113370826caa0153be6daba5",
7 "engines": {
8 "node": ">=18.0.0"
9 },
@@ -16,7 +16,7 @@
16 "build:check": "run-s libs:reload build lint type-check format test:e2e test:unit",
17 "preview": "vite build && echo '' && vite preview --port 4173 --host",
18 "preview:only": "vite preview --port 4173 --host",
19 - "test:unit": "vitest",
19 + "test:unit": "vitest run",
20 "test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'",
21 "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'",
22 "type-check": "vue-tsc --build --force",
@@ -36,15 +36,20 @@
36 },
37 "dependencies": {
38 "@ajoelp/json-to-formdata": "^1.5.0",
39 + "@codemirror/commands": "^6.8.0",
40 + "@codemirror/lang-javascript": "^6.2.3",
41 + "@codemirror/lang-xml": "^6.1.0",
42 + "@codemirror/theme-one-dark": "^6.1.2",
43 "@f3ve/vue-markdown-it": "^0.2.3",
40 - "@fontsource/jetbrains-mono": "^5.1.2",
41 - "@fontsource/lexend": "^5.1.2",
42 - "@fontsource/public-sans": "^5.1.2",
44 + "@fontsource/jetbrains-mono": "^5.2.5",
45 + "@fontsource/lexend": "^5.2.5",
46 + "@fontsource/public-sans": "^5.2.5",
47 "@shikijs/markdown-it": "^3.1.0",
48 "@tailwindcss/container-queries": "^0.1.1",
45 - "@vueuse/core": "^12.7.0",
49 + "@vueuse/core": "^12.8.2",
50 "axios": "^1.8.1",
51 "bytes": "^3.1.2",
52 + "codemirror": "~6.0.1",
53 "colord": "^2.9.3",
54 "dayjs": "^1.11.13",
55 "detect-touch-device": "^1.1.6",
@@ -62,9 +67,11 @@
67 "pinia-plugin-persistedstate": "^4.2.0",
68 "secure-ls": "^2.0.0",
69 "shiki": "^3.1.0",
70 + "thememirror": "^2.0.1",
71 "validator": "^13.12.0",
72 "vue": "^3.5.13",
73 "vue-advanced-cropper": "^2.8.9",
74 + "vue-codemirror": "^6.1.1",
75 "vue-highlight-words": "^3.0.1",
76 "vue-i18n": "^11.1.1",
77 "vue-router": "^4.5.0",
@@ -79,7 +86,7 @@
86 "vueuc": "^0.4.64"
87 },
88 "devDependencies": {
82 - "@antfu/eslint-config": "^4.3.0",
89 + "@antfu/eslint-config": "^4.6.0",
90 "@clack/prompts": "^0.10.0",
91 "@iconify/vue": "^4.3.0",
92 "@tsconfig/node20": "^20.1.4",
@@ -87,8 +94,8 @@
94 "@types/file-saver": "^2.0.7",
95 "@types/fs-extra": "^11.0.4",
96 "@types/jsdom": "^21.1.7",
90 - "@types/lodash": "^4.17.15",
91 - "@types/node": "^22.13.5",
97 + "@types/lodash": "^4.17.16",
98 + "@types/node": "^22.13.9",
99 "@types/validator": "^13.12.2",
100 "@vitejs/plugin-vue": "^5.2.1",
101 "@vitejs/plugin-vue-jsx": "^4.1.1",
@@ -103,20 +110,20 @@
110 "jsdom": "^26.0.0",
111 "npm-run-all2": "^7.0.2",
112 "postcss": "^8.5.3",
106 - "prettier": "^3.5.2",
113 + "prettier": "^3.5.3",
114 "prettier-plugin-tailwindcss": "^0.6.11",
115 "sass": "^1.85.1",
116 "start-server-and-test": "^2.0.10",
117 "tailwindcss": "^3.4.17",
118 "taze": "^18.6.0",
112 - "type-fest": "^4.35.0",
113 - "typescript": "~5.7.3",
119 + "type-fest": "^4.37.0",
120 + "typescript": "~5.8.2",
121 "vite": "^6.2.0",
122 "vite-bundle-visualizer": "^1.2.1",
123 "vite-plugin-vue-devtools": "^7.7.2",
124 "vite-svg-loader": "^5.1.0",
118 - "vitest": "^3.0.7",
119 - "vue-tsc": "^2.2.4"
125 + "vitest": "^3.0.8",
126 + "vue-tsc": "^2.2.8"
127 },
128 "pnpm": {
129 "onlyBuiltDependencies": [
frontend/pnpm-lock.yaml
+871 -626
@@ -11,18 +11,30 @@ importers:
11 '@ajoelp/json-to-formdata':
12 specifier: ^1.5.0
13 version: 1.5.0
14 + '@codemirror/commands':
15 + specifier: ^6.8.0
16 + version: 6.8.0
17 + '@codemirror/lang-javascript':
18 + specifier: ^6.2.3
19 + version: 6.2.3
20 + '@codemirror/lang-xml':
21 + specifier: ^6.1.0
22 + version: 6.1.0
23 + '@codemirror/theme-one-dark':
24 + specifier: ^6.1.2
25 + version: 6.1.2
26 '@f3ve/vue-markdown-it':
27 specifier: ^0.2.3
16 - version: 0.2.3(vue@3.5.13(typescript@5.7.3))
28 + version: 0.2.3(vue@3.5.13(typescript@5.8.2))
29 '@fontsource/jetbrains-mono':
18 - specifier: ^5.1.2
19 - version: 5.1.2
30 + specifier: ^5.2.5
31 + version: 5.2.5
32 '@fontsource/lexend':
21 - specifier: ^5.1.2
22 - version: 5.1.2
33 + specifier: ^5.2.5
34 + version: 5.2.5
35 '@fontsource/public-sans':
24 - specifier: ^5.1.2
25 - version: 5.1.2
36 + specifier: ^5.2.5
37 + version: 5.2.5
38 '@shikijs/markdown-it':
39 specifier: ^3.1.0
40 version: 3.1.0
@@ -30,14 +42,17 @@ importers:
42 specifier: ^0.1.1
43 version: 0.1.1(tailwindcss@3.4.17)
44 '@vueuse/core':
33 - specifier: ^12.7.0
34 - version: 12.7.0(typescript@5.7.3)
45 + specifier: ^12.8.2
46 + version: 12.8.2(typescript@5.8.2)
47 axios:
48 specifier: ^1.8.1
49 version: 1.8.1(debug@4.4.0)
50 bytes:
51 specifier: ^3.1.2
52 version: 3.1.2
53 + codemirror:
54 + specifier: ~6.0.1
55 + version: 6.0.1
56 colord:
57 specifier: ^2.9.3
58 version: 2.9.3
@@ -70,7 +85,7 @@ importers:
85 version: 3.0.1
86 naive-ui:
87 specifier: ^2.41.0
73 - version: 2.41.0(vue@3.5.13(typescript@5.7.3))
88 + version: 2.41.0(vue@3.5.13(typescript@5.8.2))
89 nanoid:
90 specifier: ^5.1.2
91 version: 5.1.2
@@ -79,56 +94,62 @@ importers:
94 version: 5.3.0
95 pinia:
96 specifier: ^3.0.1
82 - version: 3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
97 + version: 3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
98 pinia-plugin-persistedstate:
99 specifier: ^4.2.0
85 - version: 4.2.0(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))
100 + version: 4.2.0(pinia@3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)))
101 secure-ls:
102 specifier: ^2.0.0
103 version: 2.0.0
104 shiki:
105 specifier: ^3.1.0
106 version: 3.1.0
107 + thememirror:
108 + specifier: ^2.0.1
109 + version: 2.0.1(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.36.4)
110 validator:
111 specifier: ^13.12.0
112 version: 13.12.0
113 vue:
114 specifier: ^3.5.13
97 - version: 3.5.13(typescript@5.7.3)
115 + version: 3.5.13(typescript@5.8.2)
116 vue-advanced-cropper:
117 specifier: ^2.8.9
100 - version: 2.8.9(vue@3.5.13(typescript@5.7.3))
118 + version: 2.8.9(vue@3.5.13(typescript@5.8.2))
119 + vue-codemirror:
120 + specifier: ^6.1.1
121 + version: 6.1.1(codemirror@6.0.1)(vue@3.5.13(typescript@5.8.2))
122 vue-highlight-words:
123 specifier: ^3.0.1
103 - version: 3.0.1(vue@3.5.13(typescript@5.7.3))
124 + version: 3.0.1(vue@3.5.13(typescript@5.8.2))
125 vue-i18n:
126 specifier: ^11.1.1
106 - version: 11.1.1(vue@3.5.13(typescript@5.7.3))
127 + version: 11.1.1(vue@3.5.13(typescript@5.8.2))
128 vue-router:
129 specifier: ^4.5.0
109 - version: 4.5.0(vue@3.5.13(typescript@5.7.3))
130 + version: 4.5.0(vue@3.5.13(typescript@5.8.2))
131 vue-sjv:
132 specifier: ^0.0.6
112 - version: 0.0.6(vue@3.5.13(typescript@5.7.3))
133 + version: 0.0.6(vue@3.5.13(typescript@5.8.2))
134 vue3-apexcharts:
135 specifier: ^1.8.0
115 - version: 1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.7.3))
136 + version: 1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.8.2))
137 vue3-marquee:
138 specifier: ^4.2.2
118 - version: 4.2.2(vue@3.5.13(typescript@5.7.3))
139 + version: 4.2.2(vue@3.5.13(typescript@5.8.2))
140 vuedraggable:
141 specifier: ^4.1.0
121 - version: 4.1.0(vue@3.5.13(typescript@5.7.3))
142 + version: 4.1.0(vue@3.5.13(typescript@5.8.2))
143 devDependencies:
144 '@antfu/eslint-config':
124 - specifier: ^4.3.0
125 - version: 4.3.0(@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))
145 + specifier: ^4.6.0
146 + version: 4.6.0(@typescript-eslint/utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(@vue/compiler-sfc@3.5.13)(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))
147 '@clack/prompts':
148 specifier: ^0.10.0
149 version: 0.10.0
150 '@iconify/vue':
151 specifier: ^4.3.0
131 - version: 4.3.0(vue@3.5.13(typescript@5.7.3))
152 + version: 4.3.0(vue@3.5.13(typescript@5.8.2))
153 '@tsconfig/node20':
154 specifier: ^20.1.4
155 version: 20.1.4
@@ -145,26 +166,26 @@ importers:
166 specifier: ^21.1.7
167 version: 21.1.7
168 '@types/lodash':
148 - specifier: ^4.17.15
149 - version: 4.17.15
169 + specifier: ^4.17.16
170 + version: 4.17.16
171 '@types/node':
151 - specifier: ^22.13.5
152 - version: 22.13.5
172 + specifier: ^22.13.9
173 + version: 22.13.9
174 '@types/validator':
175 specifier: ^13.12.2
176 version: 13.12.2
177 '@vitejs/plugin-vue':
178 specifier: ^5.2.1
158 - version: 5.2.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
179 + version: 5.2.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
180 '@vitejs/plugin-vue-jsx':
181 specifier: ^4.1.1
161 - version: 4.1.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
182 + version: 4.1.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
183 '@vue/test-utils':
184 specifier: ^2.4.6
185 version: 2.4.6
186 '@vue/tsconfig':
187 specifier: ^0.7.0
167 - version: 0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
188 + version: 0.7.0(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
189 autoprefixer:
190 specifier: ^10.4.20
191 version: 10.4.20(postcss@8.5.3)
@@ -193,11 +214,11 @@ importers:
214 specifier: ^8.5.3
215 version: 8.5.3
216 prettier:
196 - specifier: ^3.5.2
197 - version: 3.5.2
217 + specifier: ^3.5.3
218 + version: 3.5.3
219 prettier-plugin-tailwindcss:
220 specifier: ^0.6.11
200 - version: 0.6.11(prettier@3.5.2)
221 + version: 0.6.11(prettier@3.5.3)
222 sass:
223 specifier: ^1.85.1
224 version: 1.85.1
@@ -211,39 +232,39 @@ importers:
232 specifier: ^18.6.0
233 version: 18.6.0
234 type-fest:
214 - specifier: ^4.35.0
215 - version: 4.35.0
235 + specifier: ^4.37.0
236 + version: 4.37.0
237 typescript:
217 - specifier: ~5.7.3
218 - version: 5.7.3
238 + specifier: ~5.8.2
239 + version: 5.8.2
240 vite:
241 specifier: ^6.2.0
221 - version: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
242 + version: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
243 vite-bundle-visualizer:
244 specifier: ^1.2.1
224 - version: 1.2.1(rollup@4.34.8)
245 + version: 1.2.1(rollup@4.34.9)
246 vite-plugin-vue-devtools:
247 specifier: ^7.7.2
227 - version: 7.7.2(rollup@4.34.8)(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
248 + version: 7.7.2(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
249 vite-svg-loader:
250 specifier: ^5.1.0
230 - version: 5.1.0(vue@3.5.13(typescript@5.7.3))
251 + version: 5.1.0(vue@3.5.13(typescript@5.8.2))
252 vitest:
232 - specifier: ^3.0.7
233 - version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0)
253 + specifier: ^3.0.8
254 + version: 3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0)
255 vue-tsc:
235 - specifier: ^2.2.4
236 - version: 2.2.4(typescript@5.7.3)
256 + specifier: ^2.2.8
257 + version: 2.2.8(typescript@5.8.2)
258 optionalDependencies:
259 '@rollup/rollup-linux-x64-gnu':
260 specifier: ^4.34.8
240 - version: 4.34.8
261 + version: 4.34.9
262 treemate:
263 specifier: ^0.3.11
264 version: 0.3.11
265 vueuc:
266 specifier: ^0.4.64
246 - version: 0.4.64(vue@3.5.13(typescript@5.7.3))
267 + version: 0.4.64(vue@3.5.13(typescript@5.8.2))
268
269 packages:
270
@@ -258,8 +279,8 @@ packages:
279 resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
280 engines: {node: '>=6.0.0'}
281
261 - '@antfu/eslint-config@4.3.0':
262 - resolution: {integrity: sha512-x6jcUSkscXb63xEM8JekZlDALtsVETxSc19pu+DuEZjx4iv0J8gThRDMPsIolceTeSnyh9bfW4dlAGcfu2NLzg==}
282 + '@antfu/eslint-config@4.6.0':
283 + resolution: {integrity: sha512-uLfrbSQkIJZEiDWNVYaS0KENDecRujEos9LabmRvpCuZFGDcGkfTosZel3nnKjdc/2FX3bd6SSOdiaJuAKCw+Q==}
284 hasBin: true
285 peerDependencies:
286 '@eslint-react/eslint-plugin': ^1.19.0
@@ -314,8 +335,8 @@ packages:
335 '@antfu/utils@0.7.10':
336 resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
337
317 - '@antfu/utils@8.1.1':
318 - resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
338 + '@antfu/utils@9.1.0':
339 + resolution: {integrity: sha512-R+3bzxNN0ZscQg3ZVG7suqBTFP2dbdaCjKe5KY6hqNZimdyZ32KemotJPmoqQhKH28CqdgyXQGkWZlCGsGQmJw==}
340
341 '@asamuzakjp/css-color@2.8.3':
342 resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==}
@@ -466,6 +487,36 @@ packages:
487 '@clack/prompts@0.10.0':
488 resolution: {integrity: sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==}
489
490 + '@codemirror/autocomplete@6.18.6':
491 + resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==}
492 +
493 + '@codemirror/commands@6.8.0':
494 + resolution: {integrity: sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ==}
495 +
496 + '@codemirror/lang-javascript@6.2.3':
497 + resolution: {integrity: sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==}
498 +
499 + '@codemirror/lang-xml@6.1.0':
500 + resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==}
501 +
502 + '@codemirror/language@6.10.8':
503 + resolution: {integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==}
504 +
505 + '@codemirror/lint@6.8.4':
506 + resolution: {integrity: sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==}
507 +
508 + '@codemirror/search@6.5.10':
509 + resolution: {integrity: sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==}
510 +
511 + '@codemirror/state@6.5.2':
512 + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==}
513 +
514 + '@codemirror/theme-one-dark@6.1.2':
515 + resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==}
516 +
517 + '@codemirror/view@6.36.4':
518 + resolution: {integrity: sha512-ZQ0V5ovw/miKEXTvjgzRyjnrk9TwriUB1k4R5p7uNnHR9Hus+D1SXHGdJshijEzPFjU25xea/7nhIeSqYFKdbA==}
519 +
520 '@colors/colors@1.5.0':
521 resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
522 engines: {node: '>=0.1.90'}
@@ -508,8 +559,8 @@ packages:
559 resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
560 engines: {node: '>=18'}
561
511 - '@cypress/request@3.0.7':
512 - resolution: {integrity: sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==}
562 + '@cypress/request@3.0.8':
563 + resolution: {integrity: sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==}
564 engines: {node: '>= 6'}
565
566 '@cypress/xvfb@1.2.4':
@@ -738,14 +789,14 @@ packages:
789 peerDependencies:
790 vue: ^3.3.4
791
741 - '@fontsource/jetbrains-mono@5.1.2':
742 - resolution: {integrity: sha512-muYZK6W3NTrKpKTjoF2dkrtMjXLlPZhniLiLjMmfegRibl2L6jUJh9gB6UcbcZs3zHdIYTmzMkXNbNoI2kXX3Q==}
792 + '@fontsource/jetbrains-mono@5.2.5':
793 + resolution: {integrity: sha512-TPZ9b/uq38RMdrlZZkl0RwN8Ju9JxuqMETrw76pUQFbGtE1QbwQaNsLlnUrACNNBNbd0NZRXiJJSkC8ajPgbew==}
794
744 - '@fontsource/lexend@5.1.2':
745 - resolution: {integrity: sha512-ee4+mnk4Nu2C6QI78dO7zENRcVNE7oiLdaKm36/aI6tx4I/YNm69UJL2EYkwg8Pt0oQe7PPT2qXggvgRX8aruw==}
795 + '@fontsource/lexend@5.2.5':
796 + resolution: {integrity: sha512-Mv2XQ+B4ek2lNCGRW5ddLTW8T3xTT17AnCk1IETpoef57XHz+e42fUfLAYMrmiJLOGpR44qnyJ5S6D323A5EIw==}
797
747 - '@fontsource/public-sans@5.1.2':
748 - resolution: {integrity: sha512-VY/2N8hfhFgP/3lkk/WdGX27/0wp+ajX9/E4bb+O1BS5c+OUfJG7FChIqYRKZUe8n2jl8pOVjaB93PfyVQS9Hg==}
798 + '@fontsource/public-sans@5.2.5':
799 + resolution: {integrity: sha512-WSRBuKX8dwHxc35s/Q1arB7vkGL2A9YHB93gRP9OTu/nYgat0CBHfsAOUSDehBnREHa0rYZvWDDS08w5qPoWvg==}
800
801 '@hapi/hoek@9.3.0':
802 resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
@@ -818,6 +869,24 @@ packages:
869 '@juggle/resize-observer@3.4.0':
870 resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
871
872 + '@lezer/common@1.2.3':
873 + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==}
874 +
875 + '@lezer/highlight@1.2.1':
876 + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==}
877 +
878 + '@lezer/javascript@1.4.21':
879 + resolution: {integrity: sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==}
880 +
881 + '@lezer/lr@1.4.2':
882 + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
883 +
884 + '@lezer/xml@1.0.6':
885 + resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==}
886 +
887 + '@marijn/find-cluster-break@1.0.2':
888 + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
889 +
890 '@nodelib/fs.scandir@2.1.5':
891 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
892 engines: {node: '>= 8'}
@@ -930,6 +999,10 @@ packages:
999 '@polka/url@1.0.0-next.28':
1000 resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
1001
1002 + '@quansync/fs@0.1.1':
1003 + resolution: {integrity: sha512-sx8J1O/+j2lqs8MvsEz6rs/6UAUpCb4fu7C6EqtMqzbS3CmqLkTDTOMK+DrWukvyUuHzl8DhMjfNJzQDTqfGJg==}
1004 + engines: {node: '>=20.18.0'}
1005 +
1006 '@rollup/pluginutils@5.1.4':
1007 resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
1008 engines: {node: '>=14.0.0'}
@@ -939,98 +1012,98 @@ packages:
1012 rollup:
1013 optional: true
1014
942 - '@rollup/rollup-android-arm-eabi@4.34.8':
943 - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==}
1015 + '@rollup/rollup-android-arm-eabi@4.34.9':
1016 + resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==}
1017 cpu: [arm]
1018 os: [android]
1019
947 - '@rollup/rollup-android-arm64@4.34.8':
948 - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==}
1020 + '@rollup/rollup-android-arm64@4.34.9':
1021 + resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==}
1022 cpu: [arm64]
1023 os: [android]
1024
952 - '@rollup/rollup-darwin-arm64@4.34.8':
953 - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==}
1025 + '@rollup/rollup-darwin-arm64@4.34.9':
1026 + resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==}
1027 cpu: [arm64]
1028 os: [darwin]
1029
957 - '@rollup/rollup-darwin-x64@4.34.8':
958 - resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==}
1030 + '@rollup/rollup-darwin-x64@4.34.9':
1031 + resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==}
1032 cpu: [x64]
1033 os: [darwin]
1034
962 - '@rollup/rollup-freebsd-arm64@4.34.8':
963 - resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==}
1035 + '@rollup/rollup-freebsd-arm64@4.34.9':
1036 + resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==}
1037 cpu: [arm64]
1038 os: [freebsd]
1039
967 - '@rollup/rollup-freebsd-x64@4.34.8':
968 - resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==}
1040 + '@rollup/rollup-freebsd-x64@4.34.9':
1041 + resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==}
1042 cpu: [x64]
1043 os: [freebsd]
1044
972 - '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
973 - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==}
1045 + '@rollup/rollup-linux-arm-gnueabihf@4.34.9':
1046 + resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==}
1047 cpu: [arm]
1048 os: [linux]
1049
977 - '@rollup/rollup-linux-arm-musleabihf@4.34.8':
978 - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==}
1050 + '@rollup/rollup-linux-arm-musleabihf@4.34.9':
1051 + resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==}
1052 cpu: [arm]
1053 os: [linux]
1054
982 - '@rollup/rollup-linux-arm64-gnu@4.34.8':
983 - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==}
1055 + '@rollup/rollup-linux-arm64-gnu@4.34.9':
1056 + resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==}
1057 cpu: [arm64]
1058 os: [linux]
1059
987 - '@rollup/rollup-linux-arm64-musl@4.34.8':
988 - resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==}
1060 + '@rollup/rollup-linux-arm64-musl@4.34.9':
1061 + resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==}
1062 cpu: [arm64]
1063 os: [linux]
1064
992 - '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
993 - resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==}
1065 + '@rollup/rollup-linux-loongarch64-gnu@4.34.9':
1066 + resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==}
1067 cpu: [loong64]
1068 os: [linux]
1069
997 - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
998 - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==}
1070 + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9':
1071 + resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==}
1072 cpu: [ppc64]
1073 os: [linux]
1074
1002 - '@rollup/rollup-linux-riscv64-gnu@4.34.8':
1003 - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==}
1075 + '@rollup/rollup-linux-riscv64-gnu@4.34.9':
1076 + resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==}
1077 cpu: [riscv64]
1078 os: [linux]
1079
1007 - '@rollup/rollup-linux-s390x-gnu@4.34.8':
1008 - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==}
1080 + '@rollup/rollup-linux-s390x-gnu@4.34.9':
1081 + resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==}
1082 cpu: [s390x]
1083 os: [linux]
1084
1012 - '@rollup/rollup-linux-x64-gnu@4.34.8':
1013 - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==}
1085 + '@rollup/rollup-linux-x64-gnu@4.34.9':
1086 + resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==}
1087 cpu: [x64]
1088 os: [linux]
1089
1017 - '@rollup/rollup-linux-x64-musl@4.34.8':
1018 - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==}
1090 + '@rollup/rollup-linux-x64-musl@4.34.9':
1091 + resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==}
1092 cpu: [x64]
1093 os: [linux]
1094
1022 - '@rollup/rollup-win32-arm64-msvc@4.34.8':
1023 - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==}
1095 + '@rollup/rollup-win32-arm64-msvc@4.34.9':
1096 + resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==}
1097 cpu: [arm64]
1098 os: [win32]
1099
1027 - '@rollup/rollup-win32-ia32-msvc@4.34.8':
1028 - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==}
1100 + '@rollup/rollup-win32-ia32-msvc@4.34.9':
1101 + resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==}
1102 cpu: [ia32]
1103 os: [win32]
1104
1032 - '@rollup/rollup-win32-x64-msvc@4.34.8':
1033 - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==}
1105 + '@rollup/rollup-win32-x64-msvc@4.34.9':
1106 + resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==}
1107 cpu: [x64]
1108 os: [win32]
1109
@@ -1083,8 +1156,8 @@ packages:
1156 resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
1157 engines: {node: '>=18'}
1158
1086 - '@stylistic/eslint-plugin@4.1.0':
1087 - resolution: {integrity: sha512-bytbL7qiici7yPyEiId0fGPK9kjQbzcPMj2aftPfzTCyJ/CRSKdtI+iVjM0LSGzGxfunflI+MDDU9vyIIeIpoQ==}
1159 + '@stylistic/eslint-plugin@4.2.0':
1160 + resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==}
1161 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1162 peerDependencies:
1163 eslint: '>=9.0.0'
@@ -1165,8 +1238,8 @@ packages:
1238 '@types/lodash-es@4.17.12':
1239 resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
1240
1168 - '@types/lodash@4.17.15':
1169 - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==}
1241 + '@types/lodash@4.17.16':
1242 + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
1243
1244 '@types/mdast@4.0.4':
1245 resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
@@ -1177,8 +1250,8 @@ packages:
1250 '@types/ms@2.1.0':
1251 resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
1252
1180 - '@types/node@22.13.5':
1181 - resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==}
1253 + '@types/node@22.13.9':
1254 + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==}
1255
1256 '@types/normalize-package-data@2.4.4':
1257 resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -1201,57 +1274,57 @@ packages:
1274 '@types/validator@13.12.2':
1275 resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==}
1276
1204 - '@types/web-bluetooth@0.0.20':
1205 - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
1277 + '@types/web-bluetooth@0.0.21':
1278 + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
1279
1280 '@types/yauzl@2.10.3':
1281 resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
1282
1210 - '@typescript-eslint/eslint-plugin@8.25.0':
1211 - resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==}
1283 + '@typescript-eslint/eslint-plugin@8.26.0':
1284 + resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==}
1285 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1286 peerDependencies:
1287 '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
1288 eslint: ^8.57.0 || ^9.0.0
1216 - typescript: '>=4.8.4 <5.8.0'
1289 + typescript: '>=4.8.4 <5.9.0'
1290
1218 - '@typescript-eslint/parser@8.25.0':
1219 - resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==}
1291 + '@typescript-eslint/parser@8.26.0':
1292 + resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==}
1293 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1294 peerDependencies:
1295 eslint: ^8.57.0 || ^9.0.0
1223 - typescript: '>=4.8.4 <5.8.0'
1296 + typescript: '>=4.8.4 <5.9.0'
1297
1225 - '@typescript-eslint/scope-manager@8.25.0':
1226 - resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==}
1298 + '@typescript-eslint/scope-manager@8.26.0':
1299 + resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==}
1300 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1301
1229 - '@typescript-eslint/type-utils@8.25.0':
1230 - resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==}
1302 + '@typescript-eslint/type-utils@8.26.0':
1303 + resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==}
1304 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1305 peerDependencies:
1306 eslint: ^8.57.0 || ^9.0.0
1234 - typescript: '>=4.8.4 <5.8.0'
1307 + typescript: '>=4.8.4 <5.9.0'
1308
1236 - '@typescript-eslint/types@8.25.0':
1237 - resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==}
1309 + '@typescript-eslint/types@8.26.0':
1310 + resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==}
1311 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1312
1240 - '@typescript-eslint/typescript-estree@8.25.0':
1241 - resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==}
1313 + '@typescript-eslint/typescript-estree@8.26.0':
1314 + resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==}
1315 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1316 peerDependencies:
1244 - typescript: '>=4.8.4 <5.8.0'
1317 + typescript: '>=4.8.4 <5.9.0'
1318
1246 - '@typescript-eslint/utils@8.25.0':
1247 - resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==}
1319 + '@typescript-eslint/utils@8.26.0':
1320 + resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==}
1321 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1322 peerDependencies:
1323 eslint: ^8.57.0 || ^9.0.0
1251 - typescript: '>=4.8.4 <5.8.0'
1324 + typescript: '>=4.8.4 <5.9.0'
1325
1253 - '@typescript-eslint/visitor-keys@8.25.0':
1254 - resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==}
1326 + '@typescript-eslint/visitor-keys@8.26.0':
1327 + resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==}
1328 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1329
1330 '@ungap/structured-clone@1.3.0':
@@ -1271,8 +1344,8 @@ packages:
1344 vite: ^5.0.0 || ^6.0.0
1345 vue: ^3.2.25
1346
1274 - '@vitest/eslint-plugin@1.1.35':
1275 - resolution: {integrity: sha512-FnoZ0LXf/3pfK/oZqaO/hDfp1EoLgZ0t+GC3+Qrjbc/nXw3AX90Vox2FLMyN0eaiHWuDLADmIzTsYsppDDTjXA==}
1347 + '@vitest/eslint-plugin@1.1.36':
1348 + resolution: {integrity: sha512-IjBV/fcL9NJRxGw221ieaDsqKqj8qUo7rvSupDxMjTXyhsCusHC6M+jFUNqBp4PCkYFcf5bjrKxeZoCEWoPxig==}
1349 peerDependencies:
1350 '@typescript-eslint/utils': ^8.24.0
1351 eslint: '>= 8.57.0'
@@ -1284,11 +1357,11 @@ packages:
1357 vitest:
1358 optional: true
1359
1287 - '@vitest/expect@3.0.7':
1288 - resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==}
1360 + '@vitest/expect@3.0.8':
1361 + resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==}
1362
1290 - '@vitest/mocker@3.0.7':
1291 - resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==}
1363 + '@vitest/mocker@3.0.8':
1364 + resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==}
1365 peerDependencies:
1366 msw: ^2.4.9
1367 vite: ^5.0.0 || ^6.0.0
@@ -1298,20 +1371,20 @@ packages:
1371 vite:
1372 optional: true
1373
1301 - '@vitest/pretty-format@3.0.7':
1302 - resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==}
1374 + '@vitest/pretty-format@3.0.8':
1375 + resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==}
1376
1304 - '@vitest/runner@3.0.7':
1305 - resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==}
1377 + '@vitest/runner@3.0.8':
1378 + resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==}
1379
1307 - '@vitest/snapshot@3.0.7':
1308 - resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==}
1380 + '@vitest/snapshot@3.0.8':
1381 + resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==}
1382
1310 - '@vitest/spy@3.0.7':
1311 - resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==}
1383 + '@vitest/spy@3.0.8':
1384 + resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==}
1385
1313 - '@vitest/utils@3.0.7':
1314 - resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==}
1386 + '@vitest/utils@3.0.8':
1387 + resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==}
1388
1389 '@volar/language-core@2.4.11':
1390 resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==}
@@ -1322,19 +1395,19 @@ packages:
1395 '@volar/typescript@2.4.11':
1396 resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==}
1397
1325 - '@vue/babel-helper-vue-transform-on@1.2.5':
1326 - resolution: {integrity: sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==}
1398 + '@vue/babel-helper-vue-transform-on@1.3.0':
1399 + resolution: {integrity: sha512-vrNyYNQcz1gfc87uuN+Z+On9fFOBQTYRlTUEDovpeCmjuwH83lAm6YM0VBvTx6eRTHg3SU5jP2CD+kSXY30PGg==}
1400
1328 - '@vue/babel-plugin-jsx@1.2.5':
1329 - resolution: {integrity: sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==}
1401 + '@vue/babel-plugin-jsx@1.3.0':
1402 + resolution: {integrity: sha512-ODZSs93FCxLMOiMFAGJXe7QMJp1tk8hkMbk84OcHOTVwYU2cFwFu1z7jjrRv44wCCfPNkflqn6hnexVprb+G7A==}
1403 peerDependencies:
1404 '@babel/core': ^7.0.0-0
1405 peerDependenciesMeta:
1406 '@babel/core':
1407 optional: true
1408
1336 - '@vue/babel-plugin-resolve-type@1.2.5':
1337 - resolution: {integrity: sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==}
1409 + '@vue/babel-plugin-resolve-type@1.3.0':
1410 + resolution: {integrity: sha512-3SmusE11QKNKtnVfbsKegUEArpf1fXE85Dzi/Q6lvaz3MA3tmL8BXyq/vA7GJeZ183XeNpLIZHrHDdUh9V348A==}
1411 peerDependencies:
1412 '@babel/core': ^7.0.0-0
1413
@@ -1370,8 +1443,8 @@ packages:
1443 '@vue/devtools-shared@7.7.2':
1444 resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==}
1445
1373 - '@vue/language-core@2.2.4':
1374 - resolution: {integrity: sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==}
1446 + '@vue/language-core@2.2.8':
1447 + resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==}
1448 peerDependencies:
1449 typescript: '*'
1450 peerDependenciesMeta:
@@ -1409,21 +1482,21 @@ packages:
1482 vue:
1483 optional: true
1484
1412 - '@vueuse/core@12.7.0':
1413 - resolution: {integrity: sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==}
1485 + '@vueuse/core@12.8.2':
1486 + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==}
1487
1415 - '@vueuse/metadata@12.7.0':
1416 - resolution: {integrity: sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==}
1488 + '@vueuse/metadata@12.8.2':
1489 + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==}
1490
1418 - '@vueuse/shared@12.7.0':
1419 - resolution: {integrity: sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==}
1491 + '@vueuse/shared@12.8.2':
1492 + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==}
1493
1494 '@yr/monotone-cubic-spline@1.0.3':
1495 resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==}
1496
1424 - abbrev@3.0.0:
1425 - resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==}
1426 - engines: {node: ^18.17.0 || >=20.5.0}
1497 + abbrev@2.0.0:
1498 + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
1499 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
1500
1501 acorn-jsx@5.3.2:
1502 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
@@ -1473,8 +1546,8 @@ packages:
1546 resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
1547 engines: {node: '>=12'}
1548
1476 - ansis@3.16.0:
1477 - resolution: {integrity: sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA==}
1549 + ansis@3.17.0:
1550 + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==}
1551 engines: {node: '>=14'}
1552
1553 any-promise@1.3.0:
@@ -1637,8 +1710,8 @@ packages:
1710 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1711 engines: {node: '>= 0.4'}
1712
1640 - call-bound@1.0.3:
1641 - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
1713 + call-bound@1.0.4:
1714 + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
1715 engines: {node: '>= 0.4'}
1716
1717 callsite@1.0.0:
@@ -1656,8 +1729,8 @@ packages:
1729 resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
1730 engines: {node: '>=10'}
1731
1659 - caniuse-lite@1.0.30001701:
1660 - resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==}
1732 + caniuse-lite@1.0.30001702:
1733 + resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==}
1734
1735 caseless@0.12.0:
1736 resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -1739,6 +1812,9 @@ packages:
1812 resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
1813 engines: {node: '>=12'}
1814
1815 + codemirror@6.0.1:
1816 + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
1817 +
1818 color-convert@2.0.1:
1819 resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1820 engines: {node: '>=7.0.0'}
@@ -1789,6 +1865,9 @@ packages:
1865 confbox@0.1.8:
1866 resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
1867
1868 + confbox@0.2.1:
1869 + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==}
1870 +
1871 config-chain@1.1.13:
1872 resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
1873
@@ -1803,8 +1882,8 @@ packages:
1882 resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
1883 engines: {node: '>=12.13'}
1884
1806 - core-js-compat@3.40.0:
1807 - resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==}
1885 + core-js-compat@3.41.0:
1886 + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
1887
1888 core-util-is@1.0.2:
1889 resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
@@ -1813,6 +1892,9 @@ packages:
1892 resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
1893 engines: {node: '>=10'}
1894
1895 + crelt@1.0.6:
1896 + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
1897 +
1898 cross-spawn@7.0.6:
1899 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
1900 engines: {node: '>= 8'}
@@ -2024,8 +2106,8 @@ packages:
2106 engines: {node: '>=14'}
2107 hasBin: true
2108
2027 - electron-to-chromium@1.5.107:
2028 - resolution: {integrity: sha512-dJr1o6yCntRkXElnhsHh1bAV19bo/hKyFf7tCcWgpXbuFIF0Lakjgqv5LRfSDaNzAII8Fnxg2tqgHkgCvxdbxw==}
2109 + electron-to-chromium@1.5.112:
2110 + resolution: {integrity: sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==}
2111
2112 emoji-regex-xs@1.0.0:
2113 resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
@@ -2170,8 +2252,8 @@ packages:
2252 peerDependencies:
2253 eslint: '>=6.0.0'
2254
2173 - eslint-plugin-n@17.15.1:
2174 - resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==}
2255 + eslint-plugin-n@17.16.2:
2256 + resolution: {integrity: sha512-iQM5Oj+9o0KaeLoObJC/uxNGpktZCkYiTTBo8PkRWq3HwNcRxwpvSDFjBhQ5+HLJzBTy+CLDC5+bw0Z5GyhlOQ==}
2257 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2258 peerDependencies:
2259 eslint: '>=8.23.0'
@@ -2186,6 +2268,11 @@ packages:
2268 peerDependencies:
2269 eslint: '>=8.0.0'
2270
2271 + eslint-plugin-pnpm-catalogs@0.1.0:
2272 + resolution: {integrity: sha512-4FzIfTfr06U3ULStgSMSmpDsfhtxsbSAxKLvXLo+/i/z48v4+4WD0Yr5hTb6E37X/ch8isKiTl4bnnvSENTYFA==}
2273 + peerDependencies:
2274 + eslint: ^9.0.0
2275 +
2276 eslint-plugin-regexp@2.7.0:
2277 resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==}
2278 engines: {node: ^18 || >=20}
@@ -2213,11 +2300,12 @@ packages:
2300 '@typescript-eslint/eslint-plugin':
2301 optional: true
2302
2216 - eslint-plugin-vue@9.32.0:
2217 - resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==}
2218 - engines: {node: ^14.17.0 || >=16.0.0}
2303 + eslint-plugin-vue@10.0.0:
2304 + resolution: {integrity: sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==}
2305 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
2306 peerDependencies:
2220 - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
2307 + eslint: ^8.57.0 || ^9.0.0
2308 + vue-eslint-parser: ^10.0.0
2309
2310 eslint-plugin-yml@1.17.0:
2311 resolution: {integrity: sha512-Q3LXFRnNpGYAK/PM0BY1Xs0IY1xTLfM0kC986nNQkx1l8tOGz+YS50N6wXkAJkrBpeUN9OxEMB7QJ+9MTDAqIQ==}
@@ -2231,10 +2319,6 @@ packages:
2319 '@vue/compiler-sfc': ^3.3.0
2320 eslint: '>=9.0.0'
2321
2234 - eslint-scope@7.2.2:
2235 - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
2236 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
2237 -
2322 eslint-scope@8.2.0:
2323 resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
2324 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2321,10 +2405,13 @@ packages:
2405 resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
2406 engines: {node: '>=0.10.0'}
2407
2324 - expect-type@1.1.0:
2325 - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
2408 + expect-type@1.2.0:
2409 + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==}
2410 engines: {node: '>=12.0.0'}
2411
2412 + exsolve@1.0.1:
2413 + resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==}
2414 +
2415 extend@3.0.2:
2416 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
2417
@@ -2383,8 +2470,8 @@ packages:
2470 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
2471 engines: {node: '>=8'}
2472
2386 - find-up-simple@1.0.0:
2387 - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==}
2473 + find-up-simple@1.0.1:
2474 + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==}
2475 engines: {node: '>=18'}
2476
2477 find-up@5.0.0:
@@ -2521,10 +2608,6 @@ packages:
2608 resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
2609 engines: {node: '>=4'}
2610
2524 - globals@13.24.0:
2525 - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
2526 - engines: {node: '>=8'}
2527 -
2611 globals@14.0.0:
2612 resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
2613 engines: {node: '>=18'}
@@ -2533,6 +2616,10 @@ packages:
2616 resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
2617 engines: {node: '>=18'}
2618
2619 + globals@16.0.0:
2620 + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
2621 + engines: {node: '>=18'}
2622 +
2623 globby@14.1.0:
2624 resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==}
2625 engines: {node: '>=18'}
@@ -2598,10 +2685,6 @@ packages:
2685 html-entities@2.5.2:
2686 resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==}
2687
2601 - html-tags@3.3.1:
2602 - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
2603 - engines: {node: '>=8'}
2604 -
2688 html-void-elements@3.0.0:
2689 resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
2690
@@ -2804,8 +2887,8 @@ packages:
2887 jose@6.0.8:
2888 resolution: {integrity: sha512-EyUPtOKyTYq+iMOszO42eobQllaIjJnwkZ2U93aJzNyPibCy7CEvT9UQnaCVB51IAd49gbNdCew1c0LcLTCB2g==}
2889
2807 - js-beautify@1.15.3:
2808 - resolution: {integrity: sha512-rKKGuyTxGNlyN4EQKWzNndzXpi0bOl8Gl8YQAW1as/oMz0XhD6sHJO1hTvoBDOSzKuJb9WkwoAb34FfdkKMv2A==}
2890 + js-beautify@1.15.4:
2891 + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
2892 engines: {node: '>=14'}
2893 hasBin: true
2894
@@ -2934,8 +3017,8 @@ packages:
3017 enquirer:
3018 optional: true
3019
2937 - local-pkg@1.0.0:
2938 - resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==}
3020 + local-pkg@1.1.1:
3021 + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
3022 engines: {node: '>=14'}
3023
3024 locate-path@6.0.0:
@@ -3051,8 +3134,8 @@ packages:
3134 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
3135 engines: {node: '>= 8'}
3136
3054 - micromark-core-commonmark@2.0.2:
3055 - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==}
3137 + micromark-core-commonmark@2.0.3:
3138 + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
3139
3140 micromark-extension-gfm-autolink-literal@2.1.0:
3141 resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
@@ -3123,17 +3206,17 @@ packages:
3206 micromark-util-sanitize-uri@2.0.1:
3207 resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
3208
3126 - micromark-util-subtokenize@2.0.4:
3127 - resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==}
3209 + micromark-util-subtokenize@2.1.0:
3210 + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
3211
3212 micromark-util-symbol@2.0.1:
3213 resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
3214
3132 - micromark-util-types@2.0.1:
3133 - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==}
3215 + micromark-util-types@2.0.2:
3216 + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
3217
3135 - micromark@4.0.1:
3136 - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==}
3218 + micromark@4.0.2:
3219 + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
3220
3221 micromatch@4.0.8:
3222 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
@@ -3248,9 +3331,9 @@ packages:
3331 node-releases@2.0.19:
3332 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
3333
3251 - nopt@8.1.0:
3252 - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
3253 - engines: {node: ^18.17.0 || >=20.5.0}
3334 + nopt@7.2.1:
3335 + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
3336 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
3337 hasBin: true
3338
3339 normalize-package-data@6.0.2:
@@ -3285,8 +3368,8 @@ packages:
3368 nth-check@2.1.1:
3369 resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
3370
3288 - nwsapi@2.2.16:
3289 - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==}
3371 + nwsapi@2.2.18:
3372 + resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==}
3373
3374 nypm@0.5.4:
3375 resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==}
@@ -3308,11 +3391,11 @@ packages:
3391 ofetch@1.4.1:
3392 resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
3393
3311 - ohash@1.1.4:
3312 - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
3394 + ohash@1.1.6:
3395 + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==}
3396
3314 - ohash@2.0.5:
3315 - resolution: {integrity: sha512-3k3APZwRRPYyohdIDmPTpe5i0AY5lm7gvu/Oip7tZrTaEGfSlKX+7kXUoWLd9sHX0GDRVwVvlW18yEcD7qS1zw==}
3397 + ohash@2.0.11:
3398 + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
3399
3400 once@1.4.0:
3401 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@@ -3354,8 +3437,8 @@ packages:
3437 package-json-from-dist@1.0.1:
3438 resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
3439
3357 - package-manager-detector@0.2.9:
3358 - resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==}
3440 + package-manager-detector@0.2.11:
3441 + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
3442
3443 parent-module@1.0.1:
3444 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
@@ -3488,6 +3571,9 @@ packages:
3571 pkg-types@1.3.1:
3572 resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
3573
3574 + pkg-types@2.1.0:
3575 + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
3576 +
3577 please-upgrade-node@3.2.0:
3578 resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==}
3579
@@ -3495,6 +3581,9 @@ packages:
3581 resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
3582 engines: {node: '>=4'}
3583
3584 + pnpm-catalogs-utils@0.1.0:
3585 + resolution: {integrity: sha512-avysWJc452htYTnae14ENYTI3fSzZ1U1xNrdSJ2kFgwDaDvdEKIM5Iu+WljP2cdr/HAKKQ1hnuvu3sQJ3Eq/zQ==}
3586 +
3587 postcss-import@15.1.0:
3588 resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
3589 engines: {node: '>=14.0.0'}
@@ -3595,8 +3684,8 @@ packages:
3684 prettier-plugin-svelte:
3685 optional: true
3686
3598 - prettier@3.5.2:
3599 - resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==}
3687 + prettier@3.5.3:
3688 + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
3689 engines: {node: '>=14'}
3690 hasBin: true
3691
@@ -3640,10 +3729,13 @@ packages:
3729 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
3730 engines: {node: '>=6'}
3731
3643 - qs@6.13.1:
3644 - resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==}
3732 + qs@6.14.0:
3733 + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
3734 engines: {node: '>=0.6'}
3735
3736 + quansync@0.2.8:
3737 + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==}
3738 +
3739 queue-microtask@1.2.3:
3740 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
3741
@@ -3752,8 +3844,8 @@ packages:
3844 rollup:
3845 optional: true
3846
3755 - rollup@4.34.8:
3756 - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==}
3847 + rollup@4.34.9:
3848 + resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==}
3849 engines: {node: '>=18.0.0', npm: '>=8.0.0'}
3850 hasBin: true
3851
@@ -3929,8 +4021,8 @@ packages:
4021 engines: {node: '>=16'}
4022 hasBin: true
4023
3932 - std-env@3.8.0:
3933 - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
4024 + std-env@3.8.1:
4025 + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
4026
4027 stream-combiner@0.0.4:
4028 resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
@@ -3973,6 +4065,9 @@ packages:
4065 strip-literal@3.0.0:
4066 resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
4067
4068 + style-mod@4.1.2:
4069 + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
4070 +
4071 sucrase@3.35.0:
4072 resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
4073 engines: {node: '>=16 || 14 >=14.17'}
@@ -3994,9 +4089,6 @@ packages:
4089 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
4090 engines: {node: '>= 0.4'}
4091
3997 - svg-tags@1.0.0:
3998 - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
3999 -
4092 svgo@3.3.2:
4093 resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
4094 engines: {node: '>=14.0.0'}
@@ -4030,6 +4122,13 @@ packages:
4122 resolution: {integrity: sha512-VfAQzvSRFLbKpNon1aUx982P0Z7znNuaRJDFEcIjnyT3ly8+aFUVGGWKCm3KIZ/h9eqCV9aoZPjiFUojqYe1pw==}
4123 hasBin: true
4124
4125 + thememirror@2.0.1:
4126 + resolution: {integrity: sha512-d5i6FVvWWPkwrm4cHLI3t9AT1OrkAt7Ig8dtdYSofgF7C/eiyNuq6zQzSTusWTde3jpW9WLvA9J/fzNKMUsd0w==}
4127 + peerDependencies:
4128 + '@codemirror/language': ^6.0.0
4129 + '@codemirror/state': ^6.0.0
4130 + '@codemirror/view': ^6.0.0
4131 +
4132 thenify-all@1.6.0:
4133 resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
4134 engines: {node: '>=0.8'}
@@ -4065,11 +4164,11 @@ packages:
4164 resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
4165 engines: {node: '>=14.0.0'}
4166
4068 - tldts-core@6.1.78:
4069 - resolution: {integrity: sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw==}
4167 + tldts-core@6.1.82:
4168 + resolution: {integrity: sha512-Jabl32m21tt/d/PbDO88R43F8aY98Piiz6BVH9ShUlOAiiAELhEqwrAmBocjAqnCfoUeIsRU+h3IEzZd318F3w==}
4169
4071 - tldts@6.1.78:
4072 - resolution: {integrity: sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==}
4170 + tldts@6.1.82:
4171 + resolution: {integrity: sha512-KCTjNL9F7j8MzxgfTgjT+v21oYH38OidFty7dH00maWANAI2IsLw2AnThtTJi9HKALHZKQQWnNebYheadacD+g==}
4172 hasBin: true
4173
4174 tmp@0.2.3:
@@ -4088,8 +4187,8 @@ packages:
4187 resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
4188 engines: {node: '>=6'}
4189
4091 - tough-cookie@5.1.1:
4092 - resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==}
4190 + tough-cookie@5.1.2:
4191 + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
4192 engines: {node: '>=16'}
4193
4194 tr46@5.0.0:
@@ -4131,20 +4230,16 @@ packages:
4230 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
4231 engines: {node: '>= 0.8.0'}
4232
4134 - type-fest@0.20.2:
4135 - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
4136 - engines: {node: '>=10'}
4137 -
4233 type-fest@0.21.3:
4234 resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
4235 engines: {node: '>=10'}
4236
4142 - type-fest@4.35.0:
4143 - resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==}
4237 + type-fest@4.37.0:
4238 + resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==}
4239 engines: {node: '>=16'}
4240
4146 - typescript@5.7.3:
4147 - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
4241 + typescript@5.8.2:
4242 + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
4243 engines: {node: '>=14.17'}
4244 hasBin: true
4245
@@ -4154,8 +4249,8 @@ packages:
4249 ufo@1.5.4:
4250 resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
4251
4157 - unconfig@7.1.0:
4158 - resolution: {integrity: sha512-4rNuVn7UJXvRCPFk4CT/VfoCEh9VTtohLAmPzMkSKjAnesnsSDsIKt0kso8sSeZji2Js31iOWQhY6R8pFP6UVQ==}
4252 + unconfig@7.3.0:
4253 + resolution: {integrity: sha512-UWYFZinVx2ZRE5Dzp2kI4xBkNC//veYakve1BeaAa7CNrf9TckEKlBiFUSrHOuoEDgu1URhNy219ZXsprIrvjQ==}
4254
4255 unctx@2.4.1:
4256 resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==}
@@ -4258,8 +4353,8 @@ packages:
4353 peerDependencies:
4354 vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
4355
4261 - vite-node@3.0.7:
4262 - resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==}
4356 + vite-node@3.0.8:
4357 + resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==}
4358 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
4359 hasBin: true
4360
@@ -4329,16 +4424,16 @@ packages:
4424 yaml:
4425 optional: true
4426
4332 - vitest@3.0.7:
4333 - resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==}
4427 + vitest@3.0.8:
4428 + resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==}
4429 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
4430 hasBin: true
4431 peerDependencies:
4432 '@edge-runtime/vm': '*'
4433 '@types/debug': ^4.1.12
4434 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
4340 - '@vitest/browser': 3.0.7
4341 - '@vitest/ui': 3.0.7
4435 + '@vitest/browser': 3.0.8
4436 + '@vitest/ui': 3.0.8
4437 happy-dom: '*'
4438 jsdom: '*'
4439 peerDependenciesMeta:
@@ -4371,14 +4466,20 @@ packages:
4466 peerDependencies:
4467 vue: ^3.0.0
4468
4374 - vue-component-type-helpers@2.2.4:
4375 - resolution: {integrity: sha512-F66p0XLbAu92BRz6kakHyAcaUSF7HWpWX/THCqL0TxySSj7z/nok5UUMohfNkkCm1pZtawsdzoJ4p1cjNqCx0Q==}
4469 + vue-codemirror@6.1.1:
4470 + resolution: {integrity: sha512-rTAYo44owd282yVxKtJtnOi7ERAcXTeviwoPXjIc6K/IQYUsoDkzPvw/JDFtSP6T7Cz/2g3EHaEyeyaQCKoDMg==}
4471 + peerDependencies:
4472 + codemirror: 6.x
4473 + vue: 3.x
4474
4377 - vue-eslint-parser@9.4.3:
4378 - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
4379 - engines: {node: ^14.17.0 || >=16.0.0}
4475 + vue-component-type-helpers@2.2.8:
4476 + resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==}
4477 +
4478 + vue-eslint-parser@10.1.1:
4479 + resolution: {integrity: sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q==}
4480 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
4481 peerDependencies:
4381 - eslint: '>=6.0.0'
4482 + eslint: ^8.57.0 || ^9.0.0
4483
4484 vue-highlight-words@3.0.1:
4485 resolution: {integrity: sha512-t6L0+KRaMzX5RVubWl6Sog+Aa+U0kHsbUlDIrln1VfajR2SEg+zQYfXov8UmX3MLNOfd6cv7MCM6LclqNlW4ww==}
@@ -4401,8 +4502,8 @@ packages:
4502 peerDependencies:
4503 vue: ^3.3.4
4504
4404 - vue-tsc@2.2.4:
4405 - resolution: {integrity: sha512-3EVHlxtpMXcb5bCaK7QDFTbEkMusDfVk0HVRrkv5hEb+Clpu9a96lKUXJAeD/akRlkoA4H8MCHgBDN19S6FnzA==}
4505 + vue-tsc@2.2.8:
4506 + resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==}
4507 hasBin: true
4508 peerDependencies:
4509 typescript: '>=5.0.0'
@@ -4437,6 +4538,9 @@ packages:
4538 peerDependencies:
4539 vue: ^3.0.11
4540
4541 + w3c-keyname@2.2.8:
4542 + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
4543 +
4544 w3c-xmlserializer@5.0.0:
4545 resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
4546 engines: {node: '>=18'}
@@ -4536,8 +4640,8 @@ packages:
4640 yallist@4.0.0:
4641 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
4642
4539 - yaml-eslint-parser@1.2.3:
4540 - resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==}
4643 + yaml-eslint-parser@1.3.0:
4644 + resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==}
4645 engines: {node: ^14.17.0 || >=16.0.0}
4646
4647 yaml@1.10.2:
@@ -4595,17 +4699,17 @@ snapshots:
4699 '@jridgewell/gen-mapping': 0.3.8
4700 '@jridgewell/trace-mapping': 0.3.25
4701
4598 - '@antfu/eslint-config@4.3.0(@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))':
4702 + '@antfu/eslint-config@4.6.0(@typescript-eslint/utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(@vue/compiler-sfc@3.5.13)(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))':
4703 dependencies:
4704 '@antfu/install-pkg': 1.0.0
4705 '@clack/prompts': 0.10.0
4706 '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.21.0(jiti@2.4.2))
4707 '@eslint/markdown': 6.2.2
4604 - '@stylistic/eslint-plugin': 4.1.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
4605 - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
4606 - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
4607 - '@vitest/eslint-plugin': 1.1.35(@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))
4608 - ansis: 3.16.0
4708 + '@stylistic/eslint-plugin': 4.2.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
4709 + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
4710 + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
4711 + '@vitest/eslint-plugin': 1.1.36(@typescript-eslint/utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))
4712 + ansis: 3.17.0
4713 cac: 6.7.14
4714 eslint: 9.21.0(jiti@2.4.2)
4715 eslint-config-flat-gitignore: 2.1.0(eslint@9.21.0(jiti@2.4.2))
@@ -4613,26 +4717,27 @@ snapshots:
4717 eslint-merge-processors: 2.0.0(eslint@9.21.0(jiti@2.4.2))
4718 eslint-plugin-antfu: 3.1.0(eslint@9.21.0(jiti@2.4.2))
4719 eslint-plugin-command: 3.1.0(eslint@9.21.0(jiti@2.4.2))
4616 - eslint-plugin-import-x: 4.6.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
4720 + eslint-plugin-import-x: 4.6.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
4721 eslint-plugin-jsdoc: 50.6.3(eslint@9.21.0(jiti@2.4.2))
4722 eslint-plugin-jsonc: 2.19.1(eslint@9.21.0(jiti@2.4.2))
4619 - eslint-plugin-n: 17.15.1(eslint@9.21.0(jiti@2.4.2))
4723 + eslint-plugin-n: 17.16.2(eslint@9.21.0(jiti@2.4.2))
4724 eslint-plugin-no-only-tests: 3.3.0
4621 - eslint-plugin-perfectionist: 4.9.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
4725 + eslint-plugin-perfectionist: 4.9.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
4726 + eslint-plugin-pnpm-catalogs: 0.1.0(eslint@9.21.0(jiti@2.4.2))
4727 eslint-plugin-regexp: 2.7.0(eslint@9.21.0(jiti@2.4.2))
4728 eslint-plugin-toml: 0.12.0(eslint@9.21.0(jiti@2.4.2))
4729 eslint-plugin-unicorn: 57.0.0(eslint@9.21.0(jiti@2.4.2))
4625 - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))
4626 - eslint-plugin-vue: 9.32.0(eslint@9.21.0(jiti@2.4.2))
4730 + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))
4731 + eslint-plugin-vue: 10.0.0(eslint@9.21.0(jiti@2.4.2))(vue-eslint-parser@10.1.1(eslint@9.21.0(jiti@2.4.2)))
4732 eslint-plugin-yml: 1.17.0(eslint@9.21.0(jiti@2.4.2))
4733 eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.21.0(jiti@2.4.2))
4629 - globals: 15.15.0
4734 + globals: 16.0.0
4735 jsonc-eslint-parser: 2.4.0
4631 - local-pkg: 1.0.0
4736 + local-pkg: 1.1.1
4737 parse-gitignore: 2.0.0
4738 toml-eslint-parser: 0.10.0
4634 - vue-eslint-parser: 9.4.3(eslint@9.21.0(jiti@2.4.2))
4635 - yaml-eslint-parser: 1.2.3
4739 + vue-eslint-parser: 10.1.1(eslint@9.21.0(jiti@2.4.2))
4740 + yaml-eslint-parser: 1.3.0
4741 transitivePeerDependencies:
4742 - '@eslint/json'
4743 - '@typescript-eslint/utils'
@@ -4643,14 +4748,14 @@ snapshots:
4748
4749 '@antfu/install-pkg@1.0.0':
4750 dependencies:
4646 - package-manager-detector: 0.2.9
4751 + package-manager-detector: 0.2.11
4752 tinyexec: 0.3.2
4753
4754 '@antfu/ni@23.3.1': {}
4755
4756 '@antfu/utils@0.7.10': {}
4757
4653 - '@antfu/utils@8.1.1': {}
4758 + '@antfu/utils@9.1.0': {}
4759
4760 '@asamuzakjp/css-color@2.8.3':
4761 dependencies:
@@ -4862,6 +4967,77 @@ snapshots:
4967 picocolors: 1.1.1
4968 sisteransi: 1.0.5
4969
4970 + '@codemirror/autocomplete@6.18.6':
4971 + dependencies:
4972 + '@codemirror/language': 6.10.8
4973 + '@codemirror/state': 6.5.2
4974 + '@codemirror/view': 6.36.4
4975 + '@lezer/common': 1.2.3
4976 +
4977 + '@codemirror/commands@6.8.0':
4978 + dependencies:
4979 + '@codemirror/language': 6.10.8
4980 + '@codemirror/state': 6.5.2
4981 + '@codemirror/view': 6.36.4
4982 + '@lezer/common': 1.2.3
4983 +
4984 + '@codemirror/lang-javascript@6.2.3':
4985 + dependencies:
4986 + '@codemirror/autocomplete': 6.18.6
4987 + '@codemirror/language': 6.10.8
4988 + '@codemirror/lint': 6.8.4
4989 + '@codemirror/state': 6.5.2
4990 + '@codemirror/view': 6.36.4
4991 + '@lezer/common': 1.2.3
4992 + '@lezer/javascript': 1.4.21
4993 +
4994 + '@codemirror/lang-xml@6.1.0':
4995 + dependencies:
4996 + '@codemirror/autocomplete': 6.18.6
4997 + '@codemirror/language': 6.10.8
4998 + '@codemirror/state': 6.5.2
4999 + '@codemirror/view': 6.36.4
5000 + '@lezer/common': 1.2.3
5001 + '@lezer/xml': 1.0.6
5002 +
5003 + '@codemirror/language@6.10.8':
5004 + dependencies:
5005 + '@codemirror/state': 6.5.2
5006 + '@codemirror/view': 6.36.4
5007 + '@lezer/common': 1.2.3
5008 + '@lezer/highlight': 1.2.1
5009 + '@lezer/lr': 1.4.2
5010 + style-mod: 4.1.2
5011 +
5012 + '@codemirror/lint@6.8.4':
5013 + dependencies:
5014 + '@codemirror/state': 6.5.2
5015 + '@codemirror/view': 6.36.4
5016 + crelt: 1.0.6
5017 +
5018 + '@codemirror/search@6.5.10':
5019 + dependencies:
5020 + '@codemirror/state': 6.5.2
5021 + '@codemirror/view': 6.36.4
5022 + crelt: 1.0.6
5023 +
5024 + '@codemirror/state@6.5.2':
5025 + dependencies:
5026 + '@marijn/find-cluster-break': 1.0.2
5027 +
5028 + '@codemirror/theme-one-dark@6.1.2':
5029 + dependencies:
5030 + '@codemirror/language': 6.10.8
5031 + '@codemirror/state': 6.5.2
5032 + '@codemirror/view': 6.36.4
5033 + '@lezer/highlight': 1.2.1
5034 +
5035 + '@codemirror/view@6.36.4':
5036 + dependencies:
5037 + '@codemirror/state': 6.5.2
5038 + style-mod: 4.1.2
5039 + w3c-keyname: 2.2.8
5040 +
5041 '@colors/colors@1.5.0':
5042 optional: true
5043
@@ -4869,9 +5045,9 @@ snapshots:
5045 dependencies:
5046 css-render: 0.15.14
5047
4872 - '@css-render/vue3-ssr@0.15.14(vue@3.5.13(typescript@5.7.3))':
5048 + '@css-render/vue3-ssr@0.15.14(vue@3.5.13(typescript@5.8.2))':
5049 dependencies:
4874 - vue: 3.5.13(typescript@5.7.3)
5050 + vue: 3.5.13(typescript@5.8.2)
5051
5052 '@csstools/color-helpers@5.0.2': {}
5053
@@ -4893,7 +5069,7 @@ snapshots:
5069
5070 '@csstools/css-tokenizer@3.0.3': {}
5071
4896 - '@cypress/request@3.0.7':
5072 + '@cypress/request@3.0.8':
5073 dependencies:
5074 aws-sign2: 0.7.0
5075 aws4: 1.13.2
@@ -4908,9 +5084,9 @@ snapshots:
5084 json-stringify-safe: 5.0.1
5085 mime-types: 2.1.35
5086 performance-now: 2.1.0
4911 - qs: 6.13.1
5087 + qs: 6.14.0
5088 safe-buffer: 5.2.1
4913 - tough-cookie: 5.1.1
5089 + tough-cookie: 5.1.2
5090 tunnel-agent: 0.6.0
5091 uuid: 8.3.2
5092
@@ -4933,7 +5109,7 @@ snapshots:
5109 dependencies:
5110 '@types/eslint': 9.6.1
5111 '@types/estree': 1.0.6
4936 - '@typescript-eslint/types': 8.25.0
5112 + '@typescript-eslint/types': 8.26.0
5113 comment-parser: 1.4.1
5114 esquery: 1.6.0
5115 jsdoc-type-pratt-parser: 4.1.0
@@ -5079,16 +5255,16 @@ snapshots:
5255 '@eslint/core': 0.12.0
5256 levn: 0.4.1
5257
5082 - '@f3ve/vue-markdown-it@0.2.3(vue@3.5.13(typescript@5.7.3))':
5258 + '@f3ve/vue-markdown-it@0.2.3(vue@3.5.13(typescript@5.8.2))':
5259 dependencies:
5260 markdown-it: 14.1.0
5085 - vue: 3.5.13(typescript@5.7.3)
5261 + vue: 3.5.13(typescript@5.8.2)
5262
5087 - '@fontsource/jetbrains-mono@5.1.2': {}
5263 + '@fontsource/jetbrains-mono@5.2.5': {}
5264
5089 - '@fontsource/lexend@5.1.2': {}
5265 + '@fontsource/lexend@5.2.5': {}
5266
5091 - '@fontsource/public-sans@5.1.2': {}
5267 + '@fontsource/public-sans@5.2.5': {}
5268
5269 '@hapi/hoek@9.3.0': {}
5270
@@ -5111,10 +5287,10 @@ snapshots:
5287
5288 '@iconify/types@2.0.0': {}
5289
5114 - '@iconify/vue@4.3.0(vue@3.5.13(typescript@5.7.3))':
5290 + '@iconify/vue@4.3.0(vue@3.5.13(typescript@5.8.2))':
5291 dependencies:
5292 '@iconify/types': 2.0.0
5117 - vue: 3.5.13(typescript@5.7.3)
5293 + vue: 3.5.13(typescript@5.8.2)
5294
5295 '@intlify/core-base@11.1.1':
5296 dependencies:
@@ -5156,6 +5332,30 @@ snapshots:
5332
5333 '@juggle/resize-observer@3.4.0': {}
5334
5335 + '@lezer/common@1.2.3': {}
5336 +
5337 + '@lezer/highlight@1.2.1':
5338 + dependencies:
5339 + '@lezer/common': 1.2.3
5340 +
5341 + '@lezer/javascript@1.4.21':
5342 + dependencies:
5343 + '@lezer/common': 1.2.3
5344 + '@lezer/highlight': 1.2.1
5345 + '@lezer/lr': 1.4.2
5346 +
5347 + '@lezer/lr@1.4.2':
5348 + dependencies:
5349 + '@lezer/common': 1.2.3
5350 +
5351 + '@lezer/xml@1.0.6':
5352 + dependencies:
5353 + '@lezer/common': 1.2.3
5354 + '@lezer/highlight': 1.2.1
5355 + '@lezer/lr': 1.4.2
5356 +
5357 + '@marijn/find-cluster-break@1.0.2': {}
5358 +
5359 '@nodelib/fs.scandir@2.1.5':
5360 dependencies:
5361 '@nodelib/fs.stat': 2.0.5
@@ -5180,12 +5380,12 @@ snapshots:
5380 klona: 2.0.6
5381 knitwork: 1.2.0
5382 mlly: 1.7.4
5183 - ohash: 1.1.4
5383 + ohash: 1.1.6
5384 pathe: 2.0.3
5385 pkg-types: 1.3.1
5386 scule: 1.3.0
5387 semver: 7.7.1
5188 - std-env: 3.8.0
5388 + std-env: 3.8.1
5389 ufo: 1.5.4
5390 unctx: 2.4.1
5391 unimport: 4.1.2
@@ -5264,69 +5464,73 @@ snapshots:
5464
5465 '@polka/url@1.0.0-next.28': {}
5466
5267 - '@rollup/pluginutils@5.1.4(rollup@4.34.8)':
5467 + '@quansync/fs@0.1.1':
5468 + dependencies:
5469 + quansync: 0.2.8
5470 +
5471 + '@rollup/pluginutils@5.1.4(rollup@4.34.9)':
5472 dependencies:
5473 '@types/estree': 1.0.6
5474 estree-walker: 2.0.2
5475 picomatch: 4.0.2
5476 optionalDependencies:
5273 - rollup: 4.34.8
5477 + rollup: 4.34.9
5478
5275 - '@rollup/rollup-android-arm-eabi@4.34.8':
5479 + '@rollup/rollup-android-arm-eabi@4.34.9':
5480 optional: true
5481
5278 - '@rollup/rollup-android-arm64@4.34.8':
5482 + '@rollup/rollup-android-arm64@4.34.9':
5483 optional: true
5484
5281 - '@rollup/rollup-darwin-arm64@4.34.8':
5485 + '@rollup/rollup-darwin-arm64@4.34.9':
5486 optional: true
5487
5284 - '@rollup/rollup-darwin-x64@4.34.8':
5488 + '@rollup/rollup-darwin-x64@4.34.9':
5489 optional: true
5490
5287 - '@rollup/rollup-freebsd-arm64@4.34.8':
5491 + '@rollup/rollup-freebsd-arm64@4.34.9':
5492 optional: true
5493
5290 - '@rollup/rollup-freebsd-x64@4.34.8':
5494 + '@rollup/rollup-freebsd-x64@4.34.9':
5495 optional: true
5496
5293 - '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
5497 + '@rollup/rollup-linux-arm-gnueabihf@4.34.9':
5498 optional: true
5499
5296 - '@rollup/rollup-linux-arm-musleabihf@4.34.8':
5500 + '@rollup/rollup-linux-arm-musleabihf@4.34.9':
5501 optional: true
5502
5299 - '@rollup/rollup-linux-arm64-gnu@4.34.8':
5503 + '@rollup/rollup-linux-arm64-gnu@4.34.9':
5504 optional: true
5505
5302 - '@rollup/rollup-linux-arm64-musl@4.34.8':
5506 + '@rollup/rollup-linux-arm64-musl@4.34.9':
5507 optional: true
5508
5305 - '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
5509 + '@rollup/rollup-linux-loongarch64-gnu@4.34.9':
5510 optional: true
5511
5308 - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
5512 + '@rollup/rollup-linux-powerpc64le-gnu@4.34.9':
5513 optional: true
5514
5311 - '@rollup/rollup-linux-riscv64-gnu@4.34.8':
5515 + '@rollup/rollup-linux-riscv64-gnu@4.34.9':
5516 optional: true
5517
5314 - '@rollup/rollup-linux-s390x-gnu@4.34.8':
5518 + '@rollup/rollup-linux-s390x-gnu@4.34.9':
5519 optional: true
5520
5317 - '@rollup/rollup-linux-x64-gnu@4.34.8':
5521 + '@rollup/rollup-linux-x64-gnu@4.34.9':
5522 optional: true
5523
5320 - '@rollup/rollup-linux-x64-musl@4.34.8':
5524 + '@rollup/rollup-linux-x64-musl@4.34.9':
5525 optional: true
5526
5323 - '@rollup/rollup-win32-arm64-msvc@4.34.8':
5527 + '@rollup/rollup-win32-arm64-msvc@4.34.9':
5528 optional: true
5529
5326 - '@rollup/rollup-win32-ia32-msvc@4.34.8':
5530 + '@rollup/rollup-win32-ia32-msvc@4.34.9':
5531 optional: true
5532
5329 - '@rollup/rollup-win32-x64-msvc@4.34.8':
5533 + '@rollup/rollup-win32-x64-msvc@4.34.9':
5534 optional: true
5535
5536 '@sec-ant/readable-stream@0.4.1': {}
@@ -5381,9 +5585,9 @@ snapshots:
5585
5586 '@sindresorhus/merge-streams@4.0.0': {}
5587
5384 - '@stylistic/eslint-plugin@4.1.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
5588 + '@stylistic/eslint-plugin@4.2.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)':
5589 dependencies:
5386 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5590 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5591 eslint: 9.21.0(jiti@2.4.2)
5592 eslint-visitor-keys: 4.2.0
5593 espree: 10.3.0
@@ -5440,7 +5644,7 @@ snapshots:
5644 '@types/fs-extra@11.0.4':
5645 dependencies:
5646 '@types/jsonfile': 6.1.4
5443 - '@types/node': 22.13.5
5647 + '@types/node': 22.13.9
5648
5649 '@types/hast@3.0.4':
5650 dependencies:
@@ -5448,7 +5652,7 @@ snapshots:
5652
5653 '@types/jsdom@21.1.7':
5654 dependencies:
5451 - '@types/node': 22.13.5
5655 + '@types/node': 22.13.9
5656 '@types/tough-cookie': 4.0.5
5657 parse5: 7.2.1
5658
@@ -5456,15 +5660,15 @@ snapshots:
5660
5661 '@types/jsonfile@6.1.4':
5662 dependencies:
5459 - '@types/node': 22.13.5
5663 + '@types/node': 22.13.9
5664
5665 '@types/katex@0.16.7': {}
5666
5667 '@types/lodash-es@4.17.12':
5668 dependencies:
5465 - '@types/lodash': 4.17.15
5669 + '@types/lodash': 4.17.16
5670
5467 - '@types/lodash@4.17.15': {}
5671 + '@types/lodash@4.17.16': {}
5672
5673 '@types/mdast@4.0.4':
5674 dependencies:
@@ -5474,7 +5678,7 @@ snapshots:
5678
5679 '@types/ms@2.1.0': {}
5680
5477 - '@types/node@22.13.5':
5681 + '@types/node@22.13.9':
5682 dependencies:
5683 undici-types: 6.20.0
5684
@@ -5492,152 +5696,152 @@ snapshots:
5696
5697 '@types/validator@13.12.2': {}
5698
5495 - '@types/web-bluetooth@0.0.20': {}
5699 + '@types/web-bluetooth@0.0.21': {}
5700
5701 '@types/yauzl@2.10.3':
5702 dependencies:
5499 - '@types/node': 22.13.5
5703 + '@types/node': 22.13.9
5704 optional: true
5705
5502 - '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
5706 + '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)':
5707 dependencies:
5708 '@eslint-community/regexpp': 4.12.1
5505 - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5506 - '@typescript-eslint/scope-manager': 8.25.0
5507 - '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5508 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5509 - '@typescript-eslint/visitor-keys': 8.25.0
5709 + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5710 + '@typescript-eslint/scope-manager': 8.26.0
5711 + '@typescript-eslint/type-utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5712 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5713 + '@typescript-eslint/visitor-keys': 8.26.0
5714 eslint: 9.21.0(jiti@2.4.2)
5715 graphemer: 1.4.0
5716 ignore: 5.3.2
5717 natural-compare: 1.4.0
5514 - ts-api-utils: 2.0.1(typescript@5.7.3)
5515 - typescript: 5.7.3
5718 + ts-api-utils: 2.0.1(typescript@5.8.2)
5719 + typescript: 5.8.2
5720 transitivePeerDependencies:
5721 - supports-color
5722
5519 - '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
5723 + '@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)':
5724 dependencies:
5521 - '@typescript-eslint/scope-manager': 8.25.0
5522 - '@typescript-eslint/types': 8.25.0
5523 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
5524 - '@typescript-eslint/visitor-keys': 8.25.0
5725 + '@typescript-eslint/scope-manager': 8.26.0
5726 + '@typescript-eslint/types': 8.26.0
5727 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2)
5728 + '@typescript-eslint/visitor-keys': 8.26.0
5729 debug: 4.4.0(supports-color@8.1.1)
5730 eslint: 9.21.0(jiti@2.4.2)
5527 - typescript: 5.7.3
5731 + typescript: 5.8.2
5732 transitivePeerDependencies:
5733 - supports-color
5734
5531 - '@typescript-eslint/scope-manager@8.25.0':
5735 + '@typescript-eslint/scope-manager@8.26.0':
5736 dependencies:
5533 - '@typescript-eslint/types': 8.25.0
5534 - '@typescript-eslint/visitor-keys': 8.25.0
5737 + '@typescript-eslint/types': 8.26.0
5738 + '@typescript-eslint/visitor-keys': 8.26.0
5739
5536 - '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
5740 + '@typescript-eslint/type-utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)':
5741 dependencies:
5538 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
5539 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5742 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2)
5743 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5744 debug: 4.4.0(supports-color@8.1.1)
5745 eslint: 9.21.0(jiti@2.4.2)
5542 - ts-api-utils: 2.0.1(typescript@5.7.3)
5543 - typescript: 5.7.3
5746 + ts-api-utils: 2.0.1(typescript@5.8.2)
5747 + typescript: 5.8.2
5748 transitivePeerDependencies:
5749 - supports-color
5750
5547 - '@typescript-eslint/types@8.25.0': {}
5751 + '@typescript-eslint/types@8.26.0': {}
5752
5549 - '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)':
5753 + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)':
5754 dependencies:
5551 - '@typescript-eslint/types': 8.25.0
5552 - '@typescript-eslint/visitor-keys': 8.25.0
5755 + '@typescript-eslint/types': 8.26.0
5756 + '@typescript-eslint/visitor-keys': 8.26.0
5757 debug: 4.4.0(supports-color@8.1.1)
5758 fast-glob: 3.3.3
5759 is-glob: 4.0.3
5760 minimatch: 9.0.5
5761 semver: 7.7.1
5558 - ts-api-utils: 2.0.1(typescript@5.7.3)
5559 - typescript: 5.7.3
5762 + ts-api-utils: 2.0.1(typescript@5.8.2)
5763 + typescript: 5.8.2
5764 transitivePeerDependencies:
5765 - supports-color
5766
5563 - '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
5767 + '@typescript-eslint/utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)':
5768 dependencies:
5769 '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
5566 - '@typescript-eslint/scope-manager': 8.25.0
5567 - '@typescript-eslint/types': 8.25.0
5568 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3)
5770 + '@typescript-eslint/scope-manager': 8.26.0
5771 + '@typescript-eslint/types': 8.26.0
5772 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2)
5773 eslint: 9.21.0(jiti@2.4.2)
5570 - typescript: 5.7.3
5774 + typescript: 5.8.2
5775 transitivePeerDependencies:
5776 - supports-color
5777
5574 - '@typescript-eslint/visitor-keys@8.25.0':
5778 + '@typescript-eslint/visitor-keys@8.26.0':
5779 dependencies:
5576 - '@typescript-eslint/types': 8.25.0
5780 + '@typescript-eslint/types': 8.26.0
5781 eslint-visitor-keys: 4.2.0
5782
5783 '@ungap/structured-clone@1.3.0': {}
5784
5581 - '@vitejs/plugin-vue-jsx@4.1.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
5785 + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
5786 dependencies:
5787 '@babel/core': 7.26.9
5788 '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9)
5585 - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.9)
5586 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5587 - vue: 3.5.13(typescript@5.7.3)
5789 + '@vue/babel-plugin-jsx': 1.3.0(@babel/core@7.26.9)
5790 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5791 + vue: 3.5.13(typescript@5.8.2)
5792 transitivePeerDependencies:
5793 - supports-color
5794
5591 - '@vitejs/plugin-vue@5.2.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
5795 + '@vitejs/plugin-vue@5.2.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
5796 dependencies:
5593 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5594 - vue: 3.5.13(typescript@5.7.3)
5797 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5798 + vue: 3.5.13(typescript@5.8.2)
5799
5596 - '@vitest/eslint-plugin@1.1.35(@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))':
5800 + '@vitest/eslint-plugin@1.1.36(@typescript-eslint/utils@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0))':
5801 dependencies:
5598 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
5802 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
5803 eslint: 9.21.0(jiti@2.4.2)
5804 optionalDependencies:
5601 - typescript: 5.7.3
5602 - vitest: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0)
5805 + typescript: 5.8.2
5806 + vitest: 3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0)
5807
5604 - '@vitest/expect@3.0.7':
5808 + '@vitest/expect@3.0.8':
5809 dependencies:
5606 - '@vitest/spy': 3.0.7
5607 - '@vitest/utils': 3.0.7
5810 + '@vitest/spy': 3.0.8
5811 + '@vitest/utils': 3.0.8
5812 chai: 5.2.0
5813 tinyrainbow: 2.0.0
5814
5611 - '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))':
5815 + '@vitest/mocker@3.0.8(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))':
5816 dependencies:
5613 - '@vitest/spy': 3.0.7
5817 + '@vitest/spy': 3.0.8
5818 estree-walker: 3.0.3
5819 magic-string: 0.30.17
5820 optionalDependencies:
5617 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5821 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
5822
5619 - '@vitest/pretty-format@3.0.7':
5823 + '@vitest/pretty-format@3.0.8':
5824 dependencies:
5825 tinyrainbow: 2.0.0
5826
5623 - '@vitest/runner@3.0.7':
5827 + '@vitest/runner@3.0.8':
5828 dependencies:
5625 - '@vitest/utils': 3.0.7
5829 + '@vitest/utils': 3.0.8
5830 pathe: 2.0.3
5831
5628 - '@vitest/snapshot@3.0.7':
5832 + '@vitest/snapshot@3.0.8':
5833 dependencies:
5630 - '@vitest/pretty-format': 3.0.7
5834 + '@vitest/pretty-format': 3.0.8
5835 magic-string: 0.30.17
5836 pathe: 2.0.3
5837
5634 - '@vitest/spy@3.0.7':
5838 + '@vitest/spy@3.0.8':
5839 dependencies:
5840 tinyspy: 3.0.2
5841
5638 - '@vitest/utils@3.0.7':
5842 + '@vitest/utils@3.0.8':
5843 dependencies:
5640 - '@vitest/pretty-format': 3.0.7
5844 + '@vitest/pretty-format': 3.0.8
5845 loupe: 3.1.3
5846 tinyrainbow: 2.0.0
5847
@@ -5653,9 +5857,9 @@ snapshots:
5857 path-browserify: 1.0.1
5858 vscode-uri: 3.1.0
5859
5656 - '@vue/babel-helper-vue-transform-on@1.2.5': {}
5860 + '@vue/babel-helper-vue-transform-on@1.3.0': {}
5861
5658 - '@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.9)':
5862 + '@vue/babel-plugin-jsx@1.3.0(@babel/core@7.26.9)':
5863 dependencies:
5864 '@babel/helper-module-imports': 7.25.9
5865 '@babel/helper-plugin-utils': 7.26.5
@@ -5663,16 +5867,15 @@ snapshots:
5867 '@babel/template': 7.26.9
5868 '@babel/traverse': 7.26.9
5869 '@babel/types': 7.26.9
5666 - '@vue/babel-helper-vue-transform-on': 1.2.5
5667 - '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.9)
5668 - html-tags: 3.3.1
5669 - svg-tags: 1.0.0
5870 + '@vue/babel-helper-vue-transform-on': 1.3.0
5871 + '@vue/babel-plugin-resolve-type': 1.3.0(@babel/core@7.26.9)
5872 + '@vue/shared': 3.5.13
5873 optionalDependencies:
5874 '@babel/core': 7.26.9
5875 transitivePeerDependencies:
5876 - supports-color
5877
5675 - '@vue/babel-plugin-resolve-type@1.2.5(@babel/core@7.26.9)':
5878 + '@vue/babel-plugin-resolve-type@1.3.0(@babel/core@7.26.9)':
5879 dependencies:
5880 '@babel/code-frame': 7.26.2
5881 '@babel/core': 7.26.9
@@ -5724,15 +5927,15 @@ snapshots:
5927 dependencies:
5928 '@vue/devtools-kit': 7.7.2
5929
5727 - '@vue/devtools-core@7.7.2(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
5930 + '@vue/devtools-core@7.7.2(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))':
5931 dependencies:
5932 '@vue/devtools-kit': 7.7.2
5933 '@vue/devtools-shared': 7.7.2
5934 mitt: 3.0.1
5935 nanoid: 5.1.2
5936 pathe: 2.0.3
5734 - vite-hot-client: 0.2.4(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
5735 - vue: 3.5.13(typescript@5.7.3)
5937 + vite-hot-client: 0.2.4(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
5938 + vue: 3.5.13(typescript@5.8.2)
5939 transitivePeerDependencies:
5940 - vite
5941
@@ -5750,7 +5953,7 @@ snapshots:
5953 dependencies:
5954 rfdc: 1.4.1
5955
5753 - '@vue/language-core@2.2.4(typescript@5.7.3)':
5956 + '@vue/language-core@2.2.8(typescript@5.8.2)':
5957 dependencies:
5958 '@volar/language-core': 2.4.11
5959 '@vue/compiler-dom': 3.5.13
@@ -5761,7 +5964,7 @@ snapshots:
5964 muggle-string: 0.4.1
5965 path-browserify: 1.0.1
5966 optionalDependencies:
5764 - typescript: 5.7.3
5967 + typescript: 5.8.2
5968
5969 '@vue/reactivity@3.5.13':
5970 dependencies:
@@ -5779,44 +5982,44 @@ snapshots:
5982 '@vue/shared': 3.5.13
5983 csstype: 3.1.3
5984
5782 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))':
5985 + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))':
5986 dependencies:
5987 '@vue/compiler-ssr': 3.5.13
5988 '@vue/shared': 3.5.13
5786 - vue: 3.5.13(typescript@5.7.3)
5989 + vue: 3.5.13(typescript@5.8.2)
5990
5991 '@vue/shared@3.5.13': {}
5992
5993 '@vue/test-utils@2.4.6':
5994 dependencies:
5792 - js-beautify: 1.15.3
5793 - vue-component-type-helpers: 2.2.4
5995 + js-beautify: 1.15.4
5996 + vue-component-type-helpers: 2.2.8
5997
5795 - '@vue/tsconfig@0.7.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))':
5998 + '@vue/tsconfig@0.7.0(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))':
5999 optionalDependencies:
5797 - typescript: 5.7.3
5798 - vue: 3.5.13(typescript@5.7.3)
6000 + typescript: 5.8.2
6001 + vue: 3.5.13(typescript@5.8.2)
6002
5800 - '@vueuse/core@12.7.0(typescript@5.7.3)':
6003 + '@vueuse/core@12.8.2(typescript@5.8.2)':
6004 dependencies:
5802 - '@types/web-bluetooth': 0.0.20
5803 - '@vueuse/metadata': 12.7.0
5804 - '@vueuse/shared': 12.7.0(typescript@5.7.3)
5805 - vue: 3.5.13(typescript@5.7.3)
6005 + '@types/web-bluetooth': 0.0.21
6006 + '@vueuse/metadata': 12.8.2
6007 + '@vueuse/shared': 12.8.2(typescript@5.8.2)
6008 + vue: 3.5.13(typescript@5.8.2)
6009 transitivePeerDependencies:
6010 - typescript
6011
5809 - '@vueuse/metadata@12.7.0': {}
6012 + '@vueuse/metadata@12.8.2': {}
6013
5811 - '@vueuse/shared@12.7.0(typescript@5.7.3)':
6014 + '@vueuse/shared@12.8.2(typescript@5.8.2)':
6015 dependencies:
5813 - vue: 3.5.13(typescript@5.7.3)
6016 + vue: 3.5.13(typescript@5.8.2)
6017 transitivePeerDependencies:
6018 - typescript
6019
6020 '@yr/monotone-cubic-spline@1.0.3': {}
6021
5819 - abbrev@3.0.0: {}
6022 + abbrev@2.0.0: {}
6023
6024 acorn-jsx@5.3.2(acorn@8.14.0):
6025 dependencies:
@@ -5856,7 +6059,7 @@ snapshots:
6059
6060 ansi-styles@6.2.1: {}
6061
5859 - ansis@3.16.0: {}
6062 + ansis@3.17.0: {}
6063
6064 any-promise@1.3.0: {}
6065
@@ -5913,7 +6116,7 @@ snapshots:
6116 autoprefixer@10.4.20(postcss@8.5.3):
6117 dependencies:
6118 browserslist: 4.24.4
5916 - caniuse-lite: 1.0.30001701
6119 + caniuse-lite: 1.0.30001702
6120 fraction.js: 4.3.7
6121 normalize-range: 0.1.2
6122 picocolors: 1.1.1
@@ -5965,8 +6168,8 @@ snapshots:
6168
6169 browserslist@4.24.4:
6170 dependencies:
5968 - caniuse-lite: 1.0.30001701
5969 - electron-to-chromium: 1.5.107
6171 + caniuse-lite: 1.0.30001702
6172 + electron-to-chromium: 1.5.112
6173 node-releases: 2.0.19
6174 update-browserslist-db: 1.1.3(browserslist@4.24.4)
6175
@@ -5994,7 +6197,7 @@ snapshots:
6197 giget: 1.2.5
6198 jiti: 2.4.2
6199 mlly: 1.7.4
5997 - ohash: 2.0.5
6200 + ohash: 2.0.11
6201 pathe: 2.0.3
6202 perfect-debounce: 1.0.0
6203 pkg-types: 1.3.1
@@ -6009,7 +6212,7 @@ snapshots:
6212 es-errors: 1.3.0
6213 function-bind: 1.1.2
6214
6012 - call-bound@1.0.3:
6215 + call-bound@1.0.4:
6216 dependencies:
6217 call-bind-apply-helpers: 1.0.2
6218 get-intrinsic: 1.3.0
@@ -6022,7 +6225,7 @@ snapshots:
6225
6226 camelcase@6.3.0: {}
6227
6025 - caniuse-lite@1.0.30001701: {}
6228 + caniuse-lite@1.0.30001702: {}
6229
6230 caseless@0.12.0: {}
6231
@@ -6110,6 +6313,16 @@ snapshots:
6313 strip-ansi: 6.0.1
6314 wrap-ansi: 7.0.0
6315
6316 + codemirror@6.0.1:
6317 + dependencies:
6318 + '@codemirror/autocomplete': 6.18.6
6319 + '@codemirror/commands': 6.8.0
6320 + '@codemirror/language': 6.10.8
6321 + '@codemirror/lint': 6.8.4
6322 + '@codemirror/search': 6.5.10
6323 + '@codemirror/state': 6.5.2
6324 + '@codemirror/view': 6.36.4
6325 +
6326 color-convert@2.0.1:
6327 dependencies:
6328 color-name: 1.1.4
@@ -6142,6 +6355,8 @@ snapshots:
6355
6356 confbox@0.1.8: {}
6357
6358 + confbox@0.2.1: {}
6359 +
6360 config-chain@1.1.13:
6361 dependencies:
6362 ini: 1.3.8
@@ -6155,7 +6370,7 @@ snapshots:
6370 dependencies:
6371 is-what: 4.1.16
6372
6158 - core-js-compat@3.40.0:
6373 + core-js-compat@3.41.0:
6374 dependencies:
6375 browserslist: 4.24.4
6376
@@ -6169,6 +6384,8 @@ snapshots:
6384 path-type: 4.0.0
6385 yaml: 1.10.2
6386
6387 + crelt@1.0.6: {}
6388 +
6389 cross-spawn@7.0.6:
6390 dependencies:
6391 path-key: 3.1.1
@@ -6219,7 +6436,7 @@ snapshots:
6436
6437 cypress@14.1.0:
6438 dependencies:
6222 - '@cypress/request': 3.0.7
6439 + '@cypress/request': 3.0.8
6440 '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
6441 '@types/sinonjs__fake-timers': 8.1.1
6442 '@types/sizzle': 2.3.9
@@ -6425,7 +6642,7 @@ snapshots:
6642 minimatch: 9.0.1
6643 semver: 7.7.1
6644
6428 - electron-to-chromium@1.5.107: {}
6645 + electron-to-chromium@1.5.112: {}
6646
6647 emoji-regex-xs@1.0.0: {}
6648
@@ -6561,11 +6778,11 @@ snapshots:
6778 eslint: 9.21.0(jiti@2.4.2)
6779 eslint-compat-utils: 0.5.1(eslint@9.21.0(jiti@2.4.2))
6780
6564 - eslint-plugin-import-x@4.6.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3):
6781 + eslint-plugin-import-x@4.6.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2):
6782 dependencies:
6783 '@types/doctrine': 0.0.9
6567 - '@typescript-eslint/scope-manager': 8.25.0
6568 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
6784 + '@typescript-eslint/scope-manager': 8.26.0
6785 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
6786 debug: 4.4.0(supports-color@8.1.1)
6787 doctrine: 3.0.0
6788 enhanced-resolve: 5.18.1
@@ -6612,7 +6829,7 @@ snapshots:
6829 transitivePeerDependencies:
6830 - '@eslint/json'
6831
6615 - eslint-plugin-n@17.15.1(eslint@9.21.0(jiti@2.4.2)):
6832 + eslint-plugin-n@17.16.2(eslint@9.21.0(jiti@2.4.2)):
6833 dependencies:
6834 '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
6835 enhanced-resolve: 5.18.1
@@ -6626,16 +6843,23 @@ snapshots:
6843
6844 eslint-plugin-no-only-tests@3.3.0: {}
6845
6629 - eslint-plugin-perfectionist@4.9.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3):
6846 + eslint-plugin-perfectionist@4.9.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2):
6847 dependencies:
6631 - '@typescript-eslint/types': 8.25.0
6632 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
6848 + '@typescript-eslint/types': 8.26.0
6849 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
6850 eslint: 9.21.0(jiti@2.4.2)
6851 natural-orderby: 5.0.0
6852 transitivePeerDependencies:
6853 - supports-color
6854 - typescript
6855
6856 + eslint-plugin-pnpm-catalogs@0.1.0(eslint@9.21.0(jiti@2.4.2)):
6857 + dependencies:
6858 + eslint: 9.21.0(jiti@2.4.2)
6859 + find-up-simple: 1.0.1
6860 + jsonc-eslint-parser: 2.4.0
6861 + pnpm-catalogs-utils: 0.1.0
6862 +
6863 eslint-plugin-regexp@2.7.0(eslint@9.21.0(jiti@2.4.2)):
6864 dependencies:
6865 '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
@@ -6663,7 +6887,7 @@ snapshots:
6887 '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
6888 ci-info: 4.1.0
6889 clean-regexp: 1.0.0
6666 - core-js-compat: 3.40.0
6890 + core-js-compat: 3.41.0
6891 eslint: 9.21.0(jiti@2.4.2)
6892 esquery: 1.6.0
6893 globals: 15.15.0
@@ -6677,25 +6901,22 @@ snapshots:
6901 semver: 7.7.1
6902 strip-indent: 4.0.0
6903
6680 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2)):
6904 + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2)):
6905 dependencies:
6906 eslint: 9.21.0(jiti@2.4.2)
6907 optionalDependencies:
6684 - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
6908 + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)
6909
6686 - eslint-plugin-vue@9.32.0(eslint@9.21.0(jiti@2.4.2)):
6910 + eslint-plugin-vue@10.0.0(eslint@9.21.0(jiti@2.4.2))(vue-eslint-parser@10.1.1(eslint@9.21.0(jiti@2.4.2))):
6911 dependencies:
6912 '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
6913 eslint: 9.21.0(jiti@2.4.2)
6690 - globals: 13.24.0
6914 natural-compare: 1.4.0
6915 nth-check: 2.1.1
6916 postcss-selector-parser: 6.1.2
6917 semver: 7.7.1
6695 - vue-eslint-parser: 9.4.3(eslint@9.21.0(jiti@2.4.2))
6918 + vue-eslint-parser: 10.1.1(eslint@9.21.0(jiti@2.4.2))
6919 xml-name-validator: 4.0.0
6697 - transitivePeerDependencies:
6698 - - supports-color
6920
6921 eslint-plugin-yml@1.17.0(eslint@9.21.0(jiti@2.4.2)):
6922 dependencies:
@@ -6704,7 +6925,7 @@ snapshots:
6925 eslint: 9.21.0(jiti@2.4.2)
6926 eslint-compat-utils: 0.6.4(eslint@9.21.0(jiti@2.4.2))
6927 natural-compare: 1.4.0
6707 - yaml-eslint-parser: 1.2.3
6928 + yaml-eslint-parser: 1.3.0
6929 transitivePeerDependencies:
6930 - supports-color
6931
@@ -6713,11 +6934,6 @@ snapshots:
6934 '@vue/compiler-sfc': 3.5.13
6935 eslint: 9.21.0(jiti@2.4.2)
6936
6716 - eslint-scope@7.2.2:
6717 - dependencies:
6718 - esrecurse: 4.3.0
6719 - estraverse: 5.3.0
6720 -
6937 eslint-scope@8.2.0:
6938 dependencies:
6939 esrecurse: 4.3.0
@@ -6861,7 +7077,9 @@ snapshots:
7077 dependencies:
7078 homedir-polyfill: 1.0.3
7079
6864 - expect-type@1.1.0: {}
7080 + expect-type@1.2.0: {}
7081 +
7082 + exsolve@1.0.1: {}
7083
7084 extend@3.0.2: {}
7085
@@ -6921,7 +7139,7 @@ snapshots:
7139 dependencies:
7140 to-regex-range: 5.0.1
7141
6924 - find-up-simple@1.0.0: {}
7142 + find-up-simple@1.0.1: {}
7143
7144 find-up@5.0.0:
7145 dependencies:
@@ -7080,14 +7298,12 @@ snapshots:
7298
7299 globals@11.12.0: {}
7300
7083 - globals@13.24.0:
7084 - dependencies:
7085 - type-fest: 0.20.2
7086 -
7301 globals@14.0.0: {}
7302
7303 globals@15.15.0: {}
7304
7305 + globals@16.0.0: {}
7306 +
7307 globby@14.1.0:
7308 dependencies:
7309 '@sindresorhus/merge-streams': 2.3.0
@@ -7155,8 +7371,6 @@ snapshots:
7371
7372 html-entities@2.5.2: {}
7373
7158 - html-tags@3.3.1: {}
7159 -
7374 html-void-elements@3.0.0: {}
7375
7376 http-proxy-agent@7.0.2:
@@ -7314,13 +7528,13 @@ snapshots:
7528
7529 jose@6.0.8: {}
7530
7317 - js-beautify@1.15.3:
7531 + js-beautify@1.15.4:
7532 dependencies:
7533 config-chain: 1.1.13
7534 editorconfig: 1.0.4
7535 glob: 10.4.5
7536 js-cookie: 3.0.5
7323 - nopt: 8.1.0
7537 + nopt: 7.2.1
7538
7539 js-cookie@3.0.5: {}
7540
@@ -7353,12 +7567,12 @@ snapshots:
7567 http-proxy-agent: 7.0.2
7568 https-proxy-agent: 7.0.6
7569 is-potential-custom-element-name: 1.0.1
7356 - nwsapi: 2.2.16
7570 + nwsapi: 2.2.18
7571 parse5: 7.2.1
7572 rrweb-cssom: 0.8.0
7573 saxes: 6.0.0
7574 symbol-tree: 3.2.4
7361 - tough-cookie: 5.1.1
7575 + tough-cookie: 5.1.2
7576 w3c-xmlserializer: 5.0.0
7577 webidl-conversions: 7.0.0
7578 whatwg-encoding: 3.1.1
@@ -7449,10 +7663,11 @@ snapshots:
7663 optionalDependencies:
7664 enquirer: 2.4.1
7665
7452 - local-pkg@1.0.0:
7666 + local-pkg@1.1.1:
7667 dependencies:
7668 mlly: 1.7.4
7455 - pkg-types: 1.3.1
7669 + pkg-types: 2.1.0
7670 + quansync: 0.2.8
7671
7672 locate-path@6.0.0:
7673 dependencies:
@@ -7523,12 +7738,12 @@ snapshots:
7738 decode-named-character-reference: 1.0.2
7739 devlop: 1.1.0
7740 mdast-util-to-string: 4.0.0
7526 - micromark: 4.0.1
7741 + micromark: 4.0.2
7742 micromark-util-decode-numeric-character-reference: 2.0.2
7743 micromark-util-decode-string: 2.0.1
7744 micromark-util-normalize-identifier: 2.0.1
7745 micromark-util-symbol: 2.0.1
7531 - micromark-util-types: 2.0.1
7746 + micromark-util-types: 2.0.2
7747 unist-util-stringify-position: 4.0.0
7748 transitivePeerDependencies:
7749 - supports-color
@@ -7635,7 +7850,7 @@ snapshots:
7850
7851 merge2@1.4.1: {}
7852
7638 - micromark-core-commonmark@2.0.2:
7853 + micromark-core-commonmark@2.0.3:
7854 dependencies:
7855 decode-named-character-reference: 1.0.2
7856 devlop: 1.1.0
@@ -7650,27 +7865,27 @@ snapshots:
7865 micromark-util-html-tag-name: 2.0.1
7866 micromark-util-normalize-identifier: 2.0.1
7867 micromark-util-resolve-all: 2.0.1
7653 - micromark-util-subtokenize: 2.0.4
7868 + micromark-util-subtokenize: 2.1.0
7869 micromark-util-symbol: 2.0.1
7655 - micromark-util-types: 2.0.1
7870 + micromark-util-types: 2.0.2
7871
7872 micromark-extension-gfm-autolink-literal@2.1.0:
7873 dependencies:
7874 micromark-util-character: 2.1.1
7875 micromark-util-sanitize-uri: 2.0.1
7876 micromark-util-symbol: 2.0.1
7662 - micromark-util-types: 2.0.1
7877 + micromark-util-types: 2.0.2
7878
7879 micromark-extension-gfm-footnote@2.1.0:
7880 dependencies:
7881 devlop: 1.1.0
7667 - micromark-core-commonmark: 2.0.2
7882 + micromark-core-commonmark: 2.0.3
7883 micromark-factory-space: 2.0.1
7884 micromark-util-character: 2.1.1
7885 micromark-util-normalize-identifier: 2.0.1
7886 micromark-util-sanitize-uri: 2.0.1
7887 micromark-util-symbol: 2.0.1
7673 - micromark-util-types: 2.0.1
7888 + micromark-util-types: 2.0.2
7889
7890 micromark-extension-gfm-strikethrough@2.1.0:
7891 dependencies:
@@ -7679,7 +7894,7 @@ snapshots:
7894 micromark-util-classify-character: 2.0.1
7895 micromark-util-resolve-all: 2.0.1
7896 micromark-util-symbol: 2.0.1
7682 - micromark-util-types: 2.0.1
7897 + micromark-util-types: 2.0.2
7898
7899 micromark-extension-gfm-table@2.1.1:
7900 dependencies:
@@ -7687,11 +7902,11 @@ snapshots:
7902 micromark-factory-space: 2.0.1
7903 micromark-util-character: 2.1.1
7904 micromark-util-symbol: 2.0.1
7690 - micromark-util-types: 2.0.1
7905 + micromark-util-types: 2.0.2
7906
7907 micromark-extension-gfm-tagfilter@2.0.0:
7908 dependencies:
7694 - micromark-util-types: 2.0.1
7909 + micromark-util-types: 2.0.2
7910
7911 micromark-extension-gfm-task-list-item@2.1.0:
7912 dependencies:
@@ -7699,7 +7914,7 @@ snapshots:
7914 micromark-factory-space: 2.0.1
7915 micromark-util-character: 2.1.1
7916 micromark-util-symbol: 2.0.1
7702 - micromark-util-types: 2.0.1
7917 + micromark-util-types: 2.0.2
7918
7919 micromark-extension-gfm@3.0.0:
7920 dependencies:
@@ -7710,44 +7925,44 @@ snapshots:
7925 micromark-extension-gfm-tagfilter: 2.0.0
7926 micromark-extension-gfm-task-list-item: 2.1.0
7927 micromark-util-combine-extensions: 2.0.1
7713 - micromark-util-types: 2.0.1
7928 + micromark-util-types: 2.0.2
7929
7930 micromark-factory-destination@2.0.1:
7931 dependencies:
7932 micromark-util-character: 2.1.1
7933 micromark-util-symbol: 2.0.1
7719 - micromark-util-types: 2.0.1
7934 + micromark-util-types: 2.0.2
7935
7936 micromark-factory-label@2.0.1:
7937 dependencies:
7938 devlop: 1.1.0
7939 micromark-util-character: 2.1.1
7940 micromark-util-symbol: 2.0.1
7726 - micromark-util-types: 2.0.1
7941 + micromark-util-types: 2.0.2
7942
7943 micromark-factory-space@2.0.1:
7944 dependencies:
7945 micromark-util-character: 2.1.1
7731 - micromark-util-types: 2.0.1
7946 + micromark-util-types: 2.0.2
7947
7948 micromark-factory-title@2.0.1:
7949 dependencies:
7950 micromark-factory-space: 2.0.1
7951 micromark-util-character: 2.1.1
7952 micromark-util-symbol: 2.0.1
7738 - micromark-util-types: 2.0.1
7953 + micromark-util-types: 2.0.2
7954
7955 micromark-factory-whitespace@2.0.1:
7956 dependencies:
7957 micromark-factory-space: 2.0.1
7958 micromark-util-character: 2.1.1
7959 micromark-util-symbol: 2.0.1
7745 - micromark-util-types: 2.0.1
7960 + micromark-util-types: 2.0.2
7961
7962 micromark-util-character@2.1.1:
7963 dependencies:
7964 micromark-util-symbol: 2.0.1
7750 - micromark-util-types: 2.0.1
7965 + micromark-util-types: 2.0.2
7966
7967 micromark-util-chunked@2.0.1:
7968 dependencies:
@@ -7757,12 +7972,12 @@ snapshots:
7972 dependencies:
7973 micromark-util-character: 2.1.1
7974 micromark-util-symbol: 2.0.1
7760 - micromark-util-types: 2.0.1
7975 + micromark-util-types: 2.0.2
7976
7977 micromark-util-combine-extensions@2.0.1:
7978 dependencies:
7979 micromark-util-chunked: 2.0.1
7765 - micromark-util-types: 2.0.1
7980 + micromark-util-types: 2.0.2
7981
7982 micromark-util-decode-numeric-character-reference@2.0.2:
7983 dependencies:
@@ -7785,7 +8000,7 @@ snapshots:
8000
8001 micromark-util-resolve-all@2.0.1:
8002 dependencies:
7788 - micromark-util-types: 2.0.1
8003 + micromark-util-types: 2.0.2
8004
8005 micromark-util-sanitize-uri@2.0.1:
8006 dependencies:
@@ -7793,24 +8008,24 @@ snapshots:
8008 micromark-util-encode: 2.0.1
8009 micromark-util-symbol: 2.0.1
8010
7796 - micromark-util-subtokenize@2.0.4:
8011 + micromark-util-subtokenize@2.1.0:
8012 dependencies:
8013 devlop: 1.1.0
8014 micromark-util-chunked: 2.0.1
8015 micromark-util-symbol: 2.0.1
7801 - micromark-util-types: 2.0.1
8016 + micromark-util-types: 2.0.2
8017
8018 micromark-util-symbol@2.0.1: {}
8019
7805 - micromark-util-types@2.0.1: {}
8020 + micromark-util-types@2.0.2: {}
8021
7807 - micromark@4.0.1:
8022 + micromark@4.0.2:
8023 dependencies:
8024 '@types/debug': 4.1.12
8025 debug: 4.4.0(supports-color@8.1.1)
8026 decode-named-character-reference: 1.0.2
8027 devlop: 1.1.0
7813 - micromark-core-commonmark: 2.0.2
8028 + micromark-core-commonmark: 2.0.3
8029 micromark-factory-space: 2.0.1
8030 micromark-util-character: 2.1.1
8031 micromark-util-chunked: 2.0.1
@@ -7820,9 +8035,9 @@ snapshots:
8035 micromark-util-normalize-identifier: 2.0.1
8036 micromark-util-resolve-all: 2.0.1
8037 micromark-util-sanitize-uri: 2.0.1
7823 - micromark-util-subtokenize: 2.0.4
8038 + micromark-util-subtokenize: 2.1.0
8039 micromark-util-symbol: 2.0.1
7825 - micromark-util-types: 2.0.1
8040 + micromark-util-types: 2.0.2
8041 transitivePeerDependencies:
8042 - supports-color
8043
@@ -7903,12 +8118,12 @@ snapshots:
8118 object-assign: 4.1.1
8119 thenify-all: 1.6.0
8120
7906 - naive-ui@2.41.0(vue@3.5.13(typescript@5.7.3)):
8121 + naive-ui@2.41.0(vue@3.5.13(typescript@5.8.2)):
8122 dependencies:
8123 '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
7909 - '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.7.3))
8124 + '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.8.2))
8125 '@types/katex': 0.16.7
7911 - '@types/lodash': 4.17.15
8126 + '@types/lodash': 4.17.16
8127 '@types/lodash-es': 4.17.12
8128 async-validator: 4.2.5
8129 css-render: 0.15.14
@@ -7921,10 +8136,10 @@ snapshots:
8136 lodash-es: 4.17.21
8137 seemly: 0.3.10
8138 treemate: 0.3.11
7924 - vdirs: 0.1.8(vue@3.5.13(typescript@5.7.3))
7925 - vooks: 0.2.12(vue@3.5.13(typescript@5.7.3))
7926 - vue: 3.5.13(typescript@5.7.3)
7927 - vueuc: 0.4.64(vue@3.5.13(typescript@5.7.3))
8139 + vdirs: 0.1.8(vue@3.5.13(typescript@5.8.2))
8140 + vooks: 0.2.12(vue@3.5.13(typescript@5.8.2))
8141 + vue: 3.5.13(typescript@5.8.2)
8142 + vueuc: 0.4.64(vue@3.5.13(typescript@5.8.2))
8143
8144 nanoid@3.3.8: {}
8145
@@ -7941,9 +8156,9 @@ snapshots:
8156
8157 node-releases@2.0.19: {}
8158
7944 - nopt@8.1.0:
8159 + nopt@7.2.1:
8160 dependencies:
7946 - abbrev: 3.0.0
8161 + abbrev: 2.0.0
8162
8163 normalize-package-data@6.0.2:
8164 dependencies:
@@ -7981,7 +8196,7 @@ snapshots:
8196 dependencies:
8197 boolbase: 1.0.0
8198
7984 - nwsapi@2.2.16: {}
8199 + nwsapi@2.2.18: {}
8200
8201 nypm@0.5.4:
8202 dependencies:
@@ -8004,9 +8219,9 @@ snapshots:
8219 node-fetch-native: 1.6.6
8220 ufo: 1.5.4
8221
8007 - ohash@1.1.4: {}
8222 + ohash@1.1.6: {}
8223
8009 - ohash@2.0.5: {}
8224 + ohash@2.0.11: {}
8225
8226 once@1.4.0:
8227 dependencies:
@@ -8060,7 +8275,9 @@ snapshots:
8275
8276 package-json-from-dist@1.0.1: {}
8277
8063 - package-manager-detector@0.2.9: {}
8278 + package-manager-detector@0.2.11:
8279 + dependencies:
8280 + quansync: 0.2.8
8281
8282 parent-module@1.0.1:
8283 dependencies:
@@ -8084,7 +8301,7 @@ snapshots:
8301 dependencies:
8302 '@babel/code-frame': 7.26.2
8303 index-to-position: 0.1.2
8087 - type-fest: 4.35.0
8304 + type-fest: 4.37.0
8305
8306 parse-ms@4.0.0: {}
8307
@@ -8139,24 +8356,24 @@ snapshots:
8356
8357 pify@2.3.0: {}
8358
8142 - pinia-plugin-persistedstate@4.2.0(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))):
8359 + pinia-plugin-persistedstate@4.2.0(pinia@3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))):
8360 dependencies:
8361 '@nuxt/kit': 3.15.4
8362 deep-pick-omit: 1.2.1
8363 defu: 6.1.4
8364 destr: 2.0.3
8365 optionalDependencies:
8149 - pinia: 3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
8366 + pinia: 3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
8367 transitivePeerDependencies:
8368 - magicast
8369 - supports-color
8370
8154 - pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)):
8371 + pinia@3.0.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)):
8372 dependencies:
8373 '@vue/devtools-api': 7.7.2
8157 - vue: 3.5.13(typescript@5.7.3)
8374 + vue: 3.5.13(typescript@5.8.2)
8375 optionalDependencies:
8159 - typescript: 5.7.3
8376 + typescript: 5.8.2
8377
8378 pirates@4.0.6: {}
8379
@@ -8166,12 +8383,22 @@ snapshots:
8383 mlly: 1.7.4
8384 pathe: 2.0.3
8385
8386 + pkg-types@2.1.0:
8387 + dependencies:
8388 + confbox: 0.2.1
8389 + exsolve: 1.0.1
8390 + pathe: 2.0.3
8391 +
8392 please-upgrade-node@3.2.0:
8393 dependencies:
8394 semver-compare: 1.0.0
8395
8396 pluralize@8.0.0: {}
8397
8398 + pnpm-catalogs-utils@0.1.0:
8399 + dependencies:
8400 + yaml: 2.7.0
8401 +
8402 postcss-import@15.1.0(postcss@8.5.3):
8403 dependencies:
8404 postcss: 8.5.3
@@ -8211,11 +8438,11 @@ snapshots:
8438
8439 prelude-ls@1.2.1: {}
8440
8214 - prettier-plugin-tailwindcss@0.6.11(prettier@3.5.2):
8441 + prettier-plugin-tailwindcss@0.6.11(prettier@3.5.3):
8442 dependencies:
8216 - prettier: 3.5.2
8443 + prettier: 3.5.3
8444
8218 - prettier@3.5.2: {}
8445 + prettier@3.5.3: {}
8446
8447 pretty-bytes@5.6.0: {}
8448
@@ -8246,10 +8473,12 @@ snapshots:
8473
8474 punycode@2.3.1: {}
8475
8249 - qs@6.13.1:
8476 + qs@6.14.0:
8477 dependencies:
8478 side-channel: 1.1.0
8479
8480 + quansync@0.2.8: {}
8481 +
8482 queue-microtask@1.2.3: {}
8483
8484 rc9@2.1.2:
@@ -8268,16 +8497,16 @@ snapshots:
8497
8498 read-package-up@11.0.0:
8499 dependencies:
8271 - find-up-simple: 1.0.0
8500 + find-up-simple: 1.0.1
8501 read-pkg: 9.0.1
8273 - type-fest: 4.35.0
8502 + type-fest: 4.37.0
8503
8504 read-pkg@9.0.1:
8505 dependencies:
8506 '@types/normalize-package-data': 2.4.4
8507 normalize-package-data: 6.0.2
8508 parse-json: 8.1.0
8280 - type-fest: 4.35.0
8509 + type-fest: 4.37.0
8510 unicorn-magic: 0.1.0
8511
8512 readdirp@3.6.0:
@@ -8345,38 +8574,38 @@ snapshots:
8574
8575 rfdc@1.4.1: {}
8576
8348 - rollup-plugin-visualizer@5.14.0(rollup@4.34.8):
8577 + rollup-plugin-visualizer@5.14.0(rollup@4.34.9):
8578 dependencies:
8579 open: 8.4.2
8580 picomatch: 4.0.2
8581 source-map: 0.7.4
8582 yargs: 17.7.2
8583 optionalDependencies:
8355 - rollup: 4.34.8
8584 + rollup: 4.34.9
8585
8357 - rollup@4.34.8:
8586 + rollup@4.34.9:
8587 dependencies:
8588 '@types/estree': 1.0.6
8589 optionalDependencies:
8361 - '@rollup/rollup-android-arm-eabi': 4.34.8
8362 - '@rollup/rollup-android-arm64': 4.34.8
8363 - '@rollup/rollup-darwin-arm64': 4.34.8
8364 - '@rollup/rollup-darwin-x64': 4.34.8
8365 - '@rollup/rollup-freebsd-arm64': 4.34.8
8366 - '@rollup/rollup-freebsd-x64': 4.34.8
8367 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.8
8368 - '@rollup/rollup-linux-arm-musleabihf': 4.34.8
8369 - '@rollup/rollup-linux-arm64-gnu': 4.34.8
8370 - '@rollup/rollup-linux-arm64-musl': 4.34.8
8371 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.8
8372 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8
8373 - '@rollup/rollup-linux-riscv64-gnu': 4.34.8
8374 - '@rollup/rollup-linux-s390x-gnu': 4.34.8
8375 - '@rollup/rollup-linux-x64-gnu': 4.34.8
8376 - '@rollup/rollup-linux-x64-musl': 4.34.8
8377 - '@rollup/rollup-win32-arm64-msvc': 4.34.8
8378 - '@rollup/rollup-win32-ia32-msvc': 4.34.8
8379 - '@rollup/rollup-win32-x64-msvc': 4.34.8
8590 + '@rollup/rollup-android-arm-eabi': 4.34.9
8591 + '@rollup/rollup-android-arm64': 4.34.9
8592 + '@rollup/rollup-darwin-arm64': 4.34.9
8593 + '@rollup/rollup-darwin-x64': 4.34.9
8594 + '@rollup/rollup-freebsd-arm64': 4.34.9
8595 + '@rollup/rollup-freebsd-x64': 4.34.9
8596 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.9
8597 + '@rollup/rollup-linux-arm-musleabihf': 4.34.9
8598 + '@rollup/rollup-linux-arm64-gnu': 4.34.9
8599 + '@rollup/rollup-linux-arm64-musl': 4.34.9
8600 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.9
8601 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9
8602 + '@rollup/rollup-linux-riscv64-gnu': 4.34.9
8603 + '@rollup/rollup-linux-s390x-gnu': 4.34.9
8604 + '@rollup/rollup-linux-x64-gnu': 4.34.9
8605 + '@rollup/rollup-linux-x64-musl': 4.34.9
8606 + '@rollup/rollup-win32-arm64-msvc': 4.34.9
8607 + '@rollup/rollup-win32-ia32-msvc': 4.34.9
8608 + '@rollup/rollup-win32-x64-msvc': 4.34.9
8609 fsevents: 2.3.3
8610
8611 rrweb-cssom@0.8.0: {}
@@ -8454,14 +8683,14 @@ snapshots:
8683
8684 side-channel-map@1.0.1:
8685 dependencies:
8457 - call-bound: 1.0.3
8686 + call-bound: 1.0.4
8687 es-errors: 1.3.0
8688 get-intrinsic: 1.3.0
8689 object-inspect: 1.13.4
8690
8691 side-channel-weakmap@1.0.2:
8692 dependencies:
8464 - call-bound: 1.0.3
8693 + call-bound: 1.0.4
8694 es-errors: 1.3.0
8695 get-intrinsic: 1.3.0
8696 object-inspect: 1.13.4
@@ -8569,7 +8798,7 @@ snapshots:
8798 transitivePeerDependencies:
8799 - supports-color
8800
8572 - std-env@3.8.0: {}
8801 + std-env@3.8.1: {}
8802
8803 stream-combiner@0.0.4:
8804 dependencies:
@@ -8614,6 +8843,8 @@ snapshots:
8843 dependencies:
8844 js-tokens: 9.0.1
8845
8846 + style-mod@4.1.2: {}
8847 +
8848 sucrase@3.35.0:
8849 dependencies:
8850 '@jridgewell/gen-mapping': 0.3.8
@@ -8638,8 +8869,6 @@ snapshots:
8869
8870 supports-preserve-symlinks-flag@1.0.0: {}
8871
8641 - svg-tags@1.0.0: {}
8642 -
8872 svgo@3.3.2:
8873 dependencies:
8874 '@trysound/sax': 0.2.0
@@ -8702,15 +8931,21 @@ snapshots:
8931 taze@18.6.0:
8932 dependencies:
8933 '@antfu/ni': 23.3.1
8705 - find-up-simple: 1.0.0
8934 + find-up-simple: 1.0.1
8935 ofetch: 1.4.1
8707 - package-manager-detector: 0.2.9
8936 + package-manager-detector: 0.2.11
8937 pathe: 2.0.3
8938 tinyexec: 0.3.2
8710 - unconfig: 7.1.0
8939 + unconfig: 7.3.0
8940 yaml: 2.7.0
8941 yargs: 17.7.2
8942
8943 + thememirror@2.0.1(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.36.4):
8944 + dependencies:
8945 + '@codemirror/language': 6.10.8
8946 + '@codemirror/state': 6.5.2
8947 + '@codemirror/view': 6.36.4
8948 +
8949 thenify-all@1.6.0:
8950 dependencies:
8951 thenify: 3.3.1
@@ -8738,11 +8973,11 @@ snapshots:
8973
8974 tinyspy@3.0.2: {}
8975
8741 - tldts-core@6.1.78: {}
8976 + tldts-core@6.1.82: {}
8977
8743 - tldts@6.1.78:
8978 + tldts@6.1.82:
8979 dependencies:
8745 - tldts-core: 6.1.78
8980 + tldts-core: 6.1.82
8981
8982 tmp@0.2.3: {}
8983
@@ -8756,9 +8991,9 @@ snapshots:
8991
8992 totalist@3.0.1: {}
8993
8759 - tough-cookie@5.1.1:
8994 + tough-cookie@5.1.2:
8995 dependencies:
8761 - tldts: 6.1.78
8996 + tldts: 6.1.82
8997
8998 tr46@5.0.0:
8999 dependencies:
@@ -8770,9 +9005,9 @@ snapshots:
9005
9006 trim-lines@3.0.1: {}
9007
8773 - ts-api-utils@2.0.1(typescript@5.7.3):
9008 + ts-api-utils@2.0.1(typescript@5.8.2):
9009 dependencies:
8775 - typescript: 5.7.3
9010 + typescript: 5.8.2
9011
9012 ts-interface-checker@0.1.13: {}
9013
@@ -8790,23 +9025,23 @@ snapshots:
9025 dependencies:
9026 prelude-ls: 1.2.1
9027
8793 - type-fest@0.20.2: {}
8794 -
9028 type-fest@0.21.3: {}
9029
8797 - type-fest@4.35.0: {}
9030 + type-fest@4.37.0: {}
9031
8799 - typescript@5.7.3: {}
9032 + typescript@5.8.2: {}
9033
9034 uc.micro@2.1.0: {}
9035
9036 ufo@1.5.4: {}
9037
8805 - unconfig@7.1.0:
9038 + unconfig@7.3.0:
9039 dependencies:
8807 - '@antfu/utils': 8.1.1
9040 + '@antfu/utils': 9.1.0
9041 + '@quansync/fs': 0.1.1
9042 defu: 6.1.4
9043 jiti: 2.4.2
9044 + quansync: 0.2.8
9045
9046 unctx@2.4.1:
9047 dependencies:
@@ -8826,7 +9061,7 @@ snapshots:
9061 acorn: 8.14.0
9062 escape-string-regexp: 5.0.0
9063 estree-walker: 3.0.3
8829 - local-pkg: 1.0.0
9064 + local-pkg: 1.1.1
9065 magic-string: 0.30.17
9066 mlly: 1.7.4
9067 pathe: 2.0.3
@@ -8909,10 +9144,10 @@ snapshots:
9144
9145 validator@13.12.0: {}
9146
8912 - vdirs@0.1.8(vue@3.5.13(typescript@5.7.3)):
9147 + vdirs@0.1.8(vue@3.5.13(typescript@5.8.2)):
9148 dependencies:
9149 evtd: 0.2.4
8915 - vue: 3.5.13(typescript@5.7.3)
9150 + vue: 3.5.13(typescript@5.8.2)
9151
9152 verror@1.10.0:
9153 dependencies:
@@ -8930,28 +9165,28 @@ snapshots:
9165 '@types/unist': 3.0.3
9166 vfile-message: 4.0.2
9167
8933 - vite-bundle-visualizer@1.2.1(rollup@4.34.8):
9168 + vite-bundle-visualizer@1.2.1(rollup@4.34.9):
9169 dependencies:
9170 cac: 6.7.14
9171 import-from-esm: 1.3.4
8937 - rollup-plugin-visualizer: 5.14.0(rollup@4.34.8)
9172 + rollup-plugin-visualizer: 5.14.0(rollup@4.34.9)
9173 tmp: 0.2.3
9174 transitivePeerDependencies:
9175 - rolldown
9176 - rollup
9177 - supports-color
9178
8944 - vite-hot-client@0.2.4(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9179 + vite-hot-client@0.2.4(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9180 dependencies:
8946 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9181 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9182
8948 - vite-node@3.0.7(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0):
9183 + vite-node@3.0.8(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0):
9184 dependencies:
9185 cac: 6.7.14
9186 debug: 4.4.0(supports-color@8.1.1)
9187 es-module-lexer: 1.6.0
9188 pathe: 2.0.3
8954 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9189 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9190 transitivePeerDependencies:
9191 - '@types/node'
9192 - jiti
@@ -8966,10 +9201,10 @@ snapshots:
9201 - tsx
9202 - yaml
9203
8969 - vite-plugin-inspect@0.8.9(rollup@4.34.8)(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9204 + vite-plugin-inspect@0.8.9(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9205 dependencies:
9206 '@antfu/utils': 0.7.10
8972 - '@rollup/pluginutils': 5.1.4(rollup@4.34.8)
9207 + '@rollup/pluginutils': 5.1.4(rollup@4.34.9)
9208 debug: 4.4.0(supports-color@8.1.1)
9209 error-stack-parser-es: 0.1.5
9210 fs-extra: 11.3.0
@@ -8977,84 +9212,84 @@ snapshots:
9212 perfect-debounce: 1.0.0
9213 picocolors: 1.1.1
9214 sirv: 3.0.1
8980 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9215 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9216 transitivePeerDependencies:
9217 - rollup
9218 - supports-color
9219
8985 - vite-plugin-vue-devtools@7.7.2(rollup@4.34.8)(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)):
9220 + vite-plugin-vue-devtools@7.7.2(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)):
9221 dependencies:
8987 - '@vue/devtools-core': 7.7.2(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
9222 + '@vue/devtools-core': 7.7.2(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))
9223 '@vue/devtools-kit': 7.7.2
9224 '@vue/devtools-shared': 7.7.2
9225 execa: 9.5.2
9226 sirv: 3.0.1
8992 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
8993 - vite-plugin-inspect: 0.8.9(rollup@4.34.8)(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
8994 - vite-plugin-vue-inspector: 5.3.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
9227 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9228 + vite-plugin-inspect: 0.8.9(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
9229 + vite-plugin-vue-inspector: 5.3.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
9230 transitivePeerDependencies:
9231 - '@nuxt/kit'
9232 - rollup
9233 - supports-color
9234 - vue
9235
9001 - vite-plugin-vue-inspector@5.3.1(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9236 + vite-plugin-vue-inspector@5.3.1(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)):
9237 dependencies:
9238 '@babel/core': 7.26.9
9239 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.9)
9240 '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9)
9241 '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9)
9242 '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9)
9008 - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.9)
9243 + '@vue/babel-plugin-jsx': 1.3.0(@babel/core@7.26.9)
9244 '@vue/compiler-dom': 3.5.13
9245 kolorist: 1.8.0
9246 magic-string: 0.30.17
9012 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9247 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9248 transitivePeerDependencies:
9249 - supports-color
9250
9016 - vite-svg-loader@5.1.0(vue@3.5.13(typescript@5.7.3)):
9251 + vite-svg-loader@5.1.0(vue@3.5.13(typescript@5.8.2)):
9252 dependencies:
9253 svgo: 3.3.2
9019 - vue: 3.5.13(typescript@5.7.3)
9254 + vue: 3.5.13(typescript@5.8.2)
9255
9021 - vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0):
9256 + vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0):
9257 dependencies:
9258 esbuild: 0.25.0
9259 postcss: 8.5.3
9025 - rollup: 4.34.8
9260 + rollup: 4.34.9
9261 optionalDependencies:
9027 - '@types/node': 22.13.5
9262 + '@types/node': 22.13.9
9263 fsevents: 2.3.3
9264 jiti: 2.4.2
9265 sass: 1.85.1
9266 yaml: 2.7.0
9267
9033 - vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0):
9268 + vitest@3.0.8(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(jsdom@26.0.0)(sass@1.85.1)(yaml@2.7.0):
9269 dependencies:
9035 - '@vitest/expect': 3.0.7
9036 - '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
9037 - '@vitest/pretty-format': 3.0.7
9038 - '@vitest/runner': 3.0.7
9039 - '@vitest/snapshot': 3.0.7
9040 - '@vitest/spy': 3.0.7
9041 - '@vitest/utils': 3.0.7
9270 + '@vitest/expect': 3.0.8
9271 + '@vitest/mocker': 3.0.8(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0))
9272 + '@vitest/pretty-format': 3.0.8
9273 + '@vitest/runner': 3.0.8
9274 + '@vitest/snapshot': 3.0.8
9275 + '@vitest/spy': 3.0.8
9276 + '@vitest/utils': 3.0.8
9277 chai: 5.2.0
9278 debug: 4.4.0(supports-color@8.1.1)
9044 - expect-type: 1.1.0
9279 + expect-type: 1.2.0
9280 magic-string: 0.30.17
9281 pathe: 2.0.3
9047 - std-env: 3.8.0
9282 + std-env: 3.8.1
9283 tinybench: 2.9.0
9284 tinyexec: 0.3.2
9285 tinypool: 1.0.2
9286 tinyrainbow: 2.0.0
9052 - vite: 6.2.0(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9053 - vite-node: 3.0.7(@types/node@22.13.5)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9287 + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9288 + vite-node: 3.0.8(@types/node@22.13.9)(jiti@2.4.2)(sass@1.85.1)(yaml@2.7.0)
9289 why-is-node-running: 2.3.0
9290 optionalDependencies:
9291 '@types/debug': 4.1.12
9057 - '@types/node': 22.13.5
9292 + '@types/node': 22.13.9
9293 jsdom: 26.0.0
9294 transitivePeerDependencies:
9295 - jiti
@@ -9070,96 +9305,107 @@ snapshots:
9305 - tsx
9306 - yaml
9307
9073 - vooks@0.2.12(vue@3.5.13(typescript@5.7.3)):
9308 + vooks@0.2.12(vue@3.5.13(typescript@5.8.2)):
9309 dependencies:
9310 evtd: 0.2.4
9076 - vue: 3.5.13(typescript@5.7.3)
9311 + vue: 3.5.13(typescript@5.8.2)
9312
9313 vscode-uri@3.1.0: {}
9314
9080 - vue-advanced-cropper@2.8.9(vue@3.5.13(typescript@5.7.3)):
9315 + vue-advanced-cropper@2.8.9(vue@3.5.13(typescript@5.8.2)):
9316 dependencies:
9317 classnames: 2.5.1
9318 debounce: 1.2.1
9319 easy-bem: 1.1.1
9085 - vue: 3.5.13(typescript@5.7.3)
9320 + vue: 3.5.13(typescript@5.8.2)
9321 +
9322 + vue-codemirror@6.1.1(codemirror@6.0.1)(vue@3.5.13(typescript@5.8.2)):
9323 + dependencies:
9324 + '@codemirror/commands': 6.8.0
9325 + '@codemirror/language': 6.10.8
9326 + '@codemirror/state': 6.5.2
9327 + '@codemirror/view': 6.36.4
9328 + codemirror: 6.0.1
9329 + vue: 3.5.13(typescript@5.8.2)
9330
9087 - vue-component-type-helpers@2.2.4: {}
9331 + vue-component-type-helpers@2.2.8: {}
9332
9089 - vue-eslint-parser@9.4.3(eslint@9.21.0(jiti@2.4.2)):
9333 + vue-eslint-parser@10.1.1(eslint@9.21.0(jiti@2.4.2)):
9334 dependencies:
9335 debug: 4.4.0(supports-color@8.1.1)
9336 eslint: 9.21.0(jiti@2.4.2)
9093 - eslint-scope: 7.2.2
9094 - eslint-visitor-keys: 3.4.3
9095 - espree: 9.6.1
9337 + eslint-scope: 8.2.0
9338 + eslint-visitor-keys: 4.2.0
9339 + espree: 10.3.0
9340 esquery: 1.6.0
9341 lodash: 4.17.21
9342 semver: 7.7.1
9343 transitivePeerDependencies:
9344 - supports-color
9345
9102 - vue-highlight-words@3.0.1(vue@3.5.13(typescript@5.7.3)):
9346 + vue-highlight-words@3.0.1(vue@3.5.13(typescript@5.8.2)):
9347 dependencies:
9348 highlight-words-core: 1.2.3
9105 - vue: 3.5.13(typescript@5.7.3)
9349 + vue: 3.5.13(typescript@5.8.2)
9350
9107 - vue-i18n@11.1.1(vue@3.5.13(typescript@5.7.3)):
9351 + vue-i18n@11.1.1(vue@3.5.13(typescript@5.8.2)):
9352 dependencies:
9353 '@intlify/core-base': 11.1.1
9354 '@intlify/shared': 11.1.1
9355 '@vue/devtools-api': 6.6.4
9112 - vue: 3.5.13(typescript@5.7.3)
9356 + vue: 3.5.13(typescript@5.8.2)
9357
9114 - vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)):
9358 + vue-router@4.5.0(vue@3.5.13(typescript@5.8.2)):
9359 dependencies:
9360 '@vue/devtools-api': 6.6.4
9117 - vue: 3.5.13(typescript@5.7.3)
9361 + vue: 3.5.13(typescript@5.8.2)
9362
9119 - vue-sjv@0.0.6(vue@3.5.13(typescript@5.7.3)):
9363 + vue-sjv@0.0.6(vue@3.5.13(typescript@5.8.2)):
9364 dependencies:
9121 - vue: 3.5.13(typescript@5.7.3)
9365 + vue: 3.5.13(typescript@5.8.2)
9366
9123 - vue-tsc@2.2.4(typescript@5.7.3):
9367 + vue-tsc@2.2.8(typescript@5.8.2):
9368 dependencies:
9369 '@volar/typescript': 2.4.11
9126 - '@vue/language-core': 2.2.4(typescript@5.7.3)
9127 - typescript: 5.7.3
9370 + '@vue/language-core': 2.2.8(typescript@5.8.2)
9371 + typescript: 5.8.2
9372
9129 - vue3-apexcharts@1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.7.3)):
9373 + vue3-apexcharts@1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.8.2)):
9374 dependencies:
9375 apexcharts: 4.5.0
9132 - vue: 3.5.13(typescript@5.7.3)
9376 + vue: 3.5.13(typescript@5.8.2)
9377
9134 - vue3-marquee@4.2.2(vue@3.5.13(typescript@5.7.3)):
9378 + vue3-marquee@4.2.2(vue@3.5.13(typescript@5.8.2)):
9379 dependencies:
9136 - vue: 3.5.13(typescript@5.7.3)
9380 + vue: 3.5.13(typescript@5.8.2)
9381
9138 - vue@3.5.13(typescript@5.7.3):
9382 + vue@3.5.13(typescript@5.8.2):
9383 dependencies:
9384 '@vue/compiler-dom': 3.5.13
9385 '@vue/compiler-sfc': 3.5.13
9386 '@vue/runtime-dom': 3.5.13
9143 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3))
9387 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2))
9388 '@vue/shared': 3.5.13
9389 optionalDependencies:
9146 - typescript: 5.7.3
9390 + typescript: 5.8.2
9391
9148 - vuedraggable@4.1.0(vue@3.5.13(typescript@5.7.3)):
9392 + vuedraggable@4.1.0(vue@3.5.13(typescript@5.8.2)):
9393 dependencies:
9394 sortablejs: 1.14.0
9151 - vue: 3.5.13(typescript@5.7.3)
9395 + vue: 3.5.13(typescript@5.8.2)
9396
9153 - vueuc@0.4.64(vue@3.5.13(typescript@5.7.3)):
9397 + vueuc@0.4.64(vue@3.5.13(typescript@5.8.2)):
9398 dependencies:
9155 - '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.7.3))
9399 + '@css-render/vue3-ssr': 0.15.14(vue@3.5.13(typescript@5.8.2))
9400 '@juggle/resize-observer': 3.4.0
9401 css-render: 0.15.14
9402 evtd: 0.2.4
9403 seemly: 0.3.10
9160 - vdirs: 0.1.8(vue@3.5.13(typescript@5.7.3))
9161 - vooks: 0.2.12(vue@3.5.13(typescript@5.7.3))
9162 - vue: 3.5.13(typescript@5.7.3)
9404 + vdirs: 0.1.8(vue@3.5.13(typescript@5.8.2))
9405 + vooks: 0.2.12(vue@3.5.13(typescript@5.8.2))
9406 + vue: 3.5.13(typescript@5.8.2)
9407 +
9408 + w3c-keyname@2.2.8: {}
9409
9410 w3c-xmlserializer@5.0.0:
9411 dependencies:
@@ -9243,10 +9489,9 @@ snapshots:
9489
9490 yallist@4.0.0: {}
9491
9246 - yaml-eslint-parser@1.2.3:
9492 + yaml-eslint-parser@1.3.0:
9493 dependencies:
9494 eslint-visitor-keys: 3.4.3
9249 - lodash: 4.17.21
9495 yaml: 2.7.0
9496
9497 yaml@1.10.2: {}
frontend/src/api/endpoints/activeResponse.ts
+1 -1
@@ -24,7 +24,7 @@ export default {
24 },
25 invoke(params: InvokeRequest) {
26 const payload = {
27 - endpoint: "active-response",
27 + endpoint: "/active-response",
28 arguments: [],
29 command: params.activeResponseName.toLowerCase(),
30 custom: true,
frontend/src/api/endpoints/sysmonConfig.ts new
+27
@@ -0,0 +1,27 @@
1 +import type { FlaskBaseResponse } from "@/types/flask.d"
2 +import type { ConfigContent, DeployConfigResponse, UploadConfigFileResponse } from "@/types/sysmonConfig.d"
3 +import { HttpClient } from "../httpClient"
4 +
5 +export default {
6 + getAll() {
7 + return HttpClient.get<FlaskBaseResponse & { customer_codes: string[] }>(`/sysmon_config`)
8 + },
9 + getConfigContent(customerCode: string) {
10 + return HttpClient.get<FlaskBaseResponse & ConfigContent>(`/sysmon_config/content/${customerCode}`)
11 + },
12 + getConfigFile(customerCode: string) {
13 + return HttpClient.get<Blob>(`/sysmon_config/${customerCode}`, {
14 + responseType: "blob"
15 + })
16 + },
17 + uploadConfigFile(customerCode: string, config: File) {
18 + const form = new FormData()
19 + form.append("file", new Blob([config], { type: config.type }), config.name)
20 + form.append("customer_code", customerCode)
21 +
22 + return HttpClient.post<FlaskBaseResponse & UploadConfigFileResponse>(`/sysmon_config/upload`, form)
23 + },
24 + deployConfig(customerCode: string) {
25 + return HttpClient.post<FlaskBaseResponse & DeployConfigResponse>(`/sysmon_config/deploy/${customerCode}`)
26 + }
27 +}
frontend/src/api/index.ts
+2
@@ -23,6 +23,7 @@ import scheduler from "./endpoints/scheduler"
23 import sigma from "./endpoints/sigma"
24 import soc from "./endpoints/soc"
25 import stackProvisioning from "./endpoints/stackProvisioning"
26 +import sysmonConfig from "./endpoints/sysmonConfig"
27 import threatIntel from "./endpoints/threatIntel"
28 import users from "./endpoints/users"
29 import webVulnerabilityAssessment from "./endpoints/webVulnerabilityAssessment"
@@ -55,5 +56,6 @@ export default {
56 incidentManagement,
57 sigma,
58 users,
59 + sysmonConfig,
60 portainer
61 }
frontend/src/app-layouts/common/Navbar/items.tsx
+30 -11
@@ -50,18 +50,37 @@ export default function getItems(): MenuMixedOption[] {
50 icon: renderIcon(IndiciesIcon)
51 },
52 {
53 - label: () =>
54 - h(
55 - RouterLink,
56 - {
57 - to: {
58 - name: "Agents"
59 - }
60 - },
61 - { default: () => "Agents" }
62 - ),
53 + label: "Agents",
54 key: "Agents",
64 - icon: renderIcon(AgentsIcon)
55 + icon: renderIcon(AgentsIcon),
56 + children: [
57 + {
58 + label: () =>
59 + h(
60 + RouterLink,
61 + {
62 + to: {
63 + name: "Agents"
64 + }
65 + },
66 + { default: () => "Agents list" }
67 + ),
68 + key: "Agents"
69 + },
70 + {
71 + label: () =>
72 + h(
73 + RouterLink,
74 + {
75 + to: {
76 + name: "SysmonConfig"
77 + }
78 + },
79 + { default: () => "Sysmon Config" }
80 + ),
81 + key: "SysmonConfig"
82 + }
83 + ]
84 },
85 {
86 label: () =>
frontend/src/components/common/SegmentedPage.vue
+38 -15
@@ -13,8 +13,11 @@
13 >
14 <template #[tplNameSide]>
15 <div v-if="sidebarAvailable" ref="sidebar" class="sidebar flex flex-col">
16 - <div v-if="$slots['sidebar-header']" class="sidebar-header flex items-center">
16 + <div v-if="$slots['sidebar-header']" class="sidebar-header flex items-center justify-between">
17 <slot name="sidebar-header" />
18 + <n-button text class="close-btn" @click="sidebarOpen = false">
19 + <Icon :size="24" :name="CloseIcon" />
20 + </n-button>
21 </div>
22 <div v-if="$slots['sidebar-content']" class="sidebar-main grow">
23 <n-scrollbar class="max-h-full">
@@ -99,7 +102,11 @@ const {
102 useMainScroll = true,
103 defaultSplit = 0.3,
104 maxSidebarWidth = 450,
102 - minSidebarWidth = 250
105 + minSidebarWidth = 250,
106 + padding = "30px",
107 + paddingMobile = "20px",
108 + toolbarHeight = "70px",
109 + toolbarHeightMobile = "62px"
110 } = defineProps<{
111 sidebarPosition?: SidebarPosition
112 hideMenuBtn?: boolean
@@ -113,6 +120,10 @@ const {
120 defaultSplit?: number
121 maxSidebarWidth?: number
122 minSidebarWidth?: number
123 + padding?: string
124 + paddingMobile?: string
125 + toolbarHeight?: string
126 + toolbarHeightMobile?: string
127 }>()
128
129 const emit = defineEmits<{
@@ -121,6 +132,7 @@ const emit = defineEmits<{
132 }>()
133
134 const MenuIcon = "ph:list-light"
135 +const CloseIcon = "carbon:close"
136 const SplitIcon = "carbon:draggable"
137
138 const splitPane = ref()
@@ -181,7 +193,8 @@ onMounted(() => {
193
194 <style lang="scss" scoped>
195 .wrapper {
184 - --mb-toolbar-height: 70px;
196 + --mb-toolbar-height: v-bind(toolbarHeight);
197 + --padding-x: v-bind(padding);
198 position: relative;
199 height: 100%;
200 overflow: hidden;
@@ -232,21 +245,25 @@ onMounted(() => {
245 border-block-end: 1px solid var(--border-color);
246 min-height: var(--mb-toolbar-height);
247 height: var(--mb-toolbar-height);
235 - padding: 0 30px;
248 + padding: 0 var(--padding-x);
249 +
250 + .close-btn {
251 + display: none;
252 + }
253 }
254
255 .sidebar-main {
256 overflow: hidden;
257
258 .sidebar-main-content {
242 - padding: 30px;
259 + padding: var(--padding-x);
260 }
261 }
262
263 .sidebar-footer {
264 border-block-start: 1px solid var(--border-color);
265 min-height: var(--mb-toolbar-height);
249 - padding: 0 30px;
266 + padding: 0 var(--padding-x);
267 }
268 }
269
@@ -268,7 +285,7 @@ onMounted(() => {
285 border-block-end: 1px solid var(--border-color);
286 min-height: var(--mb-toolbar-height);
287 height: var(--mb-toolbar-height);
271 - padding: 0 30px;
288 + padding: 0 var(--padding-x);
289 gap: 18px;
290 line-height: 1.3;
291 container-type: inline-size;
@@ -285,14 +302,14 @@ onMounted(() => {
302 }
303
304 .main-content {
288 - padding: 30px;
305 + padding: var(--padding-x);
306 }
307 }
308
309 .main-footer {
310 container-type: inline-size;
311 border-block-start: 1px solid var(--border-color);
295 - padding: 0 30px;
312 + padding: 0 var(--padding-x);
313
314 .wrap {
315 min-height: calc(var(--mb-toolbar-height) - 1px);
@@ -311,7 +328,9 @@ onMounted(() => {
328 }
329
330 @media (max-width: 700px) {
314 - --mb-toolbar-height: 62px;
331 + --mb-toolbar-height: v-bind(toolbarHeightMobile);
332 + --padding-x: v-bind(paddingMobile);
333 +
334 height: 100%;
335 overflow: hidden;
336 border-radius: 0;
@@ -357,18 +376,22 @@ onMounted(() => {
376
377 .sidebar-header,
378 .sidebar-footer {
360 - padding: 0 20px;
379 + padding: 0 var(--padding-x);
380 +
381 + .close-btn {
382 + display: flex;
383 + }
384 }
385
386 .sidebar-main {
387 .sidebar-main-content {
365 - padding: 20px;
388 + padding: var(--padding-x);
389 }
390 }
391 }
392 .main {
393 .main-toolbar {
371 - padding: 0 20px;
394 + padding: 0 var(--padding-x);
395 gap: 14px;
396
397 .menu-btn {
@@ -378,11 +401,11 @@ onMounted(() => {
401
402 .main-view {
403 .main-content {
381 - padding: 20px;
404 + padding: var(--padding-x);
405 }
406 }
407 .main-footer {
385 - padding: 0 20px;
408 + padding: 0 var(--padding-x);
409 }
410 }
411
frontend/src/components/common/XMLEditor.vue new
+100
@@ -0,0 +1,100 @@
1 +<template>
2 + <codemirror
3 + v-model="code"
4 + placeholder="Code goes here..."
5 + autofocus
6 + indent-with-tab
7 + :tab-size="4"
8 + :extensions
9 + style="height: 100%"
10 + @ready="handleReady"
11 + />
12 +</template>
13 +
14 +<script setup lang="ts">
15 +// EVALUATE: https://www.npmjs.com/package/vue3-ace-editor
16 +// EVALUATE: https://github.surmon.me/vue-codemirror
17 +// EVALUATE: https://www.npmjs.com/package/@guolao/vue-monaco-editor
18 +
19 +import type { Extension } from "@codemirror/state"
20 +import type { EditorView } from "@codemirror/view"
21 +import { useThemeStore } from "@/stores/theme"
22 +import { redo, redoDepth, undo, undoDepth } from "@codemirror/commands"
23 +import { xml } from "@codemirror/lang-xml"
24 +import { oneDark } from "@codemirror/theme-one-dark"
25 +import { tomorrow } from "thememirror"
26 +import { computed, onMounted, ref, shallowRef, watch } from "vue"
27 +import { Codemirror } from "vue-codemirror"
28 +
29 +export interface XMLEditorCtx {
30 + undo: () => void
31 + redo: () => void
32 + canUndo: () => boolean
33 + canRedo: () => boolean
34 +}
35 +
36 +const emit = defineEmits<{
37 + (e: "mounted", value: XMLEditorCtx): void
38 +}>()
39 +
40 +const code = defineModel<string>("code", { default: "" })
41 +
42 +const themeStore = useThemeStore()
43 +const isDark = computed<boolean>(() => themeStore.isThemeDark)
44 +
45 +const extensions = computed(() => {
46 + const list: Extension[] = [xml()]
47 +
48 + if (isDark.value) {
49 + list.push(oneDark)
50 + } else {
51 + list.push(tomorrow)
52 + }
53 +
54 + return list
55 +})
56 +
57 +const cmView = shallowRef<EditorView | null>(null)
58 +const canUndo = ref<boolean>(false)
59 +const canRedo = ref<boolean>(false)
60 +
61 +function updateHistoryState() {
62 + canUndo.value = cmView.value ? !!undoDepth(cmView.value.state) : false
63 + canRedo.value = cmView.value ? !!redoDepth(cmView.value.state) : false
64 +}
65 +
66 +function handleReady({ view }: { view: EditorView }) {
67 + cmView.value = view
68 +}
69 +
70 +function handleUndo() {
71 + if (cmView.value) {
72 + undo({
73 + state: cmView.value.state,
74 + dispatch: cmView.value.dispatch
75 + })
76 + }
77 +}
78 +
79 +function handleRedo() {
80 + if (cmView.value) {
81 + redo({
82 + state: cmView.value.state,
83 + dispatch: cmView.value.dispatch
84 + })
85 + }
86 +}
87 +
88 +watch(code, () => {
89 + updateHistoryState()
90 +})
91 +
92 +onMounted(() => {
93 + emit("mounted", {
94 + undo: handleUndo,
95 + redo: handleRedo,
96 + canRedo: () => canRedo.value,
97 + canUndo: () => canUndo.value
98 + })
99 +})
100 +</script>
frontend/src/components/customers/CustomerAgents.vue
+1 -1
@@ -4,7 +4,7 @@
4 <AgentCard
5 v-for="agent in list"
6 :key="agent.agent_id"
7 - :agent="agent"
7 + :agent
8 embedded
9 show-actions
10 class="item-appear item-appear-bottom item-appear-005"
frontend/src/router/index.ts
+6
@@ -49,6 +49,12 @@ const router = createRouter({
49 name: "Agent",
50 component: () => import("@/views/agents/Overview.vue"),
51 meta: { title: "Agent", skipPin: true }
52 + },
53 + {
54 + path: "sysmon-config",
55 + name: "SysmonConfig",
56 + component: () => import("@/views/agents/SysmonConfig.vue"),
57 + meta: { title: "Sysmon Config" }
58 }
59 ]
60 },
frontend/src/types/sysmonConfig.d.ts new
+17
@@ -0,0 +1,17 @@
1 +export interface ConfigContent {
2 + customer_code: string
3 + config_content: string
4 +}
5 +
6 +export interface UploadConfigFileResponse {
7 + customer_code: string
8 + filename: string
9 + overwritten: boolean
10 +}
11 +
12 +export interface DeployConfigResponse {
13 + customer_code: string
14 + worker_success: boolean
15 + worker_message: string
16 + error_detail: string
17 +}
frontend/src/views/agents/Agents.vue
+1 -1
@@ -21,7 +21,7 @@
21 <AgentCard
22 v-for="agent in itemsPaginated"
23 :key="agent.agent_id"
24 - :agent="agent"
24 + :agent
25 show-actions
26 hoverable
27 clickable
frontend/src/views/agents/SysmonConfig.vue new
+243
@@ -0,0 +1,243 @@
1 +<template>
2 + <div class="page page-wrapped page-without-footer flex flex-col">
3 + <SegmentedPage
4 + main-content-class="!p-0 overflow-hidden grow flex h-full"
5 + :use-main-scroll="false"
6 + padding="18px"
7 + enable-resize
8 + toolbar-height="54px"
9 + >
10 + <template #sidebar-header>Customers</template>
11 + <template #sidebar-content>
12 + <n-spin :show="loadingList">
13 + <template v-if="customers.length">
14 + <div class="flex flex-col gap-4">
15 + <CardEntity
16 + v-for="customer of customers"
17 + :key="customer"
18 + hoverable
19 + clickable
20 + :highlighted="customer === currentConfig?.customer_code"
21 + @click.stop="loadConfig(customer)"
22 + >
23 + <div class="flex items-center justify-between">
24 + <div>{{ customer }}</div>
25 + <n-button text @click.stop="gotoCustomer({ code: customer })">
26 + <template #icon>
27 + <Icon :size="14" :name="LinkIcon" />
28 + </template>
29 + </n-button>
30 + </div>
31 + </CardEntity>
32 + </div>
33 + </template>
34 + <template v-else>
35 + <n-empty v-if="!loadingList" description="No items found" class="h-48 justify-center" />
36 + </template>
37 + </n-spin>
38 + </template>
39 + <template #main-toolbar>
40 + <div v-if="currentConfig" class="@container flex items-center justify-between">
41 + <div class="flex items-center gap-3 md:gap-4">
42 + <n-button
43 + v-if="xmlEditorCTX"
44 + size="small"
45 + :disabled="!xmlEditorCTX.canUndo()"
46 + @click="xmlEditorCTX.undo"
47 + >
48 + <div class="flex items-center gap-2">
49 + <Icon :name="UndoIcon" />
50 + <span class="@sm:flex hidden">Undo</span>
51 + </div>
52 + </n-button>
53 + <n-button
54 + v-if="xmlEditorCTX"
55 + size="small"
56 + :disabled="!xmlEditorCTX.canRedo()"
57 + @click="xmlEditorCTX.redo"
58 + >
59 + <div class="flex items-center gap-2">
60 + <span class="@sm:flex hidden">Redo</span>
61 + <Icon :name="RedoIcon" />
62 + </div>
63 + </n-button>
64 + </div>
65 + <div class="flex items-center gap-3 md:gap-4">
66 + <n-button
67 + :loading="uploadingConfig"
68 + size="small"
69 + type="primary"
70 + :disabled="!isDirty"
71 + @click="uploadConfigFile()"
72 + >
73 + <div class="flex items-center gap-2">
74 + <Icon :name="UploadIcon" />
75 + <span class="@xs:flex hidden">Upload</span>
76 + </div>
77 + </n-button>
78 + <n-button :loading="deployingConfig" size="small" type="success" @click="deployConfig()">
79 + <div class="flex items-center gap-2">
80 + <Icon :name="DeployIcon" />
81 + <span class="@xs:flex hidden">Deploy</span>
82 + </div>
83 + </n-button>
84 + </div>
85 + </div>
86 + </template>
87 + <template #main-content>
88 + <n-spin
89 + :show="loadingConfig || uploadingConfig || deployingConfig"
90 + class="flex h-full w-full overflow-hidden"
91 + content-class="overflow-hidden grow h-full flex flex-col justify-center"
92 + >
93 + <template v-if="currentConfig">
94 + <XMLEditor
95 + v-model="currentConfig.config_content"
96 + class="scrollbar-styled text-sm"
97 + @mounted="xmlEditorCTX = $event"
98 + />
99 + </template>
100 + <template v-else>
101 + <n-empty v-if="!loadingConfig" description="Select a customer" class="h-48 justify-center" />
102 + </template>
103 + </n-spin>
104 + </template>
105 + </SegmentedPage>
106 + </div>
107 +</template>
108 +
109 +<script setup lang="ts">
110 +import type { XMLEditorCtx } from "@/components/common/XMLEditor.vue"
111 +import type { ConfigContent } from "@/types/sysmonConfig.d"
112 +import Api from "@/api"
113 +import CardEntity from "@/components/common/cards/CardEntity.vue"
114 +import Icon from "@/components/common/Icon.vue"
115 +import SegmentedPage from "@/components/common/SegmentedPage.vue"
116 +import XMLEditor from "@/components/common/XMLEditor.vue"
117 +import { useGoto } from "@/composables/useGoto"
118 +import _clone from "lodash/cloneDeep"
119 +import { NButton, NEmpty, NSpin, useMessage } from "naive-ui"
120 +import { computed, onBeforeMount, ref } from "vue"
121 +
122 +const message = useMessage()
123 +const { gotoCustomer } = useGoto()
124 +const loadingList = ref(false)
125 +const loadingConfig = ref(false)
126 +const uploadingConfig = ref(false)
127 +const deployingConfig = ref(false)
128 +const customers = ref<string[]>([])
129 +const currentConfig = ref<ConfigContent | null>(null)
130 +const backupConfig = ref<ConfigContent | null>(null)
131 +const xmlEditorCTX = ref<XMLEditorCtx | null>(null)
132 +const UndoIcon = "carbon:undo"
133 +const RedoIcon = "carbon:redo"
134 +const LinkIcon = "carbon:launch"
135 +const DeployIcon = "carbon:deploy"
136 +const UploadIcon = "carbon:cloud-upload"
137 +
138 +const isDirty = computed(() => currentConfig.value?.config_content !== backupConfig.value?.config_content)
139 +
140 +function loadConfig(customerCode: string) {
141 + if (customerCode !== currentConfig.value?.customer_code) {
142 + getConfigContent(customerCode)
143 + }
144 +}
145 +
146 +function getList() {
147 + loadingList.value = true
148 +
149 + Api.sysmonConfig
150 + .getAll()
151 + .then(res => {
152 + if (res.data.success) {
153 + customers.value = res.data.customer_codes || []
154 + } else {
155 + message.error(res.data?.message || "An error occurred. Please try again later.")
156 + }
157 + })
158 + .catch(err => {
159 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
160 + })
161 + .finally(() => {
162 + loadingList.value = false
163 + })
164 +}
165 +
166 +function getConfigContent(customerCode: string) {
167 + loadingConfig.value = true
168 +
169 + Api.sysmonConfig
170 + .getConfigContent(customerCode)
171 + .then(res => {
172 + if (res.data.success) {
173 + currentConfig.value = _clone(res.data)
174 + backupConfig.value = _clone(res.data)
175 + } else {
176 + message.error(res.data?.message || "An error occurred. Please try again later.")
177 + }
178 + })
179 + .catch(err => {
180 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
181 + })
182 + .finally(() => {
183 + loadingConfig.value = false
184 + })
185 +}
186 +
187 +function uploadConfigFile() {
188 + if (currentConfig.value) {
189 + uploadingConfig.value = true
190 +
191 + Api.sysmonConfig
192 + .uploadConfigFile(
193 + currentConfig.value.customer_code,
194 + new File(
195 + [currentConfig.value.config_content],
196 + `sysmon_config-${currentConfig.value.customer_code}.xml`,
197 + { type: "text/xml;charset=utf-8" }
198 + )
199 + )
200 + .then(res => {
201 + if (res.data.success) {
202 + currentConfig.value = _clone(currentConfig.value)
203 + backupConfig.value = _clone(currentConfig.value)
204 + message.success("Sysmon Config uploaded Successfully")
205 + } else {
206 + message.error("An error occurred. Please try again later.")
207 + }
208 + })
209 + .catch(err => {
210 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
211 + })
212 + .finally(() => {
213 + uploadingConfig.value = false
214 + })
215 + }
216 +}
217 +
218 +function deployConfig() {
219 + if (currentConfig.value) {
220 + deployingConfig.value = true
221 +
222 + Api.sysmonConfig
223 + .deployConfig(currentConfig.value.customer_code)
224 + .then(res => {
225 + if (res.data.success) {
226 + message.success("Sysmon Config deployed successfully")
227 + } else {
228 + message.error("An error occurred. Please try again later.")
229 + }
230 + })
231 + .catch(err => {
232 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
233 + })
234 + .finally(() => {
235 + deployingConfig.value = false
236 + })
237 + }
238 +}
239 +
240 +onBeforeMount(() => {
241 + getList()
242 +})
243 +</script>
frontend/tsconfig.node.json
+1
@@ -7,6 +7,7 @@
7 "module": "ESNext",
8
9 "moduleResolution": "bundler",
10 + "types": ["cypress", "node"],
11 "allowImportingTsExtensions": true,
12
13 "strict": true,