@cryptotaxi247 / CoPilot / commits / 9277e465

Customer provisioning (#111)

* updated customer types * added customer provision api * updated customer types * Refactor customer_name to customer_code in provision.py * Fix wazuh_last_seen value when agent_last_seen is 'Unknown' * Update Wazuh Indexer credentials and load environment variables * Update environment variables * Update connector_id in ask_socfortress and socfortress routes * updated customer types * updated customer provision api * added customer provision component * added customer provision wizard component * updated customer provision wizard component * Refactor check_customermeta_exists function to use customer_code instead of customer_name * Update Wazuh worker connector ID in provision.py * Update Wazuh worker connector ID in decommission.py * updated customer provision wizard component * updated customer provision wizard component * Update universal_models.py with logger and datetime import * updated customer provision wizard component * Handle organization deletion errors in Grafana service * Add return statement to delete_grafana_organization function * Add delete functionality for agents in the backend * Remove RabbitMQ connector configuration * updated dependencies * optimize connector population * updated customer card component --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Dec 28, 2023 at 07:15 UTC 9277e4655b84f9b2bce6d3a76e7388e3ff2dc61a
26 files changed +1667 -1426
.env.example
+44
@@ -9,3 +9,47 @@ VITE_UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD=50000
9
10 # value in seconds
11 VITE_HEALTHCHECKS_INTERVAL=120
12 +
13 +# Connector Credentials
14 +WAZUH_INDEXER_URL=https://wazuh-indexer.socfortress.local:9200
15 +WAZUH_INDEXER_USERNAME=admin
16 +WAZUH_INDEXER_PASSWORD=admin
17 +
18 +WAZUH_MANAGER_URL=https://example.com
19 +WAZUH_MANAGER_USERNAME=dummy
20 +WAZUH_MANAGER_PASSWORD=dummy
21 +
22 +GRAYLOG_URL=http://example.com
23 +GRAYLOG_USERNAME=dummy
24 +GRAYLOG_PASSWORD=dummy
25 +
26 +SHUFFLE_URL=https://example.com
27 +SHUFFLER_API_KEY=dummy
28 +
29 +DFIR_IRIS_URL=https://example.com
30 +DFIR_IRIS_API_KEY=dummy
31 +
32 +VELOCIRAPTOR_URL=https://example.com
33 +VELOCIRAPTOR_API_KEY_PATH=dummy
34 +
35 +SUBLIME_URL=http://example.com
36 +SUBLIME_API_KEY=dummy
37 +
38 +INFLUXDB_URL=http://example.com
39 +INFLUXDB_API_KEY=dummy
40 +INFLUXDB_ORG_AND_BUCKET=dummy,dummy
41 +
42 +ASK_SOCFORTRESS_URL=https://example.com
43 +ASK_SOCFORTRESS_API_KEY=dummy
44 +
45 +SOCFORTRESS_THREAT_INTEL_URL=https://example.com/search
46 +SOCFORTRESS_THREAT_INTEL_API_KEY=dummy
47 +
48 +CORTEX_URL=http://example.com
49 +CORTEX_API_KEY=dummy
50 +
51 +GRAFANA_URL=http://example.com
52 +GRAFANA_USERNAME=dummy
53 +GRAFANA_PASSWORD=dummy
54 +
55 +WAZUH_WORKER_PROVISIONING_URL=http://example.com
backend/app/agents/routes/agents.py
+17 -14
@@ -6,6 +6,7 @@ from fastapi import Security
6 from loguru import logger
7 from sqlalchemy.ext.asyncio import AsyncSession
8 from sqlalchemy.future import select
9 +from sqlalchemy import delete
10 from starlette.status import HTTP_401_UNAUTHORIZED
11
12 from app.agents.schema.agents import AgentModifyResponse
@@ -64,7 +65,7 @@ async def fetch_velociraptor_id(db: AsyncSession, agent_id: str) -> str:
65
66 async def delete_agent_from_database(db: AsyncSession, agent_id: str):
67 try:
67 - await db.execute(select(Agents).filter(Agents.agent_id == agent_id).delete())
68 + await db.execute(delete(Agents).filter(Agents.agent_id == agent_id))
69 await db.commit()
70 except Exception as e:
71 logger.error(f"Failed to delete agent {agent_id} from database: {e}")
@@ -229,19 +230,21 @@ async def get_outdated_velociraptor_agents(session: AsyncSession = Depends(get_d
230
231
232 # ! TODO: FINISH THIS
232 -# @agents_router.delete(
233 -# "/{agent_id}/delete",
234 -# response_model=AgentModifyResponse,
235 -# description="Delete agent",
236 -# dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
237 -# )
238 -# async def delete_agent(agent_id: str) -> AgentModifyResponse:
239 -# logger.info(f"Deleting agent {agent_id}")
240 -# delete_agent_wazuh(agent_id)
241 -# client_id = fetch_velociraptor_id(agent_id)
242 -# delete_agent_velociraptor(client_id)
243 -# delete_agent_from_database(agent_id)
244 -# return {"success": True, "message": f"Agent {agent_id} deleted from database, Wazuh, and Velociraptor"}
233 +@agents_router.delete(
234 + "/{agent_id}/delete",
235 + response_model=AgentModifyResponse,
236 + description="Delete agent",
237 + dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
238 +)
239 +async def delete_agent(agent_id: str, session: AsyncSession = Depends(get_db)) -> AgentModifyResponse:
240 + logger.info(f"Deleting agent {agent_id}")
241 + await delete_agent_wazuh(agent_id)
242 + client_id = await fetch_velociraptor_id(db=session, agent_id=agent_id)
243 + logger.info(f"Client ID: {client_id}")
244 + if client_id != "n/a":
245 + await delete_agent_velociraptor(client_id)
246 + await delete_agent_from_database(db=session, agent_id=agent_id)
247 + return {"success": True, "message": f"Agent {agent_id} deleted from database, Wazuh, and Velociraptor"}
248
249
250 # @agents_router.put(
backend/app/agents/velociraptor/services/agents.py
+5 -5
@@ -98,16 +98,16 @@ def handle_exception(e: Exception, client_id: str) -> dict:
98 )
99
100
101 -def delete_agent_velociraptor(client_id: str) -> AgentModifyResponse:
101 +async def delete_agent_velociraptor(client_id: str) -> AgentModifyResponse:
102 try:
103 - delete_client(client_id=client_id)
104 - ensure_client_deleted(client_id=client_id)
103 + await delete_client(client_id=client_id)
104 + await ensure_client_deleted(client_id=client_id)
105 return AgentModifyResponse(success=True, message="Agent deleted successfully")
106 except Exception as e:
107 return handle_exception(e, client_id)
108
109
110 -def delete_client(client_id: str) -> dict:
110 +async def delete_client(client_id: str) -> dict:
111 universal_service = UniversalService()
112 try:
113 query = create_query(
@@ -119,7 +119,7 @@ def delete_client(client_id: str) -> dict:
119 return handle_exception(e, client_id)
120
121
122 -def ensure_client_deleted(client_id: str) -> dict:
122 +async def ensure_client_deleted(client_id: str) -> dict:
123 universal_service = UniversalService()
124 try:
125 query = create_query("SELECT collect_client(client_id='server', artifacts=['Server.Information.Clients'], env=dict()) FROM scope()")
backend/app/agents/wazuh/services/agents.py
+2 -2
@@ -66,7 +66,7 @@ def handle_agent_deletion_response(agent_deleted: dict, agent_id: str):
66 )
67
68
69 -def delete_agent_wazuh(agent_id: str) -> AgentModifyResponse:
69 +async def delete_agent_wazuh(agent_id: str) -> AgentModifyResponse:
70 """Delete agent from Wazuh Manager."""
71 logger.info(f"Deleting agent {agent_id} from Wazuh Manager")
72
@@ -78,7 +78,7 @@ def delete_agent_wazuh(agent_id: str) -> AgentModifyResponse:
78 }
79
80 try:
81 - agent_deleted = send_delete_request(endpoint="/agents", params=params)
81 + agent_deleted = await send_delete_request(endpoint="/agents", params=params)
82 return handle_agent_deletion_response(agent_deleted, agent_id)
83
84 except HTTPException as http_e:
backend/app/customer_provisioning/routes/decommission.py
+5 -5
@@ -20,12 +20,12 @@ from app.db.universal_models import CustomersMeta
20 customer_decommissioning_router = APIRouter()
21
22
23 -async def check_customermeta_exists(customer_name: str, session: AsyncSession = Depends(get_db)) -> CustomersMeta:
23 +async def check_customermeta_exists(customer_code: str, session: AsyncSession = Depends(get_db)) -> CustomersMeta:
24 """
25 Check if a customer exists in the database.
26
27 Args:
28 - customer_name (str): The name of the customer to check.
28 + customer_code (str): The customer code of the customer to check.
29 session (AsyncSession, optional): The database session. Defaults to Depends(get_db).
30
31 Returns:
@@ -34,12 +34,12 @@ async def check_customermeta_exists(customer_name: str, session: AsyncSession =
34 Raises:
35 HTTPException: If the customer is not found.
36 """
37 - logger.info(f"Checking if customer {customer_name} exists")
38 - result = await session.execute(select(CustomersMeta).filter(CustomersMeta.customer_name == customer_name))
37 + logger.info(f"Checking if customer {customer_code} exists")
38 + result = await session.execute(select(CustomersMeta).filter(CustomersMeta.customer_code == customer_code))
39 customer_meta = result.scalars().first()
40
41 if not customer_meta:
42 - raise HTTPException(status_code=404, detail=f"Customer: {customer_name} not found. Please create the customer first.")
42 + raise HTTPException(status_code=404, detail=f"Customer: {customer_code} not found. Please create the customer first.")
43
44 return customer_meta
45
backend/app/customer_provisioning/routes/provision.py
+10 -10
@@ -40,13 +40,13 @@ def get_available_subscriptions():
40 raise HTTPException(status_code=500, detail=f"Error getting available subscriptions: {e}")
41
42
43 -async def check_customer_exists(customer_name: str, session: AsyncSession = Depends(get_db)) -> Customers:
44 - logger.info(f"Checking if customer {customer_name} exists")
45 - result = await session.execute(select(Customers).filter(Customers.customer_name == customer_name))
43 +async def check_customer_exists(customer_code: str, session: AsyncSession = Depends(get_db)) -> Customers:
44 + logger.info(f"Checking if customer {customer_code} exists")
45 + result = await session.execute(select(Customers).filter(Customers.customer_code == customer_code))
46 customer = result.scalars().first()
47
48 if not customer:
49 - raise HTTPException(status_code=404, detail=f"Customer: {customer_name} not found. Please create the customer first.")
49 + raise HTTPException(status_code=404, detail=f"Customer: {customer_code} not found. Please create the customer first.")
50
51 return customer
52
@@ -95,21 +95,21 @@ async def get_subscriptions_route():
95 message="Subscriptions retrieved successfully",
96 )
97
98 -# Get the customermeta based on the customer name
98 +# Get the customermeta based on the customer code
99 @customer_provisioning_router.get(
100 - "/provision/{customer_name}",
100 + "/provision/{customer_code}",
101 response_model=CustomersMetaResponse,
102 description="Get Customer Meta",
103 dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
104 )
105 -async def get_customer_meta(customer_name: str, session: AsyncSession = Depends(get_db)):
106 - logger.info(f"Getting customer meta for customer {customer_name}")
107 - result = await session.execute(select(CustomersMeta).filter(CustomersMeta.customer_name == customer_name))
105 +async def get_customer_meta(customer_code: str, session: AsyncSession = Depends(get_db)):
106 + logger.info(f"Getting customer meta for customer {customer_code}")
107 + result = await session.execute(select(CustomersMeta).filter(CustomersMeta.customer_code == customer_code))
108 customer_meta = result.scalars().first()
109
110 if not customer_meta:
111 raise HTTPException(
112 - status_code=404, detail=f"Customer meta not found for customer: {customer_name}. Please provision the customer first.",
112 + status_code=404, detail=f"Customer meta not found for customer: {customer_code}. Please provision the customer first.",
113 )
114
115 return CustomersMetaResponse(message="Customer meta retrieved successfully", success=True, customer_meta=customer_meta)
backend/app/customer_provisioning/services/decommission.py
+1 -1
@@ -90,7 +90,7 @@ async def decommission_wazuh_worker(request: DecommissionWorkerRequest, session:
90 ProvisionWorkerResponse: The response object indicating the success or failure of the provisioning operation.
91 """
92 logger.info(f"Decommissioning Wazuh worker {request}")
93 - api_endpoint = await get_connector_attribute(connector_id=14, column_name="connector_url", session=session)
93 + api_endpoint = await get_connector_attribute(connector_id=13, column_name="connector_url", session=session)
94 # Send the POST request to the Wazuh worker
95 response = requests.post(
96 url=f"{api_endpoint}/provision_worker/decommission",
backend/app/customer_provisioning/services/grafana.py
+9 -2
@@ -145,6 +145,13 @@ async def delete_grafana_organization(organization_id: int):
145 """
146 logger.info(f"Deleting Grafana organization")
147 grafana_client = await create_grafana_client("Grafana")
148 - organization_deleted = grafana_client.organizations.delete_organization(organization_id=organization_id)
149 - logger.info(f"Organization deleted: {organization_deleted}")
148 + try:
149 + organization_deleted = grafana_client.organizations.delete_organization(organization_id=organization_id)
150 + logger.info(f"Organization deleted: {organization_deleted}")
151 + except Exception as e:
152 + # Switch the organization to the default and try again
153 + grafana_client.user.switch_actual_user_organisation(1)
154 + organization_deleted = grafana_client.organizations.delete_organization(organization_id=organization_id)
155 + logger.info(f"Organization deleted: {organization_deleted}")
156 + return organization_deleted
157 return organization_deleted
backend/app/customer_provisioning/services/provision.py
+1 -1
@@ -184,7 +184,7 @@ async def provision_wazuh_worker(request: ProvisionWorkerRequest, session: Async
184 ProvisionWorkerResponse: The response object indicating the success or failure of the provisioning operation.
185 """
186 logger.info(f"Provisioning Wazuh worker {request}")
187 - api_endpoint = await get_connector_attribute(connector_id=14, column_name="connector_url", session=session)
187 + api_endpoint = await get_connector_attribute(connector_id=13, column_name="connector_url", session=session)
188 # Send the POST request to the Wazuh worker
189 response = requests.post(
190 url=f"{api_endpoint}/provision_worker",
backend/app/db/db_populate.py
+200 -157
@@ -6,175 +6,218 @@ from sqlmodel import Session
6 from app.auth.models.users import Role
7 from app.connectors.models import Connectors
8
9 +from dotenv import load_dotenv
10 +import os
11
10 -async def add_connectors_if_not_exist(session: AsyncSession):
11 - # List of connectors to add
12 - connector_list = [
13 - {
14 - "connector_name": "Wazuh-Indexer",
15 - "connector_type": "4.4.1",
16 - "connector_url": "https://ashwix01.socfortress.local:9200",
17 - "connector_username": "admin",
18 - "connector_password": "hmx7KPy15XPhJkgjlFrVgrWZ+Aid6QNm",
19 - "connector_api_key": None,
20 - "connector_configured": True,
21 - "connector_accepts_username_password": True,
22 - },
23 - {
24 - "connector_name": "Wazuh-Manager",
25 - "connector_type": "4.4.1",
26 - "connector_url": "https://ashwzhma.socfortress.local:55000",
27 - "connector_username": "wazuh-wui",
28 - "connector_password": "wazuh-wui",
29 - "connector_api_key": None,
30 - "connector_configured": True,
31 - "connector_accepts_username_password": True,
32 - },
33 - {
34 - "connector_name": "Graylog",
35 - "connector_type": "5.0.7",
36 - "connector_url": "http://ashgrl02.socfortress.local:9000",
37 - "connector_username": "socfortress_graylog_manager",
38 - "connector_password": "R{2PvE5TQkU7[xS$pX>fw>`y",
39 - "connector_api_key": None,
40 - "connector_configured": True,
41 - "connector_accepts_username_password": True,
42 - },
43 - {
44 - "connector_name": "Shuffle",
45 - "connector_type": "1.1.0",
46 - "connector_url": "https://ASHDKR02.socfortress.local:3443",
47 - "connector_username": "sting",
48 - "connector_password": "string",
49 - "connector_api_key": "bc5d1e18-6230-40f0-b032-6ed898c307c5",
50 - "connector_configured": True,
51 - "connector_accepts_api_key": True,
52 - },
53 - {
54 - "connector_name": "DFIR-IRIS",
55 - "connector_type": "2.0",
56 - "connector_url": "https://ashirs01.socfortress.local",
57 - "connector_username": None,
58 - "connector_password": None,
59 - "connector_api_key": "I3Hwvkpvdk8Z0XRFlyGm4WXGw8jksnEzvKNoD9BobtSQ2AgWmdo_p-pfmJCg_ev2cm8I-zgWzAfya3jLBWZ6qw",
60 - "connector_configured": True,
61 - "connector_accepts_api_key": True,
62 - },
63 - {
64 - "connector_name": "Velociraptor",
65 - "connector_type": "0.6.8",
66 - "connector_url": "https://ashvlo01.socfortress.local:8001",
67 - "connector_username": None,
68 - "connector_password": None,
69 - "connector_api_key": "C:\\Users\\walto\\Desktop\\GitHub\\CoPilot\\backend\\file-store\\api.config.yaml",
70 - "connector_configured": True,
71 - "connector_accepts_file": True,
72 - },
73 - {
74 - "connector_name": "RabbitMQ",
75 - "connector_type": "3",
76 - "connector_url": "ashdkr02.socfortress.local:5672",
77 - "connector_username": "guest",
78 - "connector_password": "guest",
79 - "connector_api_key": None,
80 - "connector_configured": True,
81 - "connector_accepts_username_password": True,
82 - },
83 - {
84 - "connector_name": "Sublime",
85 - "connector_type": "3",
86 - "connector_url": "http://ashdkr02.socfortress.local:8000",
87 - "connector_username": None,
88 - "connector_password": None,
89 - "connector_api_key": "7653trxhakxn4wxdh8bbatbvu97hm8fopos7wztzjrwfd12gf5i2kyebhvke9rt4",
90 - "connector_configured": True,
91 - "connector_accepts_api_key": True,
92 - },
93 - {
94 - "connector_name": "InfluxDB",
95 - "connector_type": "3",
96 - "connector_url": "http://ashdkr02.socfortress.local:8086",
97 - "connector_username": "SOCFortress",
98 - "connector_password": None,
99 - "connector_api_key": "gOLoFKucQXXd5d1rDx59YYktIz6OfrHIe4jRowJKZ8iB4IcZES8rOhRPaDEejEkahch8Ze2FiMzZxbQ9ZV8K6g==",
100 - "connector_configured": True,
101 - "connector_accepts_api_key": True,
102 - },
103 - {
104 - "connector_name": "AskSocfortress",
105 - "connector_type": "3",
106 - "connector_url": "https://knowledge.socfortress.co",
107 - "connector_username": None,
108 - "connector_password": None,
109 - "connector_api_key": "CkKmw1B9NM1hG669tC4sTazLm1HlRfSXVvMZkxa9",
110 - "connector_configured": True,
111 - "connector_accepts_api_key": True,
112 - },
113 - {
114 - "connector_name": "SocfortressThreatIntel",
115 - "connector_type": "3",
116 - "connector_url": "https://intel.socfortress.co/search",
117 - "connector_username": None,
118 - "connector_password": None,
119 - "connector_api_key": "ozH1jHp1zmacCePYrAZmxarJCGptcMth93a86Jq8",
120 - "connector_configured": True,
121 - "connector_accepts_api_key": True,
122 - },
123 - {
124 - "connector_name": "Cortex",
125 - "connector_type": "3",
126 - "connector_url": "http://ashvlo01.socfortress.local:9001",
127 - "connector_username": None,
128 - "connector_password": None,
129 - "connector_api_key": "+k/DvVYMEYURbc8sUdXA5/hW9VhJZV3v",
130 - "connector_configured": True,
131 - "connector_accepts_api_key": True,
132 - },
133 - {
134 - "connector_name": "InfluxDB",
135 - "connector_type": "3",
136 - "connector_url": "http://ashwzhma.socfortress.local:8086",
137 - "connector_username": None,
138 - "connector_password": None,
139 - "connector_api_key": "DDMsDZzI1xRHYxQT60fNZ_2zZtCnAKq04GmqEF3prLJOIw5iNzEtlXkui1a5Y6d5_eWf1nomug9FmE0ue1J5iQ==",
140 - "connector_configured": True,
141 - "connector_accepts_api_key": True,
142 - "connector_extra_data": "telegraf",
143 - },
144 - {
145 - "connector_name": "Grafana",
146 - "connector_type": "3",
147 - "connector_url": "http://10.255.255.5:3000",
148 - "connector_username": "admin",
149 - "connector_password": "admin",
150 - "connector_api_key": None,
151 - "connector_configured": True,
152 - "connector_accepts_username_password": True,
153 - },
154 - {
155 - "connector_name": "Wazuh Worker Provisioning",
156 - "connector_type": "3",
157 - "connector_url": "http://10.255.255.5:5003/provision_worker",
158 - "connector_username": None,
159 - "connector_password": None,
160 - "connector_api_key": None,
161 - "connector_configured": True,
162 - "connector_accepts_api_key": False,
163 - },
12 +load_dotenv()
13 +
14 +# ! OLD BUT STILL WORKS ! #
15 +# async def add_connectors_if_not_exist(session: AsyncSession):
16 +# # List of connectors to add
17 +# connector_list = [
18 +# {
19 +# "connector_name": "Wazuh-Indexer",
20 +# "connector_type": "4.4.1",
21 +# "connector_url": os.getenv("WAZUH_INDEXER_URL"),
22 +# "connector_username": os.getenv("WAZUH_INDEXER_USERNAME"),
23 +# "connector_password": os.getenv("WAZUH_INDEXER_PASSWORD"),
24 +# "connector_api_key": None,
25 +# "connector_configured": True,
26 +# "connector_accepts_username_password": True,
27 +# },
28 +# {
29 +# "connector_name": "Wazuh-Manager",
30 +# "connector_type": "4.4.1",
31 +# "connector_url": os.getenv("WAZUH_MANAGER_URL"),
32 +# "connector_username": os.getenv("WAZUH_MANAGER_USERNAME"),
33 +# "connector_password": os.getenv("WAZUH_MANAGER_PASSWORD"),
34 +# "connector_api_key": None,
35 +# "connector_configured": True,
36 +# "connector_accepts_username_password": True,
37 +# },
38 +# {
39 +# "connector_name": "Graylog",
40 +# "connector_type": "5.0.7",
41 +# "connector_url": os.getenv("GRAYLOG_URL"),
42 +# "connector_username": os.getenv("GRAYLOG_USERNAME"),
43 +# "connector_password": os.getenv("GRAYLOG_PASSWORD"),
44 +# "connector_api_key": None,
45 +# "connector_configured": True,
46 +# "connector_accepts_username_password": True,
47 +# },
48 +# {
49 +# "connector_name": "Shuffle",
50 +# "connector_type": "1.1.0",
51 +# "connector_url": os.getenv("SHUFFLE_URL"),
52 +# "connector_username": "sting",
53 +# "connector_password": "string",
54 +# "connector_api_key": os.getenv("SHUFFLE_API_KEY"),
55 +# "connector_configured": True,
56 +# "connector_accepts_api_key": True,
57 +# },
58 +# {
59 +# "connector_name": "DFIR-IRIS",
60 +# "connector_type": "2.0",
61 +# "connector_url": os.getenv("DFIR_IRIS_URL"),
62 +# "connector_username": None,
63 +# "connector_password": None,
64 +# "connector_api_key": os.getenv("DFIR_IRIS_API_KEY"),
65 +# "connector_configured": True,
66 +# "connector_accepts_api_key": True,
67 +# },
68 +# {
69 +# "connector_name": "Velociraptor",
70 +# "connector_type": "0.6.8",
71 +# "connector_url": os.getenv("VELOCIRAPTOR_URL"),
72 +# "connector_username": None,
73 +# "connector_password": None,
74 +# "connector_api_key": os.getenv("VELOCIRAPTOR_API_KEY_PATH"),
75 +# "connector_configured": True,
76 +# "connector_accepts_file": True,
77 +# },
78 +# {
79 +# "connector_name": "Sublime",
80 +# "connector_type": "3",
81 +# "connector_url": os.getenv("SUBLIME_URL"),
82 +# "connector_username": None,
83 +# "connector_password": None,
84 +# "connector_api_key": os.getenv("SUBLIME_API_KEY"),
85 +# "connector_configured": True,
86 +# "connector_accepts_api_key": True,
87 +# },
88 +# {
89 +# "connector_name": "InfluxDB",
90 +# "connector_type": "3",
91 +# "connector_url": os.getenv("INFLUXDB_URL"),
92 +# "connector_username": None,
93 +# "connector_password": None,
94 +# "connector_api_key": os.getenv("INFLUXDB_API_KEY"),
95 +# "connector_configured": True,
96 +# "connector_accepts_api_key": True,
97 +# "connector_extra_data": os.getenv("INFLUXDB_ORG_AND_BUCKET"),
98 +# },
99 +# {
100 +# "connector_name": "AskSocfortress",
101 +# "connector_type": "3",
102 +# "connector_url": os.getenv("ASK_SOCFORTRESS_URL"),
103 +# "connector_username": None,
104 +# "connector_password": None,
105 +# "connector_api_key": os.getenv("ASK_SOCFORTRESS_API_KEY"),
106 +# "connector_configured": True,
107 +# "connector_accepts_api_key": True,
108 +# },
109 +# {
110 +# "connector_name": "SocfortressThreatIntel",
111 +# "connector_type": "3",
112 +# "connector_url": os.getenv("SOCFORTRESS_THREAT_INTEL_URL"),
113 +# "connector_username": None,
114 +# "connector_password": None,
115 +# "connector_api_key": os.getenv("SOCFORTRESS_THREAT_INTEL_API_KEY"),
116 +# "connector_configured": True,
117 +# "connector_accepts_api_key": True,
118 +# },
119 +# {
120 +# "connector_name": "Cortex",
121 +# "connector_type": "3",
122 +# "connector_url": os.getenv("CORTEX_URL"),
123 +# "connector_username": None,
124 +# "connector_password": None,
125 +# "connector_api_key": os.getenv("CORTEX_API_KEY"),
126 +# "connector_configured": True,
127 +# "connector_accepts_api_key": True,
128 +# },
129 +# {
130 +# "connector_name": "Grafana",
131 +# "connector_type": "3",
132 +# "connector_url": os.getenv("GRAFANA_URL"),
133 +# "connector_username": os.getenv("GRAFANA_USERNAME"),
134 +# "connector_password": os.getenv("GRAFANA_PASSWORD"),
135 +# "connector_api_key": None,
136 +# "connector_configured": True,
137 +# "connector_accepts_username_password": True,
138 +# },
139 +# {
140 +# "connector_name": "Wazuh Worker Provisioning",
141 +# "connector_type": "3",
142 +# "connector_url": os.getenv("WAZUH_WORKER_PROVISIONING_URL"),
143 +# "connector_username": None,
144 +# "connector_password": None,
145 +# "connector_api_key": None,
146 +# "connector_configured": True,
147 +# "connector_accepts_api_key": False,
148 +# },
149 +# ]
150 +
151 +# for connector_data in connector_list:
152 +# # Asynchronously check if connector already exists in the database
153 +# query = select(Connectors).where(Connectors.connector_name == connector_data["connector_name"])
154 +# result = await session.execute(query)
155 +# existing_connector = result.scalars().first()
156 +
157 +# if existing_connector is None:
158 +# new_connector = Connectors(**connector_data)
159 +# session.add(new_connector) # Use session.add() to add new objects
160 +# logger.info(f"Added new connector: {connector_data['connector_name']}")
161 +
162 +# # Commit the changes if any new connectors were added
163 +# await session.commit()
164 +
165 +def load_connector_data(connector_name, connector_type, accepts_key, extra_data_key=None):
166 + env_prefix = connector_name.upper().replace("-", "_").replace(" ", "_")
167 + url = os.getenv(f"{env_prefix}_URL")
168 + logger.info(f"Loading connector data for {connector_name} from environment variables with URL: {url}")
169 + return {
170 + "connector_name": connector_name,
171 + "connector_type": connector_type,
172 + "connector_url": os.getenv(f"{env_prefix}_URL"),
173 + "connector_username": os.getenv(f"{env_prefix}_USERNAME"),
174 + "connector_password": os.getenv(f"{env_prefix}_PASSWORD"),
175 + "connector_api_key": os.getenv(f"{env_prefix}_API_KEY"),
176 + "connector_description": os.getenv(f"{env_prefix}_DESCRIPTION", "No description available."),
177 + "connector_supports": os.getenv(f"{env_prefix}_SUPPORTS", "Not specified."),
178 + "connector_configured": True,
179 + "connector_verified": bool(os.getenv(f"{env_prefix}_VERIFIED", False)),
180 + "connector_accepts_api_key": accepts_key == "api_key",
181 + "connector_accepts_username_password": accepts_key == "username_password",
182 + "connector_accepts_file": accepts_key == "file",
183 + "connector_extra_data": os.getenv(extra_data_key) if extra_data_key else None,
184 + }
185 +
186 +
187 +def get_connectors_list():
188 + connectors = [
189 + ("Wazuh-Indexer", "4.4.1", "username_password"),
190 + ("Wazuh-Manager", "4.4.1", "username_password"),
191 + ("Graylog", "5.0.7", "username_password"),
192 + ("Shuffle", "1.1.0", "api_key"),
193 + ("DFIR-IRIS", "2.0", "api_key"),
194 + ("Velociraptor", "0.6.8", "file"),
195 + ("Sublime", "3", "api_key"),
196 + ("InfluxDB", "3", "api_key", "INFLUXDB_ORG_AND_BUCKET"),
197 + ("AskSocfortress", "3", "api_key"),
198 + ("SocfortressThreatIntel", "3", "api_key"),
199 + ("Cortex", "3", "api_key"),
200 + ("Grafana", "3", "username_password"),
201 + ("Wazuh Worker Provisioning", "3", "api_key"),
202 + # ... Add more connectors as needed ...
203 ]
204
205 + return [load_connector_data(*connector) for connector in connectors]
206 +
207 +
208 +async def add_connectors_if_not_exist(session: AsyncSession):
209 + connector_list = get_connectors_list()
210 +
211 for connector_data in connector_list:
167 - # Asynchronously check if connector already exists in the database
212 query = select(Connectors).where(Connectors.connector_name == connector_data["connector_name"])
213 result = await session.execute(query)
214 existing_connector = result.scalars().first()
215
216 if existing_connector is None:
217 new_connector = Connectors(**connector_data)
174 - session.add(new_connector) # Use session.add() to add new objects
218 + session.add(new_connector)
219 logger.info(f"Added new connector: {connector_data['connector_name']}")
220
177 - # Commit the changes if any new connectors were added
221 await session.commit()
222
223
backend/app/db/universal_models.py
+15 -2
@@ -4,6 +4,8 @@ from typing import Optional
4 from sqlmodel import Field
5 from sqlmodel import Relationship
6 from sqlmodel import SQLModel
7 +from loguru import logger
8 +from datetime import datetime
9
10
11 class Customers(SQLModel, table=True):
@@ -99,13 +101,19 @@ class Agents(SQLModel, table=True):
101
102 @classmethod
103 def create_from_model(cls, wazuh_agent, velociraptor_agent, customer_code):
104 + # Check if agent_last_seen is 'Unknown' and set wazuh_last_seen accordingly
105 + if wazuh_agent.agent_last_seen == 'Unknown':
106 + wazuh_last_seen_value = "1970-01-01T00:00:00+00:00" # default datetime value
107 + else:
108 + wazuh_last_seen_value = wazuh_agent.agent_last_seen_as_datetime
109 +
110 return cls(
111 agent_id=wazuh_agent.agent_id,
112 hostname=wazuh_agent.agent_name,
113 ip_address=wazuh_agent.agent_ip,
114 os=wazuh_agent.agent_os,
115 label=wazuh_agent.agent_label,
108 - wazuh_last_seen=wazuh_agent.agent_last_seen_as_datetime,
116 + wazuh_last_seen=wazuh_last_seen_value,
117 wazuh_agent_version=wazuh_agent.wazuh_agent_version,
118 velociraptor_id=velociraptor_agent.client_id if velociraptor_agent.client_id else "n/a",
119 velociraptor_last_seen=velociraptor_agent.client_last_seen_as_datetime,
@@ -114,12 +122,17 @@ class Agents(SQLModel, table=True):
122 )
123
124 def update_from_model(self, wazuh_agent, velociraptor_agent, customer_code):
125 + if wazuh_agent.agent_last_seen == 'Unknown' or wazuh_agent.agent_last_seen == "1970-01-01T00:00:00+00:00":
126 + wazuh_last_seen_value = datetime.strptime("1970-01-01T00:00:00+00:00", "%Y-%m-%dT%H:%M:%S%z") # default datetime value
127 + else:
128 + wazuh_last_seen_value = wazuh_agent.agent_last_seen_as_datetime
129 +
130 self.agent_id = wazuh_agent.agent_id
131 self.hostname = wazuh_agent.agent_name
132 self.ip_address = wazuh_agent.agent_ip
133 self.os = wazuh_agent.agent_os
134 self.label = wazuh_agent.agent_label
122 - self.wazuh_last_seen = wazuh_agent.agent_last_seen_as_datetime
135 + self.wazuh_last_seen = wazuh_last_seen_value
136 self.wazuh_agent_version = wazuh_agent.wazuh_agent_version
137 self.velociraptor_id = velociraptor_agent.client_id if velociraptor_agent.client_id else "n/a"
138 self.velociraptor_last_seen = velociraptor_agent.client_last_seen_as_datetime
backend/app/integrations/ask_socfortress/services/ask_socfortress.py
+1 -1
@@ -54,7 +54,7 @@ async def get_ask_socfortress_attributes(column_name: str, session: AsyncSession
54 str: The Ask SocFortress Attribute.
55
56 """
57 - attribute_value = await get_connector_attribute(connector_id=10, column_name=column_name, session=session)
57 + attribute_value = await get_connector_attribute(connector_id=9, column_name=column_name, session=session)
58 # Close the session
59 await session.close()
60 if not attribute_value:
backend/app/threat_intel/routes/socfortress.py
+1 -1
@@ -34,7 +34,7 @@ async def ensure_api_key_exists(session: AsyncSession = Depends(get_db)) -> bool
34 Returns:
35 bool: True if the API key exists, otherwise raises HTTPException.
36 """
37 - api_key = await get_connector_attribute(connector_id=11, column_name="connector_api_key", session=session)
37 + api_key = await get_connector_attribute(connector_id=10, column_name="connector_api_key", session=session)
38 # Close the session
39 await session.close()
40 if not api_key:
backend/app/threat_intel/services/socfortress.py
+1 -1
@@ -29,7 +29,7 @@ async def get_socfortress_threat_intel_attributes(column_name: str, session: Asy
29 str: The SocFortress Threat Intel Attribute.
30
31 """
32 - attribute_value = await get_connector_attribute(connector_id=11, column_name=column_name, session=session)
32 + attribute_value = await get_connector_attribute(connector_id=10, column_name=column_name, session=session)
33 # Close the session
34 await session.close()
35 if not attribute_value:
backend/settings.py
+5 -1
@@ -6,11 +6,15 @@ For local development, use a .env file to set
6 environment variables.
7 """
8 from pathlib import Path
9 +from loguru import logger
10
11 from environs import Env
12
13 env = Env()
13 -env.read_env()
14 +env.read_env(Path(__file__).parent.parent / ".env")
15 +logger.info(f"Loading environment from {Path(__file__).parent.parent / '.env'}")
16 +
17 +
18
19 basedir = Path().absolute()
20 db_path = str(basedir / "copilot.db")
package-lock.json
+512 -1149
@@ -19,13 +19,13 @@
19 "@fullcalendar/list": "^6.1.10",
20 "@fullcalendar/timegrid": "^6.1.10",
21 "@fullcalendar/vue3": "^6.1.10",
22 - "@milkdown/core": "^7.3.2",
23 - "@milkdown/ctx": "^7.3.2",
24 - "@milkdown/preset-commonmark": "^7.3.2",
25 - "@milkdown/prose": "^7.3.2",
26 - "@milkdown/theme-nord": "^7.3.2",
27 - "@milkdown/transformer": "^7.3.2",
28 - "@milkdown/vue": "^7.3.2",
22 + "@milkdown/core": "^7.3.3",
23 + "@milkdown/ctx": "^7.3.3",
24 + "@milkdown/preset-commonmark": "^7.3.3",
25 + "@milkdown/prose": "^7.3.3",
26 + "@milkdown/theme-nord": "^7.3.3",
27 + "@milkdown/transformer": "^7.3.3",
28 + "@milkdown/vue": "^7.3.3",
29 "@popperjs/core": "^2.11.8",
30 "@revolist/revogrid": "^4.7.0-next.4",
31 "@revolist/revogrid-column-numeral": "^1.0.2",
@@ -41,9 +41,9 @@
41 "@tiptap/starter-kit": "^2.1.13",
42 "@tiptap/vue-3": "^2.1.13",
43 "@vueup/vue-quill": "^1.2.0",
44 - "@vueuse/components": "^10.7.0",
45 - "@vueuse/core": "^10.7.0",
46 - "apexcharts": "^3.45.0",
44 + "@vueuse/components": "^10.7.1",
45 + "@vueuse/core": "^10.7.1",
46 + "apexcharts": "^3.45.1",
47 "bytes": "^3.1.2",
48 "chart.js": "^4.4.1",
49 "colord": "^2.9.3",
@@ -52,7 +52,8 @@
52 "echarts": "^5.4.3",
53 "geojson": "^0.5.0",
54 "highlight.js": "^11.9.0",
55 - "jose": "^5.1.3",
55 + "jose": "^5.2.0",
56 + "js-md5": "^0.8.3",
57 "lodash": "^4.17.21",
58 "maplibre-gl": "^3.6.2",
59 "mitt": "^3.0.1",
@@ -93,7 +94,7 @@
94 "@types/lodash": "^4.14.202",
95 "@types/node": "^20.10.5",
96 "@types/validator": "^13.11.7",
96 - "@vitejs/plugin-vue": "^4.5.2",
97 + "@vitejs/plugin-vue": "^5.0.0",
98 "@vitejs/plugin-vue-jsx": "^3.1.0",
99 "@vue-leaflet/vue-leaflet": "^0.10.1",
100 "@vue/eslint-config-prettier": "^8.0.0",
@@ -101,7 +102,7 @@
102 "@vue/test-utils": "^2.4.3",
103 "@vue/tsconfig": "^0.5.1",
104 "autoprefixer": "^10.4.16",
104 - "cypress": "^13.6.1",
105 + "cypress": "^13.6.2",
106 "eslint": "^8.56.0",
107 "eslint-plugin-cypress": "^2.15.1",
108 "eslint-plugin-vue": "^9.19.2",
@@ -117,17 +118,17 @@
118 "start-server-and-test": "^2.0.3",
119 "tailwind-config-viewer": "^1.7.3",
120 "tailwindcss": "^3.4.0",
120 - "taze": "^0.13.0",
121 + "taze": "^0.13.1",
122 "ts-node": "^10.9.2",
123 "typescript": "~5.3.3",
124 "unplugin-vue-components": "^0.26.0",
125 "vite": "^5.0.10",
126 "vite-svg-loader": "^5.1.0",
127 "vitest": "^1.1.0",
127 - "vue-tsc": "^1.8.26"
128 + "vue-tsc": "^1.8.27"
129 },
130 "engines": {
130 - "node": ">=16.0.0 <20.5.0"
131 + "node": ">=16.0.0 <=20.7.0"
132 }
133 },
134 "node_modules/@aashutoshrathi/word-wrap": {
@@ -666,7 +667,6 @@
667 },
668 "node_modules/@clack/prompts/node_modules/is-unicode-supported": {
669 "version": "1.3.0",
669 - "extraneous": true,
670 "inBundle": true,
671 "license": "MIT",
672 "engines": {
@@ -1740,11 +1740,11 @@
1740 }
1741 },
1742 "node_modules/@milkdown/core": {
1743 - "version": "7.3.2",
1744 - "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.2.tgz",
1745 - "integrity": "sha512-FbfFx5GpX7cxbZAyT03Pgnx9tLMrFJJK/RIyShgk5xyVtZGxEwQZ4tTqL280dNmjv5iXCAYz2nG5+8kIKJh4EQ==",
1743 + "version": "7.3.3",
1744 + "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.3.tgz",
1745 + "integrity": "sha512-aiESjMQoUT8k4j8dEhN/WpuQOFkZf7iO/GqJ8RRpcgGEKtPz939aN58R9aSfWm/5tNCNwK2uftmxt0ubdH1YRw==",
1746 "dependencies": {
1747 - "@milkdown/exception": "7.3.2",
1747 + "@milkdown/exception": "7.3.3",
1748 "remark-parse": "^11.0.0",
1749 "remark-stringify": "^11.0.0",
1750 "tslib": "^2.5.0",
@@ -1757,29 +1757,29 @@
1757 }
1758 },
1759 "node_modules/@milkdown/ctx": {
1760 - "version": "7.3.2",
1761 - "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.2.tgz",
1762 - "integrity": "sha512-D5bxCWlubfpSlGru58gQd6jBd6a+Gh8vYnWnuozS5NRj9bC2JeBmw92LR52Kxoh7OegiWyKPcXQKEdwU6EKTkg==",
1760 + "version": "7.3.3",
1761 + "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.3.tgz",
1762 + "integrity": "sha512-AEtuWQYZIrgceCceNriC6w8LN1xcTLbmCgxWdn7V1uUD3cV6LhmpHcTuBiaB+CeJe9HFvTldrkWv67dCyGXU0w==",
1763 "dependencies": {
1764 - "@milkdown/exception": "7.3.2",
1764 + "@milkdown/exception": "7.3.3",
1765 "tslib": "^2.5.0"
1766 }
1767 },
1768 "node_modules/@milkdown/exception": {
1769 - "version": "7.3.2",
1770 - "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.2.tgz",
1771 - "integrity": "sha512-y46GujvdvlSjeq455VLtVFr3EvRIkseOmQ1cKWMs04HZ06/r/auY2yu/+3ORJ2qQEG1bXoeuTLe4Sq/PgqXSPw==",
1769 + "version": "7.3.3",
1770 + "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.3.tgz",
1771 + "integrity": "sha512-q6S9P5yux23BPy5/GK81OslQuVWD+PrNljb1asv10TTscZAyZmgCMvECQrR3qrwd/Ja5JN5C2CcYLe1JgzI1Fg==",
1772 "dependencies": {
1773 "tslib": "^2.5.0"
1774 }
1775 },
1776 "node_modules/@milkdown/preset-commonmark": {
1777 - "version": "7.3.2",
1778 - "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.2.tgz",
1779 - "integrity": "sha512-gy7Ay1zAHYl07sPraR+tC2bZsw0dyDt+B36QgsIoEpRvKI4LPNSfI+0UuiK0yzKmELsMvMZNu8yxG32q/dtSZA==",
1777 + "version": "7.3.3",
1778 + "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.3.tgz",
1779 + "integrity": "sha512-Hy1gKgoaH8W0lvruKxu52CJ27iqngqavHsEvqDjHehzpkjoG30/1Fjyn/Jf7IT4oByoG1l9u3ejy6jx6TtYR3A==",
1780 "dependencies": {
1781 - "@milkdown/exception": "7.3.2",
1782 - "@milkdown/utils": "7.3.2",
1781 + "@milkdown/exception": "7.3.3",
1782 + "@milkdown/utils": "7.3.3",
1783 "@sindresorhus/slugify": "^2.2.0",
1784 "remark-inline-links": "^7.0.0",
1785 "tslib": "^2.5.0",
@@ -1793,11 +1793,11 @@
1793 }
1794 },
1795 "node_modules/@milkdown/prose": {
1796 - "version": "7.3.2",
1797 - "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.2.tgz",
1798 - "integrity": "sha512-3CeQ6Z75SL0zSm/fHzbP3e3I2a4+kFbkXI6vreK6AKQeCjYSJ8r/uJLkoDYRmJKOzc6HmnuCpIMbzZQ9kaeEnw==",
1796 + "version": "7.3.3",
1797 + "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.3.tgz",
1798 + "integrity": "sha512-d+Dv2C7cSWBfkG3scLnc+6IA40nKNIJM37NFBQ6mbOW7/6dj1m5vhNGZN+LDKlEEYOhVko+Kr6vwI4FfuY+pUw==",
1799 "dependencies": {
1800 - "@milkdown/exception": "7.3.2",
1800 + "@milkdown/exception": "7.3.3",
1801 "prosemirror-changeset": "^2.2.1",
1802 "prosemirror-commands": "^1.5.2",
1803 "prosemirror-dropcursor": "^1.8.1",
@@ -1815,9 +1815,9 @@
1815 }
1816 },
1817 "node_modules/@milkdown/theme-nord": {
1818 - "version": "7.3.2",
1819 - "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.2.tgz",
1820 - "integrity": "sha512-CgydLp7E47a1EsFEMoLICSNeKnVfcGeD8FByXtHou4OZcLxYfQdvtGEOObVlgBa01qNOdbATRZsrIl4rc8likQ==",
1818 + "version": "7.3.3",
1819 + "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.3.tgz",
1820 + "integrity": "sha512-hXD8Qgb0tREIcNMCpV7VDAzT43dPQXsAwn7J5gvojx76MHI8SRV4y3c04LP+OncR3H2LGgkqB3+eew6vWA32iA==",
1821 "dependencies": {
1822 "clsx": "^2.0.0",
1823 "tslib": "^2.5.0"
@@ -1837,11 +1837,11 @@
1837 }
1838 },
1839 "node_modules/@milkdown/transformer": {
1840 - "version": "7.3.2",
1841 - "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.2.tgz",
1842 - "integrity": "sha512-FsasNHjRRbRha4I3jXhK7FZymTzp4bAeqTB65QcIg5TILSpYan0BCZ2oDqnChK7wxppA9cP29iLOg/FJvNdhmw==",
1840 + "version": "7.3.3",
1841 + "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.3.tgz",
1842 + "integrity": "sha512-rSKKi5VBfIu1bXq4tG/LBWDAMjbnSWZEtKm+lHjXmjPsR47KpBSkQgsLfMkX4LQrX4bCoTyqEiqnFIfFe/KmOA==",
1843 "dependencies": {
1844 - "@milkdown/exception": "7.3.2",
1844 + "@milkdown/exception": "7.3.3",
1845 "remark": "^15.0.1",
1846 "remark-parse": "^11.0.0",
1847 "remark-stringify": "^11.0.0",
@@ -1853,11 +1853,11 @@
1853 }
1854 },
1855 "node_modules/@milkdown/utils": {
1856 - "version": "7.3.2",
1857 - "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.2.tgz",
1858 - "integrity": "sha512-Dsdfkcs7D/gujERtegsyG+fLa/UbuczSI7+YueXrmyQ7y6LE/Ob8bo/PwSiISFTn4+hzZfchdmcYSmgvlblQNQ==",
1856 + "version": "7.3.3",
1857 + "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.3.tgz",
1858 + "integrity": "sha512-PwM43+YLuvS+RUaiFWZPS6vBxGcEp9nUY2U0h00FHRJjbTSriDHcnTgpkRX5u2JKBaWaRCDTFGjVmfJI6q6LGA==",
1859 "dependencies": {
1860 - "@milkdown/exception": "7.3.2",
1860 + "@milkdown/exception": "7.3.3",
1861 "nanoid": "^5.0.0",
1862 "tslib": "^2.5.0"
1863 },
@@ -1869,11 +1869,11 @@
1869 }
1870 },
1871 "node_modules/@milkdown/vue": {
1872 - "version": "7.3.2",
1873 - "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.2.tgz",
1874 - "integrity": "sha512-GgxjZrSaQDfSg/C/4UXz3vC8K1d6JeQ7jeFMnQBinvic2zJuzARDRNPVADEuU6zsHBvL8hCXlI4DiV6OTmzuIg==",
1872 + "version": "7.3.3",
1873 + "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.3.tgz",
1874 + "integrity": "sha512-Ib2iXTUNXoKzIb4sDobqdmGgC73ehYVkpKy1v7O2lDsITC2QN79FaRY+o0tKMPOfyIiBUhpspySNxIfC1QfBWg==",
1875 "dependencies": {
1876 - "@milkdown/utils": "7.3.2",
1876 + "@milkdown/utils": "7.3.3",
1877 "tslib": "^2.5.0"
1878 },
1879 "peerDependencies": {
@@ -1933,71 +1933,19 @@
1933 "node": "^16.14.0 || >=18.0.0"
1934 }
1935 },
1936 - "node_modules/@npmcli/agent/node_modules/agent-base": {
1937 - "version": "7.1.0",
1938 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
1939 - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
1940 - "dev": true,
1941 - "dependencies": {
1942 - "debug": "^4.3.4"
1943 - },
1944 - "engines": {
1945 - "node": ">= 14"
1946 - }
1947 - },
1948 - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": {
1949 - "version": "7.0.0",
1950 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
1951 - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
1952 - "dev": true,
1953 - "dependencies": {
1954 - "agent-base": "^7.1.0",
1955 - "debug": "^4.3.4"
1956 - },
1957 - "engines": {
1958 - "node": ">= 14"
1959 - }
1960 - },
1961 - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": {
1962 - "version": "7.0.2",
1963 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
1964 - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
1965 - "dev": true,
1966 - "dependencies": {
1967 - "agent-base": "^7.0.2",
1968 - "debug": "4"
1969 - },
1970 - "engines": {
1971 - "node": ">= 14"
1972 - }
1973 - },
1936 "node_modules/@npmcli/agent/node_modules/lru-cache": {
1975 - "version": "10.0.1",
1976 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
1977 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
1937 + "version": "10.1.0",
1938 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
1939 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
1940 "dev": true,
1941 "engines": {
1942 "node": "14 || >=16.14"
1943 }
1944 },
1983 - "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": {
1984 - "version": "8.0.2",
1985 - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
1986 - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
1987 - "dev": true,
1988 - "dependencies": {
1989 - "agent-base": "^7.0.2",
1990 - "debug": "^4.3.4",
1991 - "socks": "^2.7.1"
1992 - },
1993 - "engines": {
1994 - "node": ">= 14"
1995 - }
1996 - },
1945 "node_modules/@npmcli/config": {
1998 - "version": "8.0.2",
1999 - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.2.tgz",
2000 - "integrity": "sha512-g+DAp7bUsiUDynRI4jTO0wPAXJpy3puhovHHg8S4iq54NF8zd00588GJOm5ARxDaDUdKCUYu9E5fNc+esYl5JA==",
1946 + "version": "8.0.3",
1947 + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.3.tgz",
1948 + "integrity": "sha512-rqRX7/UORvm2YRImY67kyfwD9rpi5+KXXb1j/cpTUKRcUqvpJ9/PMMc7Vv57JVqmrFj8siBBFEmXI3Gg7/TonQ==",
1949 "dev": true,
1950 "dependencies": {
1951 "@npmcli/map-workspaces": "^3.0.2",
@@ -2168,9 +2116,9 @@
2116 }
2117 },
2118 "node_modules/@npmcli/git/node_modules/lru-cache": {
2171 - "version": "10.0.1",
2172 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
2173 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
2119 + "version": "10.1.0",
2120 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
2121 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
2122 "dev": true,
2123 "engines": {
2124 "node": "14 || >=16.14"
@@ -2356,14 +2304,14 @@
2304 }
2305 },
2306 "node_modules/@npmcli/run-script": {
2359 - "version": "7.0.1",
2360 - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz",
2361 - "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==",
2307 + "version": "7.0.2",
2308 + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz",
2309 + "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==",
2310 "dev": true,
2311 "dependencies": {
2312 "@npmcli/node-gyp": "^3.0.0",
2313 "@npmcli/promise-spawn": "^7.0.0",
2366 - "node-gyp": "^9.0.0",
2314 + "node-gyp": "^10.0.0",
2315 "read-package-json-fast": "^3.0.0",
2316 "which": "^4.0.0"
2317 },
@@ -2758,9 +2706,9 @@
2706 }
2707 },
2708 "node_modules/@sigstore/sign": {
2761 - "version": "2.1.0",
2762 - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz",
2763 - "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==",
2709 + "version": "2.2.0",
2710 + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz",
2711 + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==",
2712 "dev": true,
2713 "dependencies": {
2714 "@sigstore/bundle": "^2.1.0",
@@ -2771,28 +2719,6 @@
2719 "node": "^16.14.0 || >=18.0.0"
2720 }
2721 },
2774 - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": {
2775 - "version": "13.0.0",
2776 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
2777 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
2778 - "dev": true,
2779 - "dependencies": {
2780 - "@npmcli/agent": "^2.0.0",
2781 - "cacache": "^18.0.0",
2782 - "http-cache-semantics": "^4.1.1",
2783 - "is-lambda": "^1.0.1",
2784 - "minipass": "^7.0.2",
2785 - "minipass-fetch": "^3.0.0",
2786 - "minipass-flush": "^1.0.5",
2787 - "minipass-pipeline": "^1.2.4",
2788 - "negotiator": "^0.6.3",
2789 - "promise-retry": "^2.0.1",
2790 - "ssri": "^10.0.0"
2791 - },
2792 - "engines": {
2793 - "node": "^16.14.0 || >=18.0.0"
2794 - }
2795 - },
2722 "node_modules/@sigstore/tuf": {
2723 "version": "2.2.0",
2724 "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz",
@@ -3285,15 +3211,6 @@
3211 "vue": "^3.0.0"
3212 }
3213 },
3288 - "node_modules/@tootallnate/once": {
3289 - "version": "2.0.0",
3290 - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
3291 - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
3292 - "dev": true,
3293 - "engines": {
3294 - "node": ">= 10"
3295 - }
3296 - },
3214 "node_modules/@trysound/sax": {
3215 "version": "0.2.0",
3216 "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -3897,15 +3814,15 @@
3814 "dev": true
3815 },
3816 "node_modules/@vitejs/plugin-vue": {
3900 - "version": "4.5.2",
3901 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz",
3902 - "integrity": "sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==",
3817 + "version": "5.0.0",
3818 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.0.tgz",
3819 + "integrity": "sha512-7x5e8X4J1Wi4NxudGjJBd2OFerAi/0nzF80ojCzvfj347WVr0YSn82C8BSsgwSHzlk9Kw5xnZfj0/7RLnNwP5w==",
3820 "dev": true,
3821 "engines": {
3905 - "node": "^14.18.0 || >=16.0.0"
3822 + "node": "^18.0.0 || >=20.0.0"
3823 },
3824 "peerDependencies": {
3908 - "vite": "^4.0.0 || ^5.0.0",
3825 + "vite": "^5.0.0",
3826 "vue": "^3.2.25"
3827 }
3828 },
@@ -4184,9 +4101,9 @@
4101 }
4102 },
4103 "node_modules/@vue/language-core": {
4187 - "version": "1.8.26",
4188 - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.26.tgz",
4189 - "integrity": "sha512-9cmza/Y2YTiOnKZ0Mi9zsNn7Irw+aKirP+5LLWVSNaL3fjKJjW1cD3HGBckasY2RuVh4YycvdA9/Q6EBpVd/7Q==",
4104 + "version": "1.8.27",
4105 + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
4106 + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
4107 "dev": true,
4108 "dependencies": {
4109 "@volar/language-core": "~1.11.1",
@@ -4331,12 +4248,12 @@
4248 }
4249 },
4250 "node_modules/@vueuse/components": {
4334 - "version": "10.7.0",
4335 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.0.tgz",
4336 - "integrity": "sha512-ycyF+fZtipP/8WVWZ5y6Cb9twJ0EeVHIqcqkCcTpmAJdheRjorT8v6cHk3h144HHTMgIfBWC6TaSukDG7QFmsw==",
4251 + "version": "10.7.1",
4252 + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.1.tgz",
4253 + "integrity": "sha512-bAS5ff1uNhNSeIYL7R3qeR0DP5u+Lutb0mFiTZTMhcicjhBfGiDbahHqoOAr9M/wfpYKNluP1U107y2fUTw4yw==",
4254 "dependencies": {
4338 - "@vueuse/core": "10.7.0",
4339 - "@vueuse/shared": "10.7.0",
4255 + "@vueuse/core": "10.7.1",
4256 + "@vueuse/shared": "10.7.1",
4257 "vue-demi": ">=0.14.6"
4258 }
4259 },
@@ -4366,13 +4283,13 @@
4283 }
4284 },
4285 "node_modules/@vueuse/core": {
4369 - "version": "10.7.0",
4370 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz",
4371 - "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==",
4286 + "version": "10.7.1",
4287 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz",
4288 + "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==",
4289 "dependencies": {
4290 "@types/web-bluetooth": "^0.0.20",
4374 - "@vueuse/metadata": "10.7.0",
4375 - "@vueuse/shared": "10.7.0",
4291 + "@vueuse/metadata": "10.7.1",
4292 + "@vueuse/shared": "10.7.1",
4293 "vue-demi": ">=0.14.6"
4294 },
4295 "funding": {
@@ -4405,17 +4322,17 @@
4322 }
4323 },
4324 "node_modules/@vueuse/metadata": {
4408 - "version": "10.7.0",
4409 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz",
4410 - "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==",
4325 + "version": "10.7.1",
4326 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz",
4327 + "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==",
4328 "funding": {
4329 "url": "https://github.com/sponsors/antfu"
4330 }
4331 },
4332 "node_modules/@vueuse/shared": {
4416 - "version": "10.7.0",
4417 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz",
4418 - "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==",
4333 + "version": "10.7.1",
4334 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz",
4335 + "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==",
4336 "dependencies": {
4337 "vue-demi": ">=0.14.6"
4338 },
@@ -4503,27 +4420,15 @@
4420 }
4421 },
4422 "node_modules/agent-base": {
4506 - "version": "6.0.2",
4507 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
4508 - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
4509 - "dev": true,
4510 - "dependencies": {
4511 - "debug": "4"
4512 - },
4513 - "engines": {
4514 - "node": ">= 6.0.0"
4515 - }
4516 - },
4517 - "node_modules/agentkeepalive": {
4518 - "version": "4.5.0",
4519 - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
4520 - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
4423 + "version": "7.1.0",
4424 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
4425 + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
4426 "dev": true,
4427 "dependencies": {
4523 - "humanize-ms": "^1.2.1"
4428 + "debug": "^4.3.4"
4429 },
4430 "engines": {
4526 - "node": ">= 8.0.0"
4431 + "node": ">= 14"
4432 }
4433 },
4434 "node_modules/aggregate-error": {
@@ -4620,9 +4525,9 @@
4525 }
4526 },
4527 "node_modules/apexcharts": {
4623 - "version": "3.45.0",
4624 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.45.0.tgz",
4625 - "integrity": "sha512-o+XI4ysvKtt+l+bGbk19s6Y2gFes/7LRLMAonDgcapz4frS0vzTfXiK77QcQc30TMwPiSN9Z8Tv+CBn57x63wg==",
4528 + "version": "3.45.1",
4529 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.45.1.tgz",
4530 + "integrity": "sha512-pPjj/SA6dfPvR/IKRZF0STdfBGpBh3WRt7K0DFuW9P8erypYkX17EHu3/molPRfo2zSiQwTVpshHC5ncysqfkA==",
4531 "dependencies": {
4532 "@yr/monotone-cubic-spline": "^1.0.3",
4533 "svg.draggable.js": "^2.2.2",
@@ -4633,12 +4538,6 @@
4538 "svg.select.js": "^3.0.1"
4539 }
4540 },
4636 - "node_modules/aproba": {
4637 - "version": "2.0.0",
4638 - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
4639 - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
4640 - "dev": true
4641 - },
4541 "node_modules/arch": {
4542 "version": "2.2.0",
4543 "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
@@ -4659,19 +4558,6 @@
4558 }
4559 ]
4560 },
4662 - "node_modules/are-we-there-yet": {
4663 - "version": "3.0.1",
4664 - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
4665 - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
4666 - "dev": true,
4667 - "dependencies": {
4668 - "delegates": "^1.0.0",
4669 - "readable-stream": "^3.6.0"
4670 - },
4671 - "engines": {
4672 - "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
4673 - }
4674 - },
4561 "node_modules/arg": {
4562 "version": "5.0.2",
4563 "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -5170,9 +5056,9 @@
5056 }
5057 },
5058 "node_modules/cacache": {
5173 - "version": "18.0.0",
5174 - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz",
5175 - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==",
5059 + "version": "18.0.1",
5060 + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz",
5061 + "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==",
5062 "dev": true,
5063 "dependencies": {
5064 "@npmcli/fs": "^3.1.0",
@@ -5180,7 +5066,7 @@
5066 "glob": "^10.2.2",
5067 "lru-cache": "^10.0.1",
5068 "minipass": "^7.0.3",
5183 - "minipass-collect": "^1.0.2",
5069 + "minipass-collect": "^2.0.1",
5070 "minipass-flush": "^1.0.5",
5071 "minipass-pipeline": "^1.2.4",
5072 "p-map": "^4.0.0",
@@ -5224,9 +5110,9 @@
5110 }
5111 },
5112 "node_modules/cacache/node_modules/lru-cache": {
5227 - "version": "10.0.1",
5228 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
5229 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
5113 + "version": "10.1.0",
5114 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
5115 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
5116 "dev": true,
5117 "engines": {
5118 "node": "14 || >=16.14"
@@ -5609,15 +5495,6 @@
5495 "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
5496 "dev": true
5497 },
5612 - "node_modules/color-support": {
5613 - "version": "1.1.3",
5614 - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
5615 - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
5616 - "dev": true,
5617 - "bin": {
5618 - "color-support": "bin.js"
5619 - }
5620 - },
5498 "node_modules/colord": {
5499 "version": "2.9.3",
5500 "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
@@ -5687,12 +5564,6 @@
5564 "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
5565 "dev": true
5566 },
5690 - "node_modules/console-control-strings": {
5691 - "version": "1.1.0",
5692 - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
5693 - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
5694 - "dev": true
5695 - },
5567 "node_modules/content-disposition": {
5568 "version": "0.5.4",
5569 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -5891,9 +5762,9 @@
5762 "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
5763 },
5764 "node_modules/cypress": {
5894 - "version": "13.6.1",
5895 - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.1.tgz",
5896 - "integrity": "sha512-k1Wl5PQcA/4UoTffYKKaxA0FJKwg8yenYNYRzLt11CUR0Kln+h7Udne6mdU1cUIdXBDTVZWtmiUjzqGs7/pEpw==",
5765 + "version": "13.6.2",
5766 + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.2.tgz",
5767 + "integrity": "sha512-TW3bGdPU4BrfvMQYv1z3oMqj71YI4AlgJgnrycicmPZAXtvywVFZW9DAToshO65D97rCWfG/kqMFsYB6Kp91gQ==",
5768 "dev": true,
5769 "hasInstallScript": true,
5770 "dependencies": {
@@ -7837,25 +7708,6 @@
7708 "url": "https://github.com/sponsors/ljharb"
7709 }
7710 },
7840 - "node_modules/gauge": {
7841 - "version": "4.0.4",
7842 - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
7843 - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
7844 - "dev": true,
7845 - "dependencies": {
7846 - "aproba": "^1.0.3 || ^2.0.0",
7847 - "color-support": "^1.1.3",
7848 - "console-control-strings": "^1.1.0",
7849 - "has-unicode": "^2.0.1",
7850 - "signal-exit": "^3.0.7",
7851 - "string-width": "^4.2.3",
7852 - "strip-ansi": "^6.0.1",
7853 - "wide-align": "^1.1.5"
7854 - },
7855 - "engines": {
7856 - "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
7857 - }
7858 - },
7711 "node_modules/gensync": {
7712 "version": "1.0.0-beta.2",
7713 "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -8211,12 +8063,6 @@
8063 "url": "https://github.com/sponsors/ljharb"
8064 }
8065 },
8214 - "node_modules/has-unicode": {
8215 - "version": "2.0.1",
8216 - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
8217 - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
8218 - "dev": true
8219 - },
8066 "node_modules/he": {
8067 "version": "1.2.0",
8068 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -8311,17 +8157,16 @@
8157 }
8158 },
8159 "node_modules/http-proxy-agent": {
8314 - "version": "5.0.0",
8315 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
8316 - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
8160 + "version": "7.0.0",
8161 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
8162 + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
8163 "dev": true,
8164 "dependencies": {
8319 - "@tootallnate/once": "2",
8320 - "agent-base": "6",
8321 - "debug": "4"
8165 + "agent-base": "^7.1.0",
8166 + "debug": "^4.3.4"
8167 },
8168 "engines": {
8324 - "node": ">= 6"
8169 + "node": ">= 14"
8170 }
8171 },
8172 "node_modules/http-signature": {
@@ -8339,16 +8184,16 @@
8184 }
8185 },
8186 "node_modules/https-proxy-agent": {
8342 - "version": "5.0.1",
8343 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
8344 - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
8187 + "version": "7.0.2",
8188 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
8189 + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
8190 "dev": true,
8191 "dependencies": {
8347 - "agent-base": "6",
8192 + "agent-base": "^7.0.2",
8193 "debug": "4"
8194 },
8195 "engines": {
8351 - "node": ">= 6"
8196 + "node": ">= 14"
8197 }
8198 },
8199 "node_modules/human-signals": {
@@ -8360,15 +8205,6 @@
8205 "node": ">=8.12.0"
8206 }
8207 },
8363 - "node_modules/humanize-ms": {
8364 - "version": "1.2.1",
8365 - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
8366 - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
8367 - "dev": true,
8368 - "dependencies": {
8369 - "ms": "^2.0.0"
8370 - }
8371 - },
8208 "node_modules/iconv-lite": {
8209 "version": "0.6.3",
8210 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -8410,9 +8246,9 @@
8246 }
8247 },
8248 "node_modules/ignore-walk": {
8413 - "version": "6.0.3",
8414 - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz",
8415 - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==",
8249 + "version": "6.0.4",
8250 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz",
8251 + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==",
8252 "dev": true,
8253 "dependencies": {
8254 "minimatch": "^9.0.0"
@@ -9046,9 +8882,9 @@
8882 }
8883 },
8884 "node_modules/jose": {
9049 - "version": "5.1.3",
9050 - "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.3.tgz",
9051 - "integrity": "sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw==",
8885 + "version": "5.2.0",
8886 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.0.tgz",
8887 + "integrity": "sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==",
8888 "funding": {
8889 "url": "https://github.com/sponsors/panva"
8890 }
@@ -9073,6 +8909,11 @@
8909 "node": ">=12"
8910 }
8911 },
8912 + "node_modules/js-md5": {
8913 + "version": "0.8.3",
8914 + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz",
8915 + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ=="
8916 + },
8917 "node_modules/js-tokens": {
8918 "version": "4.0.0",
8919 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -9137,18 +8978,6 @@
8978 }
8979 }
8980 },
9140 - "node_modules/jsdom/node_modules/agent-base": {
9141 - "version": "7.1.0",
9142 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
9143 - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
9144 - "dev": true,
9145 - "dependencies": {
9146 - "debug": "^4.3.4"
9147 - },
9148 - "engines": {
9149 - "node": ">= 14"
9150 - }
9151 - },
8981 "node_modules/jsdom/node_modules/form-data": {
8982 "version": "4.0.0",
8983 "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -9163,32 +8992,6 @@
8992 "node": ">= 6"
8993 }
8994 },
9166 - "node_modules/jsdom/node_modules/http-proxy-agent": {
9167 - "version": "7.0.0",
9168 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
9169 - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
9170 - "dev": true,
9171 - "dependencies": {
9172 - "agent-base": "^7.1.0",
9173 - "debug": "^4.3.4"
9174 - },
9175 - "engines": {
9176 - "node": ">= 14"
9177 - }
9178 - },
9179 - "node_modules/jsdom/node_modules/https-proxy-agent": {
9180 - "version": "7.0.2",
9181 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
9182 - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
9183 - "dev": true,
9184 - "dependencies": {
9185 - "agent-base": "^7.0.2",
9186 - "debug": "4"
9187 - },
9188 - "engines": {
9189 - "node": ">= 14"
9190 - }
9191 - },
8995 "node_modules/jsdom/node_modules/xml-name-validator": {
8996 "version": "5.0.0",
8997 "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
@@ -9223,9 +9026,9 @@
9026 "dev": true
9027 },
9028 "node_modules/json-parse-even-better-errors": {
9226 - "version": "3.0.0",
9227 - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz",
9228 - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==",
9029 + "version": "3.0.1",
9030 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
9031 + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
9032 "dev": true,
9033 "engines": {
9034 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -9837,125 +9640,25 @@
9640 "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
9641 },
9642 "node_modules/make-fetch-happen": {
9840 - "version": "11.1.1",
9841 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
9842 - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
9643 + "version": "13.0.0",
9644 + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
9645 + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
9646 "dev": true,
9647 "dependencies": {
9845 - "agentkeepalive": "^4.2.1",
9846 - "cacache": "^17.0.0",
9648 + "@npmcli/agent": "^2.0.0",
9649 + "cacache": "^18.0.0",
9650 "http-cache-semantics": "^4.1.1",
9848 - "http-proxy-agent": "^5.0.0",
9849 - "https-proxy-agent": "^5.0.0",
9651 "is-lambda": "^1.0.1",
9851 - "lru-cache": "^7.7.1",
9852 - "minipass": "^5.0.0",
9652 + "minipass": "^7.0.2",
9653 "minipass-fetch": "^3.0.0",
9654 "minipass-flush": "^1.0.5",
9655 "minipass-pipeline": "^1.2.4",
9656 "negotiator": "^0.6.3",
9657 "promise-retry": "^2.0.1",
9858 - "socks-proxy-agent": "^7.0.0",
9859 - "ssri": "^10.0.0"
9860 - },
9861 - "engines": {
9862 - "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
9863 - }
9864 - },
9865 - "node_modules/make-fetch-happen/node_modules/brace-expansion": {
9866 - "version": "2.0.1",
9867 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
9868 - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
9869 - "dev": true,
9870 - "dependencies": {
9871 - "balanced-match": "^1.0.0"
9872 - }
9873 - },
9874 - "node_modules/make-fetch-happen/node_modules/cacache": {
9875 - "version": "17.1.4",
9876 - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
9877 - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==",
9878 - "dev": true,
9879 - "dependencies": {
9880 - "@npmcli/fs": "^3.1.0",
9881 - "fs-minipass": "^3.0.0",
9882 - "glob": "^10.2.2",
9883 - "lru-cache": "^7.7.1",
9884 - "minipass": "^7.0.3",
9885 - "minipass-collect": "^1.0.2",
9886 - "minipass-flush": "^1.0.5",
9887 - "minipass-pipeline": "^1.2.4",
9888 - "p-map": "^4.0.0",
9889 - "ssri": "^10.0.0",
9890 - "tar": "^6.1.11",
9891 - "unique-filename": "^3.0.0"
9892 - },
9893 - "engines": {
9894 - "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
9895 - }
9896 - },
9897 - "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": {
9898 - "version": "7.0.4",
9899 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
9900 - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
9901 - "dev": true,
9902 - "engines": {
9903 - "node": ">=16 || 14 >=14.17"
9904 - }
9905 - },
9906 - "node_modules/make-fetch-happen/node_modules/glob": {
9907 - "version": "10.3.10",
9908 - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
9909 - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
9910 - "dev": true,
9911 - "dependencies": {
9912 - "foreground-child": "^3.1.0",
9913 - "jackspeak": "^2.3.5",
9914 - "minimatch": "^9.0.1",
9915 - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
9916 - "path-scurry": "^1.10.1"
9917 - },
9918 - "bin": {
9919 - "glob": "dist/esm/bin.mjs"
9920 - },
9921 - "engines": {
9922 - "node": ">=16 || 14 >=14.17"
9923 - },
9924 - "funding": {
9925 - "url": "https://github.com/sponsors/isaacs"
9926 - }
9927 - },
9928 - "node_modules/make-fetch-happen/node_modules/lru-cache": {
9929 - "version": "7.18.3",
9930 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
9931 - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
9932 - "dev": true,
9933 - "engines": {
9934 - "node": ">=12"
9935 - }
9936 - },
9937 - "node_modules/make-fetch-happen/node_modules/minimatch": {
9938 - "version": "9.0.3",
9939 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
9940 - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
9941 - "dev": true,
9942 - "dependencies": {
9943 - "brace-expansion": "^2.0.1"
9944 - },
9945 - "engines": {
9946 - "node": ">=16 || 14 >=14.17"
9947 - },
9948 - "funding": {
9949 - "url": "https://github.com/sponsors/isaacs"
9950 - }
9951 - },
9952 - "node_modules/make-fetch-happen/node_modules/minipass": {
9953 - "version": "5.0.0",
9954 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
9955 - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
9956 - "dev": true,
9658 + "ssri": "^10.0.0"
9659 + },
9660 "engines": {
9958 - "node": ">=8"
9661 + "node": "^16.14.0 || >=18.0.0"
9662 }
9663 },
9664 "node_modules/map-stream": {
@@ -10657,35 +10360,17 @@
10360 }
10361 },
10362 "node_modules/minipass-collect": {
10660 - "version": "1.0.2",
10661 - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
10662 - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
10663 - "dev": true,
10664 - "dependencies": {
10665 - "minipass": "^3.0.0"
10666 - },
10667 - "engines": {
10668 - "node": ">= 8"
10669 - }
10670 - },
10671 - "node_modules/minipass-collect/node_modules/minipass": {
10672 - "version": "3.3.6",
10673 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
10674 - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
10363 + "version": "2.0.1",
10364 + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
10365 + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
10366 "dev": true,
10367 "dependencies": {
10677 - "yallist": "^4.0.0"
10368 + "minipass": "^7.0.3"
10369 },
10370 "engines": {
10680 - "node": ">=8"
10371 + "node": ">=16 || 14 >=14.17"
10372 }
10373 },
10683 - "node_modules/minipass-collect/node_modules/yallist": {
10684 - "version": "4.0.0",
10685 - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
10686 - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
10687 - "dev": true
10688 - },
10374 "node_modules/minipass-fetch": {
10375 "version": "3.0.4",
10376 "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
@@ -10975,50 +10660,78 @@
10660 "dev": true
10661 },
10662 "node_modules/node-gyp": {
10978 - "version": "9.4.0",
10979 - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz",
10980 - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==",
10663 + "version": "10.0.1",
10664 + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz",
10665 + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==",
10666 "dev": true,
10667 "dependencies": {
10668 "env-paths": "^2.2.0",
10669 "exponential-backoff": "^3.1.1",
10985 - "glob": "^7.1.4",
10670 + "glob": "^10.3.10",
10671 "graceful-fs": "^4.2.6",
10987 - "make-fetch-happen": "^11.0.3",
10988 - "nopt": "^6.0.0",
10989 - "npmlog": "^6.0.0",
10990 - "rimraf": "^3.0.2",
10672 + "make-fetch-happen": "^13.0.0",
10673 + "nopt": "^7.0.0",
10674 + "proc-log": "^3.0.0",
10675 "semver": "^7.3.5",
10676 "tar": "^6.1.2",
10993 - "which": "^2.0.2"
10677 + "which": "^4.0.0"
10678 },
10679 "bin": {
10680 "node-gyp": "bin/node-gyp.js"
10681 },
10682 "engines": {
10999 - "node": "^12.13 || ^14.13 || >=16"
10683 + "node": "^16.14.0 || >=18.0.0"
10684 + }
10685 + },
10686 + "node_modules/node-gyp/node_modules/abbrev": {
10687 + "version": "2.0.0",
10688 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
10689 + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
10690 + "dev": true,
10691 + "engines": {
10692 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
10693 + }
10694 + },
10695 + "node_modules/node-gyp/node_modules/brace-expansion": {
10696 + "version": "2.0.1",
10697 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
10698 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
10699 + "dev": true,
10700 + "dependencies": {
10701 + "balanced-match": "^1.0.0"
10702 }
10703 },
10704 "node_modules/node-gyp/node_modules/glob": {
11003 - "version": "7.2.3",
11004 - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
11005 - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
10705 + "version": "10.3.10",
10706 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
10707 + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
10708 "dev": true,
10709 "dependencies": {
11008 - "fs.realpath": "^1.0.0",
11009 - "inflight": "^1.0.4",
11010 - "inherits": "2",
11011 - "minimatch": "^3.1.1",
11012 - "once": "^1.3.0",
11013 - "path-is-absolute": "^1.0.0"
10710 + "foreground-child": "^3.1.0",
10711 + "jackspeak": "^2.3.5",
10712 + "minimatch": "^9.0.1",
10713 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
10714 + "path-scurry": "^1.10.1"
10715 + },
10716 + "bin": {
10717 + "glob": "dist/esm/bin.mjs"
10718 },
10719 "engines": {
11016 - "node": "*"
10720 + "node": ">=16 || 14 >=14.17"
10721 },
10722 "funding": {
10723 "url": "https://github.com/sponsors/isaacs"
10724 }
10725 },
10726 + "node_modules/node-gyp/node_modules/isexe": {
10727 + "version": "3.1.1",
10728 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
10729 + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
10730 + "dev": true,
10731 + "engines": {
10732 + "node": ">=16"
10733 + }
10734 + },
10735 "node_modules/node-gyp/node_modules/lru-cache": {
10736 "version": "6.0.0",
10737 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -11031,6 +10744,36 @@
10744 "node": ">=10"
10745 }
10746 },
10747 + "node_modules/node-gyp/node_modules/minimatch": {
10748 + "version": "9.0.3",
10749 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
10750 + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
10751 + "dev": true,
10752 + "dependencies": {
10753 + "brace-expansion": "^2.0.1"
10754 + },
10755 + "engines": {
10756 + "node": ">=16 || 14 >=14.17"
10757 + },
10758 + "funding": {
10759 + "url": "https://github.com/sponsors/isaacs"
10760 + }
10761 + },
10762 + "node_modules/node-gyp/node_modules/nopt": {
10763 + "version": "7.2.0",
10764 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
10765 + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
10766 + "dev": true,
10767 + "dependencies": {
10768 + "abbrev": "^2.0.0"
10769 + },
10770 + "bin": {
10771 + "nopt": "bin/nopt.js"
10772 + },
10773 + "engines": {
10774 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
10775 + }
10776 + },
10777 "node_modules/node-gyp/node_modules/semver": {
10778 "version": "7.5.4",
10779 "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@@ -11046,6 +10789,21 @@
10789 "node": ">=10"
10790 }
10791 },
10792 + "node_modules/node-gyp/node_modules/which": {
10793 + "version": "4.0.0",
10794 + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
10795 + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
10796 + "dev": true,
10797 + "dependencies": {
10798 + "isexe": "^3.1.1"
10799 + },
10800 + "bin": {
10801 + "node-which": "bin/which.js"
10802 + },
10803 + "engines": {
10804 + "node": "^16.13.0 || >=18.0.0"
10805 + }
10806 + },
10807 "node_modules/node-gyp/node_modules/yallist": {
10808 "version": "4.0.0",
10809 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -11125,9 +10883,9 @@
10883 }
10884 },
10885 "node_modules/npm-install-checks": {
11128 - "version": "6.2.0",
11129 - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz",
11130 - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==",
10886 + "version": "6.3.0",
10887 + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
10888 + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
10889 "dev": true,
10890 "dependencies": {
10891 "semver": "^7.1.1"
@@ -11206,9 +10964,9 @@
10964 }
10965 },
10966 "node_modules/npm-package-arg/node_modules/lru-cache": {
11209 - "version": "10.0.1",
11210 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
11211 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
10967 + "version": "10.1.0",
10968 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
10969 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
10970 "dev": true,
10971 "engines": {
10972 "node": "14 || >=16.14"
@@ -11248,12 +11006,12 @@
11006 "dev": true
11007 },
11008 "node_modules/npm-packlist": {
11251 - "version": "8.0.0",
11252 - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz",
11253 - "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==",
11009 + "version": "8.0.1",
11010 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.1.tgz",
11011 + "integrity": "sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q==",
11012 "dev": true,
11013 "dependencies": {
11256 - "ignore-walk": "^6.0.0"
11014 + "ignore-walk": "^6.0.4"
11015 },
11016 "engines": {
11017 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
@@ -11308,9 +11066,9 @@
11066 "dev": true
11067 },
11068 "node_modules/npm-registry-fetch": {
11311 - "version": "16.0.0",
11312 - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.0.0.tgz",
11313 - "integrity": "sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ==",
11069 + "version": "16.1.0",
11070 + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz",
11071 + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==",
11072 "dev": true,
11073 "dependencies": {
11074 "make-fetch-happen": "^13.0.0",
@@ -11325,28 +11083,6 @@
11083 "node": "^16.14.0 || >=18.0.0"
11084 }
11085 },
11328 - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": {
11329 - "version": "13.0.0",
11330 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
11331 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
11332 - "dev": true,
11333 - "dependencies": {
11334 - "@npmcli/agent": "^2.0.0",
11335 - "cacache": "^18.0.0",
11336 - "http-cache-semantics": "^4.1.1",
11337 - "is-lambda": "^1.0.1",
11338 - "minipass": "^7.0.2",
11339 - "minipass-fetch": "^3.0.0",
11340 - "minipass-flush": "^1.0.5",
11341 - "minipass-pipeline": "^1.2.4",
11342 - "negotiator": "^0.6.3",
11343 - "promise-retry": "^2.0.1",
11344 - "ssri": "^10.0.0"
11345 - },
11346 - "engines": {
11347 - "node": "^16.14.0 || >=18.0.0"
11348 - }
11349 - },
11086 "node_modules/npm-run-all": {
11087 "version": "4.1.5",
11088 "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
@@ -11451,21 +11187,6 @@
11187 "node": ">=8"
11188 }
11189 },
11454 - "node_modules/npmlog": {
11455 - "version": "6.0.2",
11456 - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
11457 - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
11458 - "dev": true,
11459 - "dependencies": {
11460 - "are-we-there-yet": "^3.0.0",
11461 - "console-control-strings": "^1.1.0",
11462 - "gauge": "^4.0.3",
11463 - "set-blocking": "^2.0.0"
11464 - },
11465 - "engines": {
11466 - "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
11467 - }
11468 - },
11190 "node_modules/nth-check": {
11191 "version": "2.1.1",
11192 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -11716,9 +11437,9 @@
11437 }
11438 },
11439 "node_modules/pacote": {
11719 - "version": "17.0.4",
11720 - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz",
11721 - "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==",
11440 + "version": "17.0.5",
11441 + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.5.tgz",
11442 + "integrity": "sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA==",
11443 "dev": true,
11444 "dependencies": {
11445 "@npmcli/git": "^5.0.0",
@@ -11862,9 +11583,9 @@
11583 }
11584 },
11585 "node_modules/path-scurry/node_modules/lru-cache": {
11865 - "version": "10.0.1",
11866 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
11867 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
11586 + "version": "10.1.0",
11587 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
11588 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
11589 "dev": true,
11590 "engines": {
11591 "node": "14 || >=16.14"
@@ -12799,9 +12520,9 @@
12520 }
12521 },
12522 "node_modules/read-package-json/node_modules/lru-cache": {
12802 - "version": "10.0.1",
12803 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
12804 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
12523 + "version": "10.1.0",
12524 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
12525 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
12526 "dev": true,
12527 "engines": {
12528 "node": "14 || >=16.14"
@@ -12905,20 +12626,6 @@
12626 "node": ">=4"
12627 }
12628 },
12908 - "node_modules/readable-stream": {
12909 - "version": "3.6.2",
12910 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
12911 - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
12912 - "dev": true,
12913 - "dependencies": {
12914 - "inherits": "^2.0.3",
12915 - "string_decoder": "^1.1.1",
12916 - "util-deprecate": "^1.0.1"
12917 - },
12918 - "engines": {
12919 - "node": ">= 6"
12920 - }
12921 - },
12629 "node_modules/readdirp": {
12630 "version": "3.6.0",
12631 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -13523,12 +13230,6 @@
13230 "semver": "bin/semver.js"
13231 }
13232 },
13526 - "node_modules/set-blocking": {
13527 - "version": "2.0.0",
13528 - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
13529 - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
13530 - "dev": true
13531 - },
13233 "node_modules/set-function-name": {
13234 "version": "2.0.1",
13235 "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
@@ -13744,17 +13445,17 @@
13445 }
13446 },
13447 "node_modules/socks-proxy-agent": {
13747 - "version": "7.0.0",
13748 - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
13749 - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
13448 + "version": "8.0.2",
13449 + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
13450 + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
13451 "dev": true,
13452 "dependencies": {
13752 - "agent-base": "^6.0.2",
13753 - "debug": "^4.3.3",
13754 - "socks": "^2.6.2"
13453 + "agent-base": "^7.0.2",
13454 + "debug": "^4.3.4",
13455 + "socks": "^2.7.1"
13456 },
13457 "engines": {
13757 - "node": ">= 10"
13458 + "node": ">= 14"
13459 }
13460 },
13461 "node_modules/sort-asc": {
@@ -14012,15 +13713,6 @@
13713 "duplexer": "~0.1.1"
13714 }
13715 },
14015 - "node_modules/string_decoder": {
14016 - "version": "1.3.0",
14017 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
14018 - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
14019 - "dev": true,
14020 - "dependencies": {
14021 - "safe-buffer": "~5.2.0"
14022 - }
14023 - },
13716 "node_modules/string-width": {
13717 "version": "4.2.3",
13718 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -14584,18 +14276,18 @@
14276 "dev": true
14277 },
14278 "node_modules/taze": {
14587 - "version": "0.13.0",
14588 - "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.0.tgz",
14589 - "integrity": "sha512-o17Y6miF+44sDJ7haRHTqZefTlGOaBSdDHRwRcrt+s3WeGSPBUtPSG18XNwToIXN//eh58hyYnyDwTnpYLp4sg==",
14279 + "version": "0.13.1",
14280 + "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.1.tgz",
14281 + "integrity": "sha512-viIeTWEezE1mtQ9M9dtvIwfF7WkNRXVZP7g/NsGDFxwwzJIVJReSiZiyfsJccdJo6XUe7FaYzvrG1VD6Tnj4Jg==",
14282 "dev": true,
14283 "dependencies": {
14284 "@antfu/ni": "^0.21.12",
14593 - "@npmcli/config": "^8.0.2",
14285 + "@npmcli/config": "^8.0.3",
14286 "cli-progress": "^3.12.0",
14287 "deepmerge": "^4.3.1",
14288 "detect-indent": "^7.0.1",
14289 "execa": "^8.0.1",
14598 - "pacote": "^17.0.4",
14290 + "pacote": "^17.0.5",
14291 "picocolors": "^1.0.0",
14292 "prompts": "^2.4.2",
14293 "semver": "^7.5.4",
@@ -15059,28 +14751,6 @@
14751 "node": "^16.14.0 || >=18.0.0"
14752 }
14753 },
15062 - "node_modules/tuf-js/node_modules/make-fetch-happen": {
15063 - "version": "13.0.0",
15064 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
15065 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
15066 - "dev": true,
15067 - "dependencies": {
15068 - "@npmcli/agent": "^2.0.0",
15069 - "cacache": "^18.0.0",
15070 - "http-cache-semantics": "^4.1.1",
15071 - "is-lambda": "^1.0.1",
15072 - "minipass": "^7.0.2",
15073 - "minipass-fetch": "^3.0.0",
15074 - "minipass-flush": "^1.0.5",
15075 - "minipass-pipeline": "^1.2.4",
15076 - "negotiator": "^0.6.3",
15077 - "promise-retry": "^2.0.1",
15078 - "ssri": "^10.0.0"
15079 - },
15080 - "engines": {
15081 - "node": "^16.14.0 || >=18.0.0"
15082 - }
15083 - },
14754 "node_modules/tunnel-agent": {
14755 "version": "0.6.0",
14756 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -16215,9 +15885,9 @@
15885 }
15886 },
15887 "node_modules/vue-template-compiler": {
16218 - "version": "2.7.15",
16219 - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz",
16220 - "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==",
15888 + "version": "2.7.16",
15889 + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
15890 + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
15891 "dev": true,
15892 "dependencies": {
15893 "de-indent": "^1.0.2",
@@ -16225,13 +15895,13 @@
15895 }
15896 },
15897 "node_modules/vue-tsc": {
16228 - "version": "1.8.26",
16229 - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.26.tgz",
16230 - "integrity": "sha512-jMEJ4aqU/l1hdgmeExH5h1TFoN+hbho0A2ZAhHy53/947DGm7Qj/bpB85VpECOCwV00h7JYNVnvoD2ceOorB4Q==",
15898 + "version": "1.8.27",
15899 + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
15900 + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
15901 "dev": true,
15902 "dependencies": {
15903 "@volar/typescript": "~1.11.1",
16234 - "@vue/language-core": "1.8.26",
15904 + "@vue/language-core": "1.8.27",
15905 "semver": "^7.5.4"
15906 },
15907 "bin": {
@@ -16506,15 +16176,6 @@
16176 "node": ">=8"
16177 }
16178 },
16509 - "node_modules/wide-align": {
16510 - "version": "1.1.5",
16511 - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
16512 - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
16513 - "dev": true,
16514 - "dependencies": {
16515 - "string-width": "^1.0.2 || 2 || 3 || 4"
16516 - }
16517 - },
16179 "node_modules/wrap-ansi": {
16180 "version": "7.0.0",
16181 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -17161,8 +16822,7 @@
16822 "dependencies": {
16823 "is-unicode-supported": {
16824 "version": "1.3.0",
17164 - "bundled": true,
17165 - "extraneous": true
16825 + "bundled": true
16826 }
16827 }
16828 },
@@ -17868,11 +17528,11 @@
17528 }
17529 },
17530 "@milkdown/core": {
17871 - "version": "7.3.2",
17872 - "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.2.tgz",
17873 - "integrity": "sha512-FbfFx5GpX7cxbZAyT03Pgnx9tLMrFJJK/RIyShgk5xyVtZGxEwQZ4tTqL280dNmjv5iXCAYz2nG5+8kIKJh4EQ==",
17531 + "version": "7.3.3",
17532 + "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.3.tgz",
17533 + "integrity": "sha512-aiESjMQoUT8k4j8dEhN/WpuQOFkZf7iO/GqJ8RRpcgGEKtPz939aN58R9aSfWm/5tNCNwK2uftmxt0ubdH1YRw==",
17534 "requires": {
17875 - "@milkdown/exception": "7.3.2",
17535 + "@milkdown/exception": "7.3.3",
17536 "remark-parse": "^11.0.0",
17537 "remark-stringify": "^11.0.0",
17538 "tslib": "^2.5.0",
@@ -17880,29 +17540,29 @@
17540 }
17541 },
17542 "@milkdown/ctx": {
17883 - "version": "7.3.2",
17884 - "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.2.tgz",
17885 - "integrity": "sha512-D5bxCWlubfpSlGru58gQd6jBd6a+Gh8vYnWnuozS5NRj9bC2JeBmw92LR52Kxoh7OegiWyKPcXQKEdwU6EKTkg==",
17543 + "version": "7.3.3",
17544 + "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.3.tgz",
17545 + "integrity": "sha512-AEtuWQYZIrgceCceNriC6w8LN1xcTLbmCgxWdn7V1uUD3cV6LhmpHcTuBiaB+CeJe9HFvTldrkWv67dCyGXU0w==",
17546 "requires": {
17887 - "@milkdown/exception": "7.3.2",
17547 + "@milkdown/exception": "7.3.3",
17548 "tslib": "^2.5.0"
17549 }
17550 },
17551 "@milkdown/exception": {
17892 - "version": "7.3.2",
17893 - "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.2.tgz",
17894 - "integrity": "sha512-y46GujvdvlSjeq455VLtVFr3EvRIkseOmQ1cKWMs04HZ06/r/auY2yu/+3ORJ2qQEG1bXoeuTLe4Sq/PgqXSPw==",
17552 + "version": "7.3.3",
17553 + "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.3.tgz",
17554 + "integrity": "sha512-q6S9P5yux23BPy5/GK81OslQuVWD+PrNljb1asv10TTscZAyZmgCMvECQrR3qrwd/Ja5JN5C2CcYLe1JgzI1Fg==",
17555 "requires": {
17556 "tslib": "^2.5.0"
17557 }
17558 },
17559 "@milkdown/preset-commonmark": {
17900 - "version": "7.3.2",
17901 - "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.2.tgz",
17902 - "integrity": "sha512-gy7Ay1zAHYl07sPraR+tC2bZsw0dyDt+B36QgsIoEpRvKI4LPNSfI+0UuiK0yzKmELsMvMZNu8yxG32q/dtSZA==",
17560 + "version": "7.3.3",
17561 + "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.3.tgz",
17562 + "integrity": "sha512-Hy1gKgoaH8W0lvruKxu52CJ27iqngqavHsEvqDjHehzpkjoG30/1Fjyn/Jf7IT4oByoG1l9u3ejy6jx6TtYR3A==",
17563 "requires": {
17904 - "@milkdown/exception": "7.3.2",
17905 - "@milkdown/utils": "7.3.2",
17564 + "@milkdown/exception": "7.3.3",
17565 + "@milkdown/utils": "7.3.3",
17566 "@sindresorhus/slugify": "^2.2.0",
17567 "remark-inline-links": "^7.0.0",
17568 "tslib": "^2.5.0",
@@ -17910,11 +17570,11 @@
17570 }
17571 },
17572 "@milkdown/prose": {
17913 - "version": "7.3.2",
17914 - "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.2.tgz",
17915 - "integrity": "sha512-3CeQ6Z75SL0zSm/fHzbP3e3I2a4+kFbkXI6vreK6AKQeCjYSJ8r/uJLkoDYRmJKOzc6HmnuCpIMbzZQ9kaeEnw==",
17573 + "version": "7.3.3",
17574 + "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.3.tgz",
17575 + "integrity": "sha512-d+Dv2C7cSWBfkG3scLnc+6IA40nKNIJM37NFBQ6mbOW7/6dj1m5vhNGZN+LDKlEEYOhVko+Kr6vwI4FfuY+pUw==",
17576 "requires": {
17917 - "@milkdown/exception": "7.3.2",
17577 + "@milkdown/exception": "7.3.3",
17578 "prosemirror-changeset": "^2.2.1",
17579 "prosemirror-commands": "^1.5.2",
17580 "prosemirror-dropcursor": "^1.8.1",
@@ -17932,9 +17592,9 @@
17592 }
17593 },
17594 "@milkdown/theme-nord": {
17935 - "version": "7.3.2",
17936 - "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.2.tgz",
17937 - "integrity": "sha512-CgydLp7E47a1EsFEMoLICSNeKnVfcGeD8FByXtHou4OZcLxYfQdvtGEOObVlgBa01qNOdbATRZsrIl4rc8likQ==",
17595 + "version": "7.3.3",
17596 + "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.3.tgz",
17597 + "integrity": "sha512-hXD8Qgb0tREIcNMCpV7VDAzT43dPQXsAwn7J5gvojx76MHI8SRV4y3c04LP+OncR3H2LGgkqB3+eew6vWA32iA==",
17598 "requires": {
17599 "clsx": "^2.0.0",
17600 "tslib": "^2.5.0"
@@ -17948,11 +17608,11 @@
17608 }
17609 },
17610 "@milkdown/transformer": {
17951 - "version": "7.3.2",
17952 - "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.2.tgz",
17953 - "integrity": "sha512-FsasNHjRRbRha4I3jXhK7FZymTzp4bAeqTB65QcIg5TILSpYan0BCZ2oDqnChK7wxppA9cP29iLOg/FJvNdhmw==",
17611 + "version": "7.3.3",
17612 + "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.3.tgz",
17613 + "integrity": "sha512-rSKKi5VBfIu1bXq4tG/LBWDAMjbnSWZEtKm+lHjXmjPsR47KpBSkQgsLfMkX4LQrX4bCoTyqEiqnFIfFe/KmOA==",
17614 "requires": {
17955 - "@milkdown/exception": "7.3.2",
17615 + "@milkdown/exception": "7.3.3",
17616 "remark": "^15.0.1",
17617 "remark-parse": "^11.0.0",
17618 "remark-stringify": "^11.0.0",
@@ -17961,21 +17621,21 @@
17621 }
17622 },
17623 "@milkdown/utils": {
17964 - "version": "7.3.2",
17965 - "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.2.tgz",
17966 - "integrity": "sha512-Dsdfkcs7D/gujERtegsyG+fLa/UbuczSI7+YueXrmyQ7y6LE/Ob8bo/PwSiISFTn4+hzZfchdmcYSmgvlblQNQ==",
17624 + "version": "7.3.3",
17625 + "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.3.tgz",
17626 + "integrity": "sha512-PwM43+YLuvS+RUaiFWZPS6vBxGcEp9nUY2U0h00FHRJjbTSriDHcnTgpkRX5u2JKBaWaRCDTFGjVmfJI6q6LGA==",
17627 "requires": {
17968 - "@milkdown/exception": "7.3.2",
17628 + "@milkdown/exception": "7.3.3",
17629 "nanoid": "^5.0.0",
17630 "tslib": "^2.5.0"
17631 }
17632 },
17633 "@milkdown/vue": {
17974 - "version": "7.3.2",
17975 - "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.2.tgz",
17976 - "integrity": "sha512-GgxjZrSaQDfSg/C/4UXz3vC8K1d6JeQ7jeFMnQBinvic2zJuzARDRNPVADEuU6zsHBvL8hCXlI4DiV6OTmzuIg==",
17634 + "version": "7.3.3",
17635 + "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.3.tgz",
17636 + "integrity": "sha512-Ib2iXTUNXoKzIb4sDobqdmGgC73ehYVkpKy1v7O2lDsITC2QN79FaRY+o0tKMPOfyIiBUhpspySNxIfC1QfBWg==",
17637 "requires": {
17978 - "@milkdown/utils": "7.3.2",
17638 + "@milkdown/utils": "7.3.3",
17639 "tslib": "^2.5.0"
17640 }
17641 },
@@ -18018,58 +17678,18 @@
17678 "socks-proxy-agent": "^8.0.1"
17679 },
17680 "dependencies": {
18021 - "agent-base": {
18022 - "version": "7.1.0",
18023 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
18024 - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
18025 - "dev": true,
18026 - "requires": {
18027 - "debug": "^4.3.4"
18028 - }
18029 - },
18030 - "http-proxy-agent": {
18031 - "version": "7.0.0",
18032 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
18033 - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
18034 - "dev": true,
18035 - "requires": {
18036 - "agent-base": "^7.1.0",
18037 - "debug": "^4.3.4"
18038 - }
18039 - },
18040 - "https-proxy-agent": {
18041 - "version": "7.0.2",
18042 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
18043 - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
18044 - "dev": true,
18045 - "requires": {
18046 - "agent-base": "^7.0.2",
18047 - "debug": "4"
18048 - }
18049 - },
17681 "lru-cache": {
18051 - "version": "10.0.1",
18052 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
18053 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
17682 + "version": "10.1.0",
17683 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
17684 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
17685 "dev": true
18055 - },
18056 - "socks-proxy-agent": {
18057 - "version": "8.0.2",
18058 - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
18059 - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
18060 - "dev": true,
18061 - "requires": {
18062 - "agent-base": "^7.0.2",
18063 - "debug": "^4.3.4",
18064 - "socks": "^2.7.1"
18065 - }
17686 }
17687 }
17688 },
17689 "@npmcli/config": {
18070 - "version": "8.0.2",
18071 - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.2.tgz",
18072 - "integrity": "sha512-g+DAp7bUsiUDynRI4jTO0wPAXJpy3puhovHHg8S4iq54NF8zd00588GJOm5ARxDaDUdKCUYu9E5fNc+esYl5JA==",
17690 + "version": "8.0.3",
17691 + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.3.tgz",
17692 + "integrity": "sha512-rqRX7/UORvm2YRImY67kyfwD9rpi5+KXXb1j/cpTUKRcUqvpJ9/PMMc7Vv57JVqmrFj8siBBFEmXI3Gg7/TonQ==",
17693 "dev": true,
17694 "requires": {
17695 "@npmcli/map-workspaces": "^3.0.2",
@@ -18193,9 +17813,9 @@
17813 "dev": true
17814 },
17815 "lru-cache": {
18196 - "version": "10.0.1",
18197 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
18198 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
17816 + "version": "10.1.0",
17817 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
17818 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
17819 "dev": true
17820 },
17821 "semver": {
@@ -18329,14 +17949,14 @@
17949 }
17950 },
17951 "@npmcli/run-script": {
18332 - "version": "7.0.1",
18333 - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz",
18334 - "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==",
17952 + "version": "7.0.2",
17953 + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.2.tgz",
17954 + "integrity": "sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==",
17955 "dev": true,
17956 "requires": {
17957 "@npmcli/node-gyp": "^3.0.0",
17958 "@npmcli/promise-spawn": "^7.0.0",
18339 - "node-gyp": "^9.0.0",
17959 + "node-gyp": "^10.0.0",
17960 "read-package-json-fast": "^3.0.0",
17961 "which": "^4.0.0"
17962 },
@@ -18610,35 +18230,14 @@
18230 "dev": true
18231 },
18232 "@sigstore/sign": {
18613 - "version": "2.1.0",
18614 - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz",
18615 - "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==",
18233 + "version": "2.2.0",
18234 + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.0.tgz",
18235 + "integrity": "sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==",
18236 "dev": true,
18237 "requires": {
18238 "@sigstore/bundle": "^2.1.0",
18239 "@sigstore/protobuf-specs": "^0.2.1",
18240 "make-fetch-happen": "^13.0.0"
18621 - },
18622 - "dependencies": {
18623 - "make-fetch-happen": {
18624 - "version": "13.0.0",
18625 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
18626 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
18627 - "dev": true,
18628 - "requires": {
18629 - "@npmcli/agent": "^2.0.0",
18630 - "cacache": "^18.0.0",
18631 - "http-cache-semantics": "^4.1.1",
18632 - "is-lambda": "^1.0.1",
18633 - "minipass": "^7.0.2",
18634 - "minipass-fetch": "^3.0.0",
18635 - "minipass-flush": "^1.0.5",
18636 - "minipass-pipeline": "^1.2.4",
18637 - "negotiator": "^0.6.3",
18638 - "promise-retry": "^2.0.1",
18639 - "ssri": "^10.0.0"
18640 - }
18641 - }
18241 }
18242 },
18243 "@sigstore/tuf": {
@@ -18913,12 +18512,6 @@
18512 "@tiptap/extension-floating-menu": "^2.1.13"
18513 }
18514 },
18916 - "@tootallnate/once": {
18917 - "version": "2.0.0",
18918 - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
18919 - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
18920 - "dev": true
18921 - },
18515 "@trysound/sax": {
18516 "version": "0.2.0",
18517 "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -19399,9 +18992,9 @@
18992 "dev": true
18993 },
18994 "@vitejs/plugin-vue": {
19402 - "version": "4.5.2",
19403 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz",
19404 - "integrity": "sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ==",
18995 + "version": "5.0.0",
18996 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.0.tgz",
18997 + "integrity": "sha512-7x5e8X4J1Wi4NxudGjJBd2OFerAi/0nzF80ojCzvfj347WVr0YSn82C8BSsgwSHzlk9Kw5xnZfj0/7RLnNwP5w==",
18998 "dev": true,
18999 "requires": {}
19000 },
@@ -19619,9 +19212,9 @@
19212 }
19213 },
19214 "@vue/language-core": {
19622 - "version": "1.8.26",
19623 - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.26.tgz",
19624 - "integrity": "sha512-9cmza/Y2YTiOnKZ0Mi9zsNn7Irw+aKirP+5LLWVSNaL3fjKJjW1cD3HGBckasY2RuVh4YycvdA9/Q6EBpVd/7Q==",
19215 + "version": "1.8.27",
19216 + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
19217 + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
19218 "dev": true,
19219 "requires": {
19220 "@volar/language-core": "~1.11.1",
@@ -19741,12 +19334,12 @@
19334 }
19335 },
19336 "@vueuse/components": {
19744 - "version": "10.7.0",
19745 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.0.tgz",
19746 - "integrity": "sha512-ycyF+fZtipP/8WVWZ5y6Cb9twJ0EeVHIqcqkCcTpmAJdheRjorT8v6cHk3h144HHTMgIfBWC6TaSukDG7QFmsw==",
19337 + "version": "10.7.1",
19338 + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.1.tgz",
19339 + "integrity": "sha512-bAS5ff1uNhNSeIYL7R3qeR0DP5u+Lutb0mFiTZTMhcicjhBfGiDbahHqoOAr9M/wfpYKNluP1U107y2fUTw4yw==",
19340 "requires": {
19748 - "@vueuse/core": "10.7.0",
19749 - "@vueuse/shared": "10.7.0",
19341 + "@vueuse/core": "10.7.1",
19342 + "@vueuse/shared": "10.7.1",
19343 "vue-demi": ">=0.14.6"
19344 },
19345 "dependencies": {
@@ -19759,13 +19352,13 @@
19352 }
19353 },
19354 "@vueuse/core": {
19762 - "version": "10.7.0",
19763 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz",
19764 - "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==",
19355 + "version": "10.7.1",
19356 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz",
19357 + "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==",
19358 "requires": {
19359 "@types/web-bluetooth": "^0.0.20",
19767 - "@vueuse/metadata": "10.7.0",
19768 - "@vueuse/shared": "10.7.0",
19360 + "@vueuse/metadata": "10.7.1",
19361 + "@vueuse/shared": "10.7.1",
19362 "vue-demi": ">=0.14.6"
19363 },
19364 "dependencies": {
@@ -19778,14 +19371,14 @@
19371 }
19372 },
19373 "@vueuse/metadata": {
19781 - "version": "10.7.0",
19782 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz",
19783 - "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA=="
19374 + "version": "10.7.1",
19375 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz",
19376 + "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw=="
19377 },
19378 "@vueuse/shared": {
19786 - "version": "10.7.0",
19787 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz",
19788 - "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==",
19379 + "version": "10.7.1",
19380 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz",
19381 + "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==",
19382 "requires": {
19383 "vue-demi": ">=0.14.6"
19384 },
@@ -19839,21 +19432,12 @@
19432 "dev": true
19433 },
19434 "agent-base": {
19842 - "version": "6.0.2",
19843 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
19844 - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
19845 - "dev": true,
19846 - "requires": {
19847 - "debug": "4"
19848 - }
19849 - },
19850 - "agentkeepalive": {
19851 - "version": "4.5.0",
19852 - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
19853 - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
19435 + "version": "7.1.0",
19436 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
19437 + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
19438 "dev": true,
19439 "requires": {
19856 - "humanize-ms": "^1.2.1"
19440 + "debug": "^4.3.4"
19441 }
19442 },
19443 "aggregate-error": {
@@ -19925,9 +19509,9 @@
19509 }
19510 },
19511 "apexcharts": {
19928 - "version": "3.45.0",
19929 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.45.0.tgz",
19930 - "integrity": "sha512-o+XI4ysvKtt+l+bGbk19s6Y2gFes/7LRLMAonDgcapz4frS0vzTfXiK77QcQc30TMwPiSN9Z8Tv+CBn57x63wg==",
19512 + "version": "3.45.1",
19513 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.45.1.tgz",
19514 + "integrity": "sha512-pPjj/SA6dfPvR/IKRZF0STdfBGpBh3WRt7K0DFuW9P8erypYkX17EHu3/molPRfo2zSiQwTVpshHC5ncysqfkA==",
19515 "requires": {
19516 "@yr/monotone-cubic-spline": "^1.0.3",
19517 "svg.draggable.js": "^2.2.2",
@@ -19936,13 +19520,7 @@
19520 "svg.pathmorphing.js": "^0.1.3",
19521 "svg.resize.js": "^1.4.3",
19522 "svg.select.js": "^3.0.1"
19939 - }
19940 - },
19941 - "aproba": {
19942 - "version": "2.0.0",
19943 - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
19944 - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
19945 - "dev": true
19523 + }
19524 },
19525 "arch": {
19526 "version": "2.2.0",
@@ -19950,16 +19528,6 @@
19528 "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
19529 "dev": true
19530 },
19953 - "are-we-there-yet": {
19954 - "version": "3.0.1",
19955 - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
19956 - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
19957 - "dev": true,
19958 - "requires": {
19959 - "delegates": "^1.0.0",
19960 - "readable-stream": "^3.6.0"
19961 - }
19962 - },
19531 "arg": {
19532 "version": "5.0.2",
19533 "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -20309,9 +19877,9 @@
19877 "dev": true
19878 },
19879 "cacache": {
20312 - "version": "18.0.0",
20313 - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz",
20314 - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==",
19880 + "version": "18.0.1",
19881 + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz",
19882 + "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==",
19883 "dev": true,
19884 "requires": {
19885 "@npmcli/fs": "^3.1.0",
@@ -20319,7 +19887,7 @@
19887 "glob": "^10.2.2",
19888 "lru-cache": "^10.0.1",
19889 "minipass": "^7.0.3",
20322 - "minipass-collect": "^1.0.2",
19890 + "minipass-collect": "^2.0.1",
19891 "minipass-flush": "^1.0.5",
19892 "minipass-pipeline": "^1.2.4",
19893 "p-map": "^4.0.0",
@@ -20351,9 +19919,9 @@
19919 }
19920 },
19921 "lru-cache": {
20354 - "version": "10.0.1",
20355 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
20356 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
19922 + "version": "10.1.0",
19923 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
19924 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
19925 "dev": true
19926 },
19927 "minimatch": {
@@ -20614,12 +20182,6 @@
20182 "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
20183 "dev": true
20184 },
20617 - "color-support": {
20618 - "version": "1.1.3",
20619 - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
20620 - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
20621 - "dev": true
20622 - },
20185 "colord": {
20186 "version": "2.9.3",
20187 "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
@@ -20682,12 +20244,6 @@
20244 }
20245 }
20246 },
20685 - "console-control-strings": {
20686 - "version": "1.1.0",
20687 - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
20688 - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
20689 - "dev": true
20690 - },
20247 "content-disposition": {
20248 "version": "0.5.4",
20249 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -20846,9 +20402,9 @@
20402 "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
20403 },
20404 "cypress": {
20849 - "version": "13.6.1",
20850 - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.1.tgz",
20851 - "integrity": "sha512-k1Wl5PQcA/4UoTffYKKaxA0FJKwg8yenYNYRzLt11CUR0Kln+h7Udne6mdU1cUIdXBDTVZWtmiUjzqGs7/pEpw==",
20405 + "version": "13.6.2",
20406 + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.2.tgz",
20407 + "integrity": "sha512-TW3bGdPU4BrfvMQYv1z3oMqj71YI4AlgJgnrycicmPZAXtvywVFZW9DAToshO65D97rCWfG/kqMFsYB6Kp91gQ==",
20408 "dev": true,
20409 "requires": {
20410 "@cypress/request": "^3.0.0",
@@ -22284,22 +21840,6 @@
21840 "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
21841 "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
21842 },
22287 - "gauge": {
22288 - "version": "4.0.4",
22289 - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
22290 - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
22291 - "dev": true,
22292 - "requires": {
22293 - "aproba": "^1.0.3 || ^2.0.0",
22294 - "color-support": "^1.1.3",
22295 - "console-control-strings": "^1.1.0",
22296 - "has-unicode": "^2.0.1",
22297 - "signal-exit": "^3.0.7",
22298 - "string-width": "^4.2.3",
22299 - "strip-ansi": "^6.0.1",
22300 - "wide-align": "^1.1.5"
22301 - }
22302 - },
21843 "gensync": {
21844 "version": "1.0.0-beta.2",
21845 "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -22557,12 +22097,6 @@
22097 "has-symbols": "^1.0.2"
22098 }
22099 },
22560 - "has-unicode": {
22561 - "version": "2.0.1",
22562 - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
22563 - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
22564 - "dev": true
22565 - },
22100 "he": {
22101 "version": "1.2.0",
22102 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -22638,14 +22172,13 @@
22172 }
22173 },
22174 "http-proxy-agent": {
22641 - "version": "5.0.0",
22642 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
22643 - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
22175 + "version": "7.0.0",
22176 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
22177 + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
22178 "dev": true,
22179 "requires": {
22646 - "@tootallnate/once": "2",
22647 - "agent-base": "6",
22648 - "debug": "4"
22180 + "agent-base": "^7.1.0",
22181 + "debug": "^4.3.4"
22182 }
22183 },
22184 "http-signature": {
@@ -22660,12 +22193,12 @@
22193 }
22194 },
22195 "https-proxy-agent": {
22663 - "version": "5.0.1",
22664 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
22665 - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
22196 + "version": "7.0.2",
22197 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
22198 + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
22199 "dev": true,
22200 "requires": {
22668 - "agent-base": "6",
22201 + "agent-base": "^7.0.2",
22202 "debug": "4"
22203 }
22204 },
@@ -22675,15 +22208,6 @@
22208 "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
22209 "dev": true
22210 },
22678 - "humanize-ms": {
22679 - "version": "1.2.1",
22680 - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
22681 - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
22682 - "dev": true,
22683 - "requires": {
22684 - "ms": "^2.0.0"
22685 - }
22686 - },
22211 "iconv-lite": {
22212 "version": "0.6.3",
22213 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -22705,9 +22229,9 @@
22229 "dev": true
22230 },
22231 "ignore-walk": {
22708 - "version": "6.0.3",
22709 - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz",
22710 - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==",
22232 + "version": "6.0.4",
22233 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz",
22234 + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==",
22235 "dev": true,
22236 "requires": {
22237 "minimatch": "^9.0.0"
@@ -23142,9 +22666,9 @@
22666 }
22667 },
22668 "jose": {
23145 - "version": "5.1.3",
23146 - "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.3.tgz",
23147 - "integrity": "sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw=="
22669 + "version": "5.2.0",
22670 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.0.tgz",
22671 + "integrity": "sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw=="
22672 },
22673 "js-beautify": {
22674 "version": "1.14.9",
@@ -23158,6 +22682,11 @@
22682 "nopt": "^6.0.0"
22683 }
22684 },
22685 + "js-md5": {
22686 + "version": "0.8.3",
22687 + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz",
22688 + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ=="
22689 + },
22690 "js-tokens": {
22691 "version": "4.0.0",
22692 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -23208,15 +22737,6 @@
22737 "xml-name-validator": "^5.0.0"
22738 },
22739 "dependencies": {
23211 - "agent-base": {
23212 - "version": "7.1.0",
23213 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
23214 - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
23215 - "dev": true,
23216 - "requires": {
23217 - "debug": "^4.3.4"
23218 - }
23219 - },
22740 "form-data": {
22741 "version": "4.0.0",
22742 "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -23228,26 +22748,6 @@
22748 "mime-types": "^2.1.12"
22749 }
22750 },
23231 - "http-proxy-agent": {
23232 - "version": "7.0.0",
23233 - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
23234 - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
23235 - "dev": true,
23236 - "requires": {
23237 - "agent-base": "^7.1.0",
23238 - "debug": "^4.3.4"
23239 - }
23240 - },
23241 - "https-proxy-agent": {
23242 - "version": "7.0.2",
23243 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
23244 - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
23245 - "dev": true,
23246 - "requires": {
23247 - "agent-base": "^7.0.2",
23248 - "debug": "4"
23249 - }
23250 - },
22751 "xml-name-validator": {
22752 "version": "5.0.0",
22753 "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
@@ -23275,9 +22775,9 @@
22775 "dev": true
22776 },
22777 "json-parse-even-better-errors": {
23278 - "version": "3.0.0",
23279 - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz",
23280 - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==",
22778 + "version": "3.0.1",
22779 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
22780 + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
22781 "dev": true
22782 },
22783 "json-schema": {
@@ -23762,99 +23262,22 @@
23262 "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
23263 },
23264 "make-fetch-happen": {
23765 - "version": "11.1.1",
23766 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
23767 - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
23265 + "version": "13.0.0",
23266 + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
23267 + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
23268 "dev": true,
23269 "requires": {
23770 - "agentkeepalive": "^4.2.1",
23771 - "cacache": "^17.0.0",
23270 + "@npmcli/agent": "^2.0.0",
23271 + "cacache": "^18.0.0",
23272 "http-cache-semantics": "^4.1.1",
23773 - "http-proxy-agent": "^5.0.0",
23774 - "https-proxy-agent": "^5.0.0",
23273 "is-lambda": "^1.0.1",
23776 - "lru-cache": "^7.7.1",
23777 - "minipass": "^5.0.0",
23274 + "minipass": "^7.0.2",
23275 "minipass-fetch": "^3.0.0",
23276 "minipass-flush": "^1.0.5",
23277 "minipass-pipeline": "^1.2.4",
23278 "negotiator": "^0.6.3",
23279 "promise-retry": "^2.0.1",
23783 - "socks-proxy-agent": "^7.0.0",
23280 "ssri": "^10.0.0"
23785 - },
23786 - "dependencies": {
23787 - "brace-expansion": {
23788 - "version": "2.0.1",
23789 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
23790 - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
23791 - "dev": true,
23792 - "requires": {
23793 - "balanced-match": "^1.0.0"
23794 - }
23795 - },
23796 - "cacache": {
23797 - "version": "17.1.4",
23798 - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
23799 - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==",
23800 - "dev": true,
23801 - "requires": {
23802 - "@npmcli/fs": "^3.1.0",
23803 - "fs-minipass": "^3.0.0",
23804 - "glob": "^10.2.2",
23805 - "lru-cache": "^7.7.1",
23806 - "minipass": "^7.0.3",
23807 - "minipass-collect": "^1.0.2",
23808 - "minipass-flush": "^1.0.5",
23809 - "minipass-pipeline": "^1.2.4",
23810 - "p-map": "^4.0.0",
23811 - "ssri": "^10.0.0",
23812 - "tar": "^6.1.11",
23813 - "unique-filename": "^3.0.0"
23814 - },
23815 - "dependencies": {
23816 - "minipass": {
23817 - "version": "7.0.4",
23818 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
23819 - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
23820 - "dev": true
23821 - }
23822 - }
23823 - },
23824 - "glob": {
23825 - "version": "10.3.10",
23826 - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
23827 - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
23828 - "dev": true,
23829 - "requires": {
23830 - "foreground-child": "^3.1.0",
23831 - "jackspeak": "^2.3.5",
23832 - "minimatch": "^9.0.1",
23833 - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
23834 - "path-scurry": "^1.10.1"
23835 - }
23836 - },
23837 - "lru-cache": {
23838 - "version": "7.18.3",
23839 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
23840 - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
23841 - "dev": true
23842 - },
23843 - "minimatch": {
23844 - "version": "9.0.3",
23845 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
23846 - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
23847 - "dev": true,
23848 - "requires": {
23849 - "brace-expansion": "^2.0.1"
23850 - }
23851 - },
23852 - "minipass": {
23853 - "version": "5.0.0",
23854 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
23855 - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
23856 - "dev": true
23857 - }
23281 }
23282 },
23283 "map-stream": {
@@ -24279,29 +23702,12 @@
23702 "dev": true
23703 },
23704 "minipass-collect": {
24282 - "version": "1.0.2",
24283 - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
24284 - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
23705 + "version": "2.0.1",
23706 + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
23707 + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
23708 "dev": true,
23709 "requires": {
24287 - "minipass": "^3.0.0"
24288 - },
24289 - "dependencies": {
24290 - "minipass": {
24291 - "version": "3.3.6",
24292 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
24293 - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
24294 - "dev": true,
24295 - "requires": {
24296 - "yallist": "^4.0.0"
24297 - }
24298 - },
24299 - "yallist": {
24300 - "version": "4.0.0",
24301 - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
24302 - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
24303 - "dev": true
24304 - }
23710 + "minipass": "^7.0.3"
23711 }
23712 },
23713 "minipass-fetch": {
@@ -24550,38 +23956,57 @@
23956 "dev": true
23957 },
23958 "node-gyp": {
24553 - "version": "9.4.0",
24554 - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz",
24555 - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==",
23959 + "version": "10.0.1",
23960 + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz",
23961 + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==",
23962 "dev": true,
23963 "requires": {
23964 "env-paths": "^2.2.0",
23965 "exponential-backoff": "^3.1.1",
24560 - "glob": "^7.1.4",
23966 + "glob": "^10.3.10",
23967 "graceful-fs": "^4.2.6",
24562 - "make-fetch-happen": "^11.0.3",
24563 - "nopt": "^6.0.0",
24564 - "npmlog": "^6.0.0",
24565 - "rimraf": "^3.0.2",
23968 + "make-fetch-happen": "^13.0.0",
23969 + "nopt": "^7.0.0",
23970 + "proc-log": "^3.0.0",
23971 "semver": "^7.3.5",
23972 "tar": "^6.1.2",
24568 - "which": "^2.0.2"
23973 + "which": "^4.0.0"
23974 },
23975 "dependencies": {
23976 + "abbrev": {
23977 + "version": "2.0.0",
23978 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
23979 + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
23980 + "dev": true
23981 + },
23982 + "brace-expansion": {
23983 + "version": "2.0.1",
23984 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
23985 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
23986 + "dev": true,
23987 + "requires": {
23988 + "balanced-match": "^1.0.0"
23989 + }
23990 + },
23991 "glob": {
24572 - "version": "7.2.3",
24573 - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
24574 - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
23992 + "version": "10.3.10",
23993 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
23994 + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
23995 "dev": true,
23996 "requires": {
24577 - "fs.realpath": "^1.0.0",
24578 - "inflight": "^1.0.4",
24579 - "inherits": "2",
24580 - "minimatch": "^3.1.1",
24581 - "once": "^1.3.0",
24582 - "path-is-absolute": "^1.0.0"
23997 + "foreground-child": "^3.1.0",
23998 + "jackspeak": "^2.3.5",
23999 + "minimatch": "^9.0.1",
24000 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
24001 + "path-scurry": "^1.10.1"
24002 }
24003 },
24004 + "isexe": {
24005 + "version": "3.1.1",
24006 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
24007 + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
24008 + "dev": true
24009 + },
24010 "lru-cache": {
24011 "version": "6.0.0",
24012 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -24591,6 +24016,24 @@
24016 "yallist": "^4.0.0"
24017 }
24018 },
24019 + "minimatch": {
24020 + "version": "9.0.3",
24021 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
24022 + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
24023 + "dev": true,
24024 + "requires": {
24025 + "brace-expansion": "^2.0.1"
24026 + }
24027 + },
24028 + "nopt": {
24029 + "version": "7.2.0",
24030 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz",
24031 + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==",
24032 + "dev": true,
24033 + "requires": {
24034 + "abbrev": "^2.0.0"
24035 + }
24036 + },
24037 "semver": {
24038 "version": "7.5.4",
24039 "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@@ -24600,6 +24043,15 @@
24043 "lru-cache": "^6.0.0"
24044 }
24045 },
24046 + "which": {
24047 + "version": "4.0.0",
24048 + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
24049 + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
24050 + "dev": true,
24051 + "requires": {
24052 + "isexe": "^3.1.1"
24053 + }
24054 + },
24055 "yallist": {
24056 "version": "4.0.0",
24057 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -24665,9 +24117,9 @@
24117 }
24118 },
24119 "npm-install-checks": {
24668 - "version": "6.2.0",
24669 - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz",
24670 - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==",
24120 + "version": "6.3.0",
24121 + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
24122 + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
24123 "dev": true,
24124 "requires": {
24125 "semver": "^7.1.1"
@@ -24727,9 +24179,9 @@
24179 }
24180 },
24181 "lru-cache": {
24730 - "version": "10.0.1",
24731 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
24732 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
24182 + "version": "10.1.0",
24183 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
24184 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
24185 "dev": true
24186 },
24187 "semver": {
@@ -24761,12 +24213,12 @@
24213 }
24214 },
24215 "npm-packlist": {
24764 - "version": "8.0.0",
24765 - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz",
24766 - "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==",
24216 + "version": "8.0.1",
24217 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.1.tgz",
24218 + "integrity": "sha512-MQpL27ZrsJQ2kiAuQPpZb5LtJwydNRnI15QWXsf3WHERu4rzjRj6Zju/My2fov7tLuu3Gle/uoIX/DDZ3u4O4Q==",
24219 "dev": true,
24220 "requires": {
24769 - "ignore-walk": "^6.0.0"
24221 + "ignore-walk": "^6.0.4"
24222 }
24223 },
24224 "npm-pick-manifest": {
@@ -24808,9 +24260,9 @@
24260 }
24261 },
24262 "npm-registry-fetch": {
24811 - "version": "16.0.0",
24812 - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.0.0.tgz",
24813 - "integrity": "sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ==",
24263 + "version": "16.1.0",
24264 + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz",
24265 + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==",
24266 "dev": true,
24267 "requires": {
24268 "make-fetch-happen": "^13.0.0",
@@ -24820,27 +24272,6 @@
24272 "minizlib": "^2.1.2",
24273 "npm-package-arg": "^11.0.0",
24274 "proc-log": "^3.0.0"
24823 - },
24824 - "dependencies": {
24825 - "make-fetch-happen": {
24826 - "version": "13.0.0",
24827 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
24828 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
24829 - "dev": true,
24830 - "requires": {
24831 - "@npmcli/agent": "^2.0.0",
24832 - "cacache": "^18.0.0",
24833 - "http-cache-semantics": "^4.1.1",
24834 - "is-lambda": "^1.0.1",
24835 - "minipass": "^7.0.2",
24836 - "minipass-fetch": "^3.0.0",
24837 - "minipass-flush": "^1.0.5",
24838 - "minipass-pipeline": "^1.2.4",
24839 - "negotiator": "^0.6.3",
24840 - "promise-retry": "^2.0.1",
24841 - "ssri": "^10.0.0"
24842 - }
24843 - }
24275 }
24276 },
24277 "npm-run-all": {
@@ -24920,18 +24351,6 @@
24351 "path-key": "^3.0.0"
24352 }
24353 },
24923 - "npmlog": {
24924 - "version": "6.0.2",
24925 - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
24926 - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
24927 - "dev": true,
24928 - "requires": {
24929 - "are-we-there-yet": "^3.0.0",
24930 - "console-control-strings": "^1.1.0",
24931 - "gauge": "^4.0.3",
24932 - "set-blocking": "^2.0.0"
24933 - }
24934 - },
24354 "nth-check": {
24355 "version": "2.1.1",
24356 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -25110,9 +24529,9 @@
24529 }
24530 },
24531 "pacote": {
25113 - "version": "17.0.4",
25114 - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz",
25115 - "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==",
24532 + "version": "17.0.5",
24533 + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.5.tgz",
24534 + "integrity": "sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA==",
24535 "dev": true,
24536 "requires": {
24537 "@npmcli/git": "^5.0.0",
@@ -25220,9 +24639,9 @@
24639 },
24640 "dependencies": {
24641 "lru-cache": {
25223 - "version": "10.0.1",
25224 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
25225 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
24642 + "version": "10.1.0",
24643 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
24644 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
24645 "dev": true
24646 }
24647 }
@@ -25908,9 +25327,9 @@
25327 }
25328 },
25329 "lru-cache": {
25911 - "version": "10.0.1",
25912 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
25913 - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
25330 + "version": "10.1.0",
25331 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
25332 + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
25333 "dev": true
25334 },
25335 "minimatch": {
@@ -26000,17 +25419,6 @@
25419 }
25420 }
25421 },
26003 - "readable-stream": {
26004 - "version": "3.6.2",
26005 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
26006 - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
26007 - "dev": true,
26008 - "requires": {
26009 - "inherits": "^2.0.3",
26010 - "string_decoder": "^1.1.1",
26011 - "util-deprecate": "^1.0.1"
26012 - }
26013 - },
25422 "readdirp": {
25423 "version": "3.6.0",
25424 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -26448,12 +25856,6 @@
25856 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
25857 "dev": true
25858 },
26451 - "set-blocking": {
26452 - "version": "2.0.0",
26453 - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
26454 - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
26455 - "dev": true
26456 - },
25859 "set-function-name": {
25860 "version": "2.0.1",
25861 "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
@@ -26619,14 +26021,14 @@
26021 }
26022 },
26023 "socks-proxy-agent": {
26622 - "version": "7.0.0",
26623 - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
26624 - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
26024 + "version": "8.0.2",
26025 + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
26026 + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
26027 "dev": true,
26028 "requires": {
26627 - "agent-base": "^6.0.2",
26628 - "debug": "^4.3.3",
26629 - "socks": "^2.6.2"
26029 + "agent-base": "^7.0.2",
26030 + "debug": "^4.3.4",
26031 + "socks": "^2.7.1"
26032 }
26033 },
26034 "sort-asc": {
@@ -26829,15 +26231,6 @@
26231 "duplexer": "~0.1.1"
26232 }
26233 },
26832 - "string_decoder": {
26833 - "version": "1.3.0",
26834 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
26835 - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
26836 - "dev": true,
26837 - "requires": {
26838 - "safe-buffer": "~5.2.0"
26839 - }
26840 - },
26234 "string-width": {
26235 "version": "4.2.3",
26236 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -27248,18 +26641,18 @@
26641 }
26642 },
26643 "taze": {
27251 - "version": "0.13.0",
27252 - "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.0.tgz",
27253 - "integrity": "sha512-o17Y6miF+44sDJ7haRHTqZefTlGOaBSdDHRwRcrt+s3WeGSPBUtPSG18XNwToIXN//eh58hyYnyDwTnpYLp4sg==",
26644 + "version": "0.13.1",
26645 + "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.1.tgz",
26646 + "integrity": "sha512-viIeTWEezE1mtQ9M9dtvIwfF7WkNRXVZP7g/NsGDFxwwzJIVJReSiZiyfsJccdJo6XUe7FaYzvrG1VD6Tnj4Jg==",
26647 "dev": true,
26648 "requires": {
26649 "@antfu/ni": "^0.21.12",
27257 - "@npmcli/config": "^8.0.2",
26650 + "@npmcli/config": "^8.0.3",
26651 "cli-progress": "^3.12.0",
26652 "deepmerge": "^4.3.1",
26653 "detect-indent": "^7.0.1",
26654 "execa": "^8.0.1",
27262 - "pacote": "^17.0.4",
26655 + "pacote": "^17.0.5",
26656 "picocolors": "^1.0.0",
26657 "prompts": "^2.4.2",
26658 "semver": "^7.5.4",
@@ -27579,27 +26972,6 @@
26972 "@tufjs/models": "2.0.0",
26973 "debug": "^4.3.4",
26974 "make-fetch-happen": "^13.0.0"
27582 - },
27583 - "dependencies": {
27584 - "make-fetch-happen": {
27585 - "version": "13.0.0",
27586 - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz",
27587 - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==",
27588 - "dev": true,
27589 - "requires": {
27590 - "@npmcli/agent": "^2.0.0",
27591 - "cacache": "^18.0.0",
27592 - "http-cache-semantics": "^4.1.1",
27593 - "is-lambda": "^1.0.1",
27594 - "minipass": "^7.0.2",
27595 - "minipass-fetch": "^3.0.0",
27596 - "minipass-flush": "^1.0.5",
27597 - "minipass-pipeline": "^1.2.4",
27598 - "negotiator": "^0.6.3",
27599 - "promise-retry": "^2.0.1",
27600 - "ssri": "^10.0.0"
27601 - }
27602 - }
26975 }
26976 },
26977 "tunnel-agent": {
@@ -28349,9 +27721,9 @@
27721 "requires": {}
27722 },
27723 "vue-template-compiler": {
28352 - "version": "2.7.15",
28353 - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz",
28354 - "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==",
27724 + "version": "2.7.16",
27725 + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
27726 + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
27727 "dev": true,
27728 "requires": {
27729 "de-indent": "^1.0.2",
@@ -28359,13 +27731,13 @@
27731 }
27732 },
27733 "vue-tsc": {
28362 - "version": "1.8.26",
28363 - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.26.tgz",
28364 - "integrity": "sha512-jMEJ4aqU/l1hdgmeExH5h1TFoN+hbho0A2ZAhHy53/947DGm7Qj/bpB85VpECOCwV00h7JYNVnvoD2ceOorB4Q==",
27734 + "version": "1.8.27",
27735 + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
27736 + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
27737 "dev": true,
27738 "requires": {
27739 "@volar/typescript": "~1.11.1",
28368 - "@vue/language-core": "1.8.26",
27740 + "@vue/language-core": "1.8.27",
27741 "semver": "^7.5.4"
27742 },
27743 "dependencies": {
@@ -28567,15 +27939,6 @@
27939 "stackback": "0.0.2"
27940 }
27941 },
28570 - "wide-align": {
28571 - "version": "1.1.5",
28572 - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
28573 - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
28574 - "dev": true,
28575 - "requires": {
28576 - "string-width": "^1.0.2 || 2 || 3 || 4"
28577 - }
28578 - },
27942 "wrap-ansi": {
27943 "version": "7.0.0",
27944 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
package.json
+18 -17
@@ -39,13 +39,13 @@
39 "@fullcalendar/list": "^6.1.10",
40 "@fullcalendar/timegrid": "^6.1.10",
41 "@fullcalendar/vue3": "^6.1.10",
42 - "@milkdown/core": "^7.3.2",
43 - "@milkdown/ctx": "^7.3.2",
44 - "@milkdown/preset-commonmark": "^7.3.2",
45 - "@milkdown/prose": "^7.3.2",
46 - "@milkdown/theme-nord": "^7.3.2",
47 - "@milkdown/transformer": "^7.3.2",
48 - "@milkdown/vue": "^7.3.2",
42 + "@milkdown/core": "^7.3.3",
43 + "@milkdown/ctx": "^7.3.3",
44 + "@milkdown/preset-commonmark": "^7.3.3",
45 + "@milkdown/prose": "^7.3.3",
46 + "@milkdown/theme-nord": "^7.3.3",
47 + "@milkdown/transformer": "^7.3.3",
48 + "@milkdown/vue": "^7.3.3",
49 "@popperjs/core": "^2.11.8",
50 "@revolist/revogrid": "^4.7.0-next.4",
51 "@revolist/revogrid-column-numeral": "^1.0.2",
@@ -61,9 +61,9 @@
61 "@tiptap/starter-kit": "^2.1.13",
62 "@tiptap/vue-3": "^2.1.13",
63 "@vueup/vue-quill": "^1.2.0",
64 - "@vueuse/components": "^10.7.0",
65 - "@vueuse/core": "^10.7.0",
66 - "apexcharts": "^3.45.0",
64 + "@vueuse/components": "^10.7.1",
65 + "@vueuse/core": "^10.7.1",
66 + "apexcharts": "^3.45.1",
67 "bytes": "^3.1.2",
68 "chart.js": "^4.4.1",
69 "colord": "^2.9.3",
@@ -72,7 +72,8 @@
72 "echarts": "^5.4.3",
73 "geojson": "^0.5.0",
74 "highlight.js": "^11.9.0",
75 - "jose": "^5.1.3",
75 + "jose": "^5.2.0",
76 + "js-md5": "^0.8.3",
77 "lodash": "^4.17.21",
78 "maplibre-gl": "^3.6.2",
79 "mitt": "^3.0.1",
@@ -113,7 +114,7 @@
114 "@types/lodash": "^4.14.202",
115 "@types/node": "^20.10.5",
116 "@types/validator": "^13.11.7",
116 - "@vitejs/plugin-vue": "^4.5.2",
117 + "@vitejs/plugin-vue": "^5.0.0",
118 "@vitejs/plugin-vue-jsx": "^3.1.0",
119 "@vue-leaflet/vue-leaflet": "^0.10.1",
120 "@vue/eslint-config-prettier": "^8.0.0",
@@ -121,7 +122,7 @@
122 "@vue/test-utils": "^2.4.3",
123 "@vue/tsconfig": "^0.5.1",
124 "autoprefixer": "^10.4.16",
124 - "cypress": "^13.6.1",
125 + "cypress": "^13.6.2",
126 "eslint": "^8.56.0",
127 "eslint-plugin-cypress": "^2.15.1",
128 "eslint-plugin-vue": "^9.19.2",
@@ -137,16 +138,16 @@
138 "start-server-and-test": "^2.0.3",
139 "tailwind-config-viewer": "^1.7.3",
140 "tailwindcss": "^3.4.0",
140 - "taze": "^0.13.0",
141 + "taze": "^0.13.1",
142 "ts-node": "^10.9.2",
143 "typescript": "~5.3.3",
144 "unplugin-vue-components": "^0.26.0",
145 "vite": "^5.0.10",
146 "vite-svg-loader": "^5.1.0",
147 "vitest": "^1.1.0",
147 - "vue-tsc": "^1.8.26"
148 + "vue-tsc": "^1.8.27"
149 },
150 "engines": {
150 - "node": ">=16.0.0 <20.5.0"
151 + "node": ">=16.0.0 <=20.7.0"
152 }
152 -}
153 +}
\ No newline at end of file
src/api/customers.ts
+48 -1
@@ -1,6 +1,12 @@
1 import { type FlaskBaseResponse } from "@/types/flask.d"
2 import { HttpClient } from "./httpClient"
3 -import type { Customer, CustomerAgentHealth, CustomerMeta } from "@/types/customers.d"
3 +import type {
4 + Customer,
5 + CustomerAgentHealth,
6 + CustomerDecomissionedData,
7 + CustomerMeta,
8 + CustomerProvision
9 +} from "@/types/customers.d"
10 import type { Agent } from "@/types/agents.d"
11
12 export interface CustomerAgentsHealthcheckQuery {
@@ -27,15 +33,19 @@ export default {
33 deleteCustomer(code: string) {
34 return HttpClient.delete<FlaskBaseResponse & { customer: Customer }>(`/customers/${code}`)
35 },
36 + /** @deprecated */
37 getCustomerMeta(code: string) {
38 return HttpClient.get<FlaskBaseResponse & { customer_meta: CustomerMeta }>(`/customers/${code}/meta`)
39 },
40 + /** @deprecated */
41 updateCustomerMeta(meta: CustomerMeta, code: string) {
42 return HttpClient.put<FlaskBaseResponse & { customer_meta: CustomerMeta }>(`/customers/${code}/meta`, meta)
43 },
44 + /** @deprecated */
45 createCustomerMeta(meta: CustomerMeta, code: string) {
46 return HttpClient.post<FlaskBaseResponse & { customer_meta: CustomerMeta }>(`/customers/${code}/meta`, meta)
47 },
48 + /** @deprecated */
49 deleteCustomerMeta(code: string) {
50 return HttpClient.delete<FlaskBaseResponse & { customer_meta: CustomerMeta }>(`/customers/${code}/meta`)
51 },
@@ -74,5 +84,42 @@ export default {
84 days: query?.days || 0
85 }
86 })
87 + },
88 + newCustomerProvision(provision: CustomerProvision, code: string) {
89 + return HttpClient.post<FlaskBaseResponse & { customer_meta: CustomerMeta; wazuh_worker_provisioned: boolean }>(
90 + `/customer_provisioning/provision`,
91 + provision,
92 + {
93 + params: {
94 + customer_code: code
95 + }
96 + }
97 + )
98 + },
99 + getCustomerProvision(code: string) {
100 + return HttpClient.get<FlaskBaseResponse & { customer_meta: CustomerMeta }>(
101 + `/customer_provisioning/provision/${code}`
102 + )
103 + },
104 + decommissionCustomer(code: string) {
105 + return HttpClient.post<FlaskBaseResponse & { decomissioned_data: CustomerDecomissionedData }>(
106 + `/customer_provisioning/decommission`,
107 + {},
108 + {
109 + params: {
110 + customer_code: code
111 + }
112 + }
113 + )
114 + },
115 + getProvisioningDashboards() {
116 + return HttpClient.get<FlaskBaseResponse & { available_dashboards: string[] }>(
117 + `/customer_provisioning/provision/dashboards`
118 + )
119 + },
120 + getProvisioningSubscriptions() {
121 + return HttpClient.get<FlaskBaseResponse & { available_subscriptions: string[] }>(
122 + `/customer_provisioning/provision/subscriptions`
123 + )
124 }
125 }
src/api/httpClient.ts
+2 -2
@@ -1,6 +1,6 @@
1 import { useAuthStore } from "@/stores/auth"
2 import { isDebounceTimeOver, isJwtExpiring } from "@/utils/auth"
3 -import axios from "axios"
3 +import axios, { type AxiosRequestHeaders } from "axios"
4 // import { useGlobalActions } from "@/composables/useGlobalActions"
5
6 const BASE_URL = import.meta.env.VITE_API_URL
@@ -16,7 +16,7 @@ HttpClient.interceptors.request.use(
16 config => {
17 const store = useAuthStore()
18
19 - if (!config.headers) config.headers = {}
19 + if (!config.headers) config.headers = {} as AxiosRequestHeaders
20 config.headers.Authorization = `Bearer ${store.userToken}`
21
22 if (isJwtExpiring(store.userToken, 60 * 60) && !__TOKEN_REFRESHING && isDebounceTimeOver(__TOKEN_LAST_CHECK)) {
src/components/customers/CustomerItem.vue
+45 -23
@@ -14,11 +14,10 @@
14 </div>
15 <div class="main-box flex items-center gap-3">
16 <n-avatar
17 - :src="customerInfo?.logo_file"
18 - fallback-src="/images/img-not-found.svg"
17 + :src="customerInfo?.logo_file || fallbackAvatar"
18 + :fallback-src="fallbackAvatar"
19 round
20 :size="40"
21 - lazy
21 />
22
23 <div class="content flex flex-col gap-1 grow">
@@ -37,51 +36,54 @@
36 <template #label>Type</template>
37 <template #value>{{ customerInfo?.customer_type || "-" }}</template>
38 </Badge>
40 - <n-popover trigger="hover">
39 +
40 + <n-popover trigger="hover" :disabled="addressLabel === '-'">
41 <template #trigger>
42 - <Badge type="splitted" class="cursor-help">
42 + <Badge type="splitted" :class="{ 'cursor-help': addressLabel !== '-' }">
43 <template #iconLeft>
44 <Icon :name="LocationIcon" :size="13"></Icon>
45 </template>
46 <template #value>
47 - {{ [customerInfo?.city, customerInfo?.state].join(", ") || "-" }}
47 + {{ addressLabel }}
48 </template>
49 </Badge>
50 </template>
51
52 <div class="flex flex-col gap-1">
53 - <div class="box">
53 + <div class="box" v-if="customerInfo?.address_line1">
54 address_line1:
55 - <code>{{ customerInfo?.address_line1 }}</code>
55 + <code>{{ customerInfo.address_line1 }}</code>
56 </div>
57 - <div class="box">
57 + <div class="box" v-if="customerInfo?.address_line2">
58 address_line2:
59 - <code>{{ customerInfo?.address_line2 }}</code>
59 + <code>{{ customerInfo.address_line2 }}</code>
60 </div>
61 - <div class="box">
61 + <div class="box" v-if="customerInfo?.postal_code">
62 postal_code:
63 - <code>{{ customerInfo?.postal_code }}</code>
63 + <code>{{ customerInfo.postal_code }}</code>
64 </div>
65 - <div class="box">
65 + <div class="box" v-if="customerInfo?.city">
66 city:
67 - <code>{{ customerInfo?.city }}</code>
67 + <code>{{ customerInfo.city }}</code>
68 </div>
69 - <div class="box">
69 + <div class="box" v-if="customerInfo?.state">
70 state:
71 - <code>{{ customerInfo?.state }}</code>
71 + <code>{{ customerInfo.state }}</code>
72 </div>
73 - <div class="box">
73 + <div class="box" v-if="customerInfo?.country">
74 country:
75 - <code>{{ customerInfo?.country }}</code>
75 + <code>{{ customerInfo.country }}</code>
76 </div>
77 </div>
78 </n-popover>
79 +
80 <Badge type="splitted">
81 <template #iconLeft>
82 <Icon :name="PhoneIcon" :size="13"></Icon>
83 </template>
84 <template #value>{{ customerInfo?.phone || "-" }}</template>
85 </Badge>
86 +
87 <Badge type="splitted" v-if="customerInfo?.parent_customer_code">
88 <template #iconLeft>
89 <Icon :name="ParentIcon" :size="13"></Icon>
@@ -104,7 +106,7 @@
106 <Transition :name="`slide-tabs-${selectedTabsGroup === 'customer' ? 'left' : 'right'}`">
107 <n-tabs type="line" animated :tabs-padding="24" v-if="selectedTabsGroup === 'customer'">
108 <n-tab-pane name="Info" tab="Info" display-directive="show:lazy">
107 - <CustomerInfoComponent
109 + <CustomerInfo
110 :customer="customerInfo"
111 @delete="deletedItem()"
112 @submitted="customerInfo = $event"
@@ -112,10 +114,11 @@
114 v-if="customerInfo"
115 />
116 </n-tab-pane>
115 - <n-tab-pane name="Meta" tab="Meta" display-directive="show:lazy">
116 - <CustomerMetaComponent
117 + <n-tab-pane name="Provision" tab="Provision" display-directive="show:lazy">
118 + <CustomerProvision
119 :customerMeta="customerMeta"
120 :customerCode="customer.customer_code"
121 + :customerName="customer.customer_name"
122 @delete="customerMeta = null"
123 @submitted="customerMeta = $event"
124 />
@@ -166,13 +169,15 @@
169 import Icon from "@/components/common/Icon.vue"
170 import Badge from "@/components/common/Badge.vue"
171 import { computed, onBeforeMount, ref, toRefs, watch } from "vue"
169 -import CustomerInfoComponent from "./CustomerInfo.vue"
170 -import CustomerMetaComponent from "./CustomerMeta.vue"
172 +import CustomerInfo from "./CustomerInfo.vue"
173 +import CustomerProvision from "./CustomerProvision.vue"
174 import CustomerAgents from "./CustomerAgents.vue"
175 import CustomerHealthcheckList from "./CustomerHealthcheckList.vue"
176 import Api from "@/api"
177 import { NAvatar, useMessage, NPopover, NModal, NTabs, NTabPane, NSpin, NScrollbar } from "naive-ui"
178 import type { Customer, CustomerMeta } from "@/types/customers.d"
179 +import { hashMD5 } from "@/utils"
180 +import _toSafeInteger from "lodash/toSafeInteger"
181
182 const emit = defineEmits<{
183 (e: "delete"): void
@@ -201,6 +206,23 @@ const customerInfo = ref<Customer | null>(null)
206 const customerMeta = ref<CustomerMeta | null>(null)
207
208 const loading = computed(() => loadingFull.value || loadingDelete.value)
209 +const fallbackAvatar = computed(() => {
210 + let text = customer.value.customer_name.slice(0, 2).toUpperCase()
211 +
212 + if (customer.value.customer_name.indexOf(" ") !== -1) {
213 + const chunks = customer.value.customer_name.split(" ")
214 + text = (chunks[0][0] + chunks[1][0]).toUpperCase()
215 + }
216 +
217 + const hash = hashMD5(customer.value.customer_code)
218 + const uniq = hash.split("").find(o => _toSafeInteger(o).toString() === o)
219 + const seed = hash.slice(0, _toSafeInteger(uniq))
220 +
221 + return `https://avatar.vercel.sh/${seed}.svg?text=${text}`
222 +})
223 +const addressLabel = computed(
224 + () => [customerInfo.value?.city, customerInfo.value?.state].filter(o => !!o).join(", ") || "-"
225 +)
226
227 function getFull() {
228 loadingFull.value = true
src/components/customers/CustomerMetaForm.vue
+71 -6
@@ -8,6 +8,7 @@
8 <n-input
9 v-model:value.trim="form[key]"
10 :placeholder="fieldsMeta[key].placeholder"
11 + :readonly="!!fieldsMeta[key].readonly"
12 clearable
13 />
14 </n-form-item>
@@ -46,6 +47,12 @@ import {
47 import type { CustomerMeta } from "@/types/customers.d"
48 import _trim from "lodash/trim"
49 import _get from "lodash/get"
50 +import _toSafeInteger from "lodash/toSafeInteger"
51 +
52 +interface CustomerMetaExt extends Omit<CustomerMeta, "id" | "customer_meta_iris_customer_id"> {
53 + id: string
54 + customer_meta_iris_customer_id: string
55 +}
56
57 const emit = defineEmits<{
58 (e: "update:loading", value: boolean): void
@@ -61,13 +68,15 @@ const emit = defineEmits<{
68 const props = defineProps<{
69 customerMeta?: CustomerMeta
70 customerCode: string
71 + customerName: string
72 + metaId: number
73 resetOnSubmit?: boolean
74 }>()
66 -const { customerMeta, customerCode, resetOnSubmit } = toRefs(props)
75 +const { customerMeta, customerCode, customerName, metaId, resetOnSubmit } = toRefs(props)
76
77 const loading = ref(false)
78 const message = useMessage()
70 -const form = ref<CustomerMeta>(getClearForm())
79 +const form = ref<CustomerMetaExt>(getClearForm())
80 const formRef = ref<FormInst | null>(null)
81
82 const rules: FormRules = {
@@ -110,10 +119,35 @@ const rules: FormRules = {
119 required: true,
120 message: "Please input Wazuh auth password",
121 trigger: ["input", "blur"]
122 + },
123 + customer_meta_iris_customer_id: {
124 + required: true,
125 + message: "Please input Wazuh auth password",
126 + trigger: ["input", "blur"]
127 + },
128 + customer_meta_office365_organization_id: {
129 + required: true,
130 + message: "Please input Wazuh auth password",
131 + trigger: ["input", "blur"]
132 }
133 }
134
116 -const fieldsMeta = {
135 +const fieldsMeta: { [key: string]: { label: string; placeholder: string; readonly?: boolean } } = {
136 + id: {
137 + label: "Meta ID",
138 + placeholder: "Meta ID...",
139 + readonly: true
140 + },
141 + customer_code: {
142 + label: "Customer Code",
143 + placeholder: "Customer Code...",
144 + readonly: true
145 + },
146 + customer_name: {
147 + label: "Customer Name",
148 + placeholder: "Customer Name...",
149 + readonly: true
150 + },
151 customer_meta_graylog_index: {
152 label: "Graylog Index",
153 placeholder: "Graylog Index..."
@@ -145,6 +179,14 @@ const fieldsMeta = {
179 customer_meta_wazuh_auth_password: {
180 label: "Wazuh auth password",
181 placeholder: "Wazuh auth password..."
182 + },
183 + customer_meta_iris_customer_id: {
184 + label: "Iris Customer ID",
185 + placeholder: "Iris Customer ID..."
186 + },
187 + customer_meta_office365_organization_id: {
188 + label: "Office365 Organization ID",
189 + placeholder: "Office365 Organization ID..."
190 }
191 }
192
@@ -175,8 +217,11 @@ function validate() {
217 })
218 }
219
178 -function getClearForm(customerMeta?: Partial<CustomerMeta>) {
220 +function getClearForm(customerMeta?: Partial<CustomerMeta>): CustomerMetaExt {
221 return {
222 + id: metaId.value?.toString() || "",
223 + customer_code: customerCode.value || "",
224 + customer_name: customerName.value || "",
225 customer_meta_graylog_index: customerMeta?.customer_meta_graylog_index || "",
226 customer_meta_graylog_stream: customerMeta?.customer_meta_graylog_stream || "",
227 customer_meta_grafana_org_id: customerMeta?.customer_meta_grafana_org_id || "",
@@ -184,7 +229,27 @@ function getClearForm(customerMeta?: Partial<CustomerMeta>) {
229 customer_meta_wazuh_group: customerMeta?.customer_meta_wazuh_group || "",
230 customer_meta_wazuh_registration_port: customerMeta?.customer_meta_wazuh_registration_port || "",
231 customer_meta_wazuh_log_ingestion_port: customerMeta?.customer_meta_wazuh_log_ingestion_port || "",
187 - customer_meta_wazuh_auth_password: customerMeta?.customer_meta_wazuh_auth_password || ""
232 + customer_meta_wazuh_auth_password: customerMeta?.customer_meta_wazuh_auth_password || "",
233 + customer_meta_iris_customer_id: customerMeta?.customer_meta_iris_customer_id?.toString() || "",
234 + customer_meta_office365_organization_id: customerMeta?.customer_meta_office365_organization_id || ""
235 + }
236 +}
237 +
238 +function getPayload(meta: CustomerMetaExt): CustomerMeta {
239 + return {
240 + id: _toSafeInteger(meta.id),
241 + customer_code: meta.customer_code,
242 + customer_name: meta.customer_name,
243 + customer_meta_graylog_index: meta.customer_meta_graylog_index,
244 + customer_meta_graylog_stream: meta.customer_meta_graylog_stream,
245 + customer_meta_grafana_org_id: meta.customer_meta_grafana_org_id,
246 + customer_meta_wazuh_group: meta.customer_meta_wazuh_group,
247 + customer_meta_index_retention: meta.customer_meta_index_retention,
248 + customer_meta_wazuh_registration_port: meta.customer_meta_wazuh_registration_port,
249 + customer_meta_wazuh_log_ingestion_port: meta.customer_meta_wazuh_log_ingestion_port,
250 + customer_meta_wazuh_auth_password: meta.customer_meta_wazuh_auth_password,
251 + customer_meta_iris_customer_id: _toSafeInteger(meta.customer_meta_iris_customer_id),
252 + customer_meta_office365_organization_id: meta.customer_meta_office365_organization_id
253 }
254 }
255
@@ -197,7 +262,7 @@ function submit() {
262
263 const method = customerMeta.value?.customer_meta_graylog_index ? "updateCustomerMeta" : "createCustomerMeta"
264
200 - Api.customers[method](form.value, customerCode.value)
265 + Api.customers[method](getPayload(form.value), customerCode.value)
266 .then(res => {
267 if (res.data.success) {
268 emit("submitted", res.data.customer_meta)
src/components/customers/CustomerProvision.vue renamed
+19 -23
@@ -1,29 +1,23 @@
1 <template>
2 - <div class="customer-meta">
3 - <div class="p-7 pt-4" v-if="editing">
4 - <CustomerMetaForm
2 + <div class="customer-provision">
3 + <div v-if="editing">
4 + <CustomerProvisionWizard
5 @submitted="submitted"
6 - :customerMeta="customerMeta || undefined"
6 + :customerName="customerNameSanitized"
7 :customerCode="customerCode"
8 >
9 <template #additionalActions>
10 <n-button @click="editing = false">Close</n-button>
11 </template>
12 - </CustomerMetaForm>
12 + </CustomerProvisionWizard>
13 </div>
14 <template v-else>
15 - <div class="flex items-center justify-between gap-4 px-7 pt-2" v-if="customerMeta">
16 - <n-button size="small" @click="editing = true" :disabled="loadingDelete">
17 - <template #icon>
18 - <Icon :name="EditIcon" :size="14"></Icon>
19 - </template>
20 - Edit
21 - </n-button>
15 + <div class="flex items-center justify-end gap-4 px-7 pt-2" v-if="customerMeta">
16 <n-button size="small" type="error" ghost @click="handleDelete" :loading="loadingDelete">
17 <template #icon>
18 <Icon :name="DeleteIcon" :size="15"></Icon>
19 </template>
26 - Clear Meta
20 + Decommission
21 </n-button>
22 </div>
23 <div class="flex items-center justify-between gap-4 px-7 pt-2" v-else>
@@ -31,7 +25,7 @@
25 <template #icon>
26 <Icon :name="AddIcon" :size="14"></Icon>
27 </template>
34 - Add Meta
28 + Create Provision
29 </n-button>
30 </div>
31
@@ -47,9 +41,9 @@
41
42 <script setup lang="ts">
43 import Icon from "@/components/common/Icon.vue"
50 -import { h, ref, toRefs } from "vue"
44 +import { computed, h, ref, toRefs } from "vue"
45 import KVCard from "@/components/common/KVCard.vue"
52 -import CustomerMetaForm from "./CustomerMetaForm.vue"
46 +import CustomerProvisionWizard from "./CustomerProvisionWizard.vue"
47 import Api from "@/api"
48 import { useMessage, NButton, useDialog } from "naive-ui"
49 import type { CustomerMeta } from "@/types/customers.d"
@@ -61,11 +55,11 @@ const emit = defineEmits<{
55
56 const props = defineProps<{
57 customerMeta?: CustomerMeta | null
58 + customerName?: string | null
59 customerCode: string
60 }>()
66 -const { customerMeta, customerCode } = toRefs(props)
61 +const { customerMeta, customerCode, customerName } = toRefs(props)
62
68 -const EditIcon = "uil:edit-alt"
63 const DeleteIcon = "ph:trash"
64 const AddIcon = "carbon:add-alt"
65
@@ -74,16 +68,18 @@ const editing = ref(false)
68 const dialog = useDialog()
69 const message = useMessage()
70
71 +const customerNameSanitized = computed<string>(() => customerName.value || customerMeta.value?.customer_name || "")
72 +
73 function submitted(newData: CustomerMeta) {
74 emit("submitted", newData)
75 editing.value = false
76 }
77
82 -function deleteCustomer() {
78 +function decommissionCustomer() {
79 loadingDelete.value = true
80
81 Api.customers
86 - .deleteCustomerMeta(customerCode.value)
82 + .decommissionCustomer(customerCode.value)
83 .then(res => {
84 if (res.data.success) {
85 emit("delete")
@@ -104,15 +100,15 @@ function handleDelete() {
100 title: "Confirm",
101 content: () =>
102 h("div", {
107 - innerHTML: `Are you sure you want to delete Meta tags for the Customer: <strong>${customerCode.value}</strong> ?`
103 + innerHTML: `Are you sure you want to dismiss Customer: <strong>${customerCode.value}</strong> ?`
104 }),
105 positiveText: "Yes I'm sure",
106 negativeText: "Cancel",
107 onPositiveClick: () => {
112 - deleteCustomer()
108 + decommissionCustomer()
109 },
110 onNegativeClick: () => {
115 - message.info("Delete canceled")
111 + message.info("Decommission canceled")
112 }
113 })
114 }
src/components/customers/CustomerProvisionWizard.vue new
+579
@@ -0,0 +1,579 @@
1 +<template>
2 + <n-spin :show="loading" class="customer-provision-wizard">
3 + <div class="wrapper flex flex-col">
4 + <div class="grow">
5 + <n-scrollbar x-scrollable trigger="none">
6 + <div class="p-7 pt-4">
7 + <n-steps :current="current" size="small" :status="currentStatus">
8 + <n-step title="Provisioning" />
9 + <n-step title="Graylog" />
10 + <n-step title="Subscription" />
11 + <n-step title="Wazuh Worker">
12 + <template #icon>
13 + <Icon :name="SkipIcon" v-if="!isWazuhStepEnabled"></Icon>
14 + </template>
15 + </n-step>
16 + </n-steps>
17 + </div>
18 + </n-scrollbar>
19 +
20 + <n-form :label-width="80" :model="form" :rules="rules" ref="formRef" class="form-container mt-4">
21 + <Transition :name="`slide-form-${slideFormDirection}`">
22 + <div v-if="current === 1" class="px-7 flex flex-col gap-3">
23 + <div class="flex flex-wrap gap-3">
24 + <n-form-item label="Customer Code" path="customer_code" class="grow">
25 + <n-input
26 + v-model:value.trim="form.customer_code"
27 + placeholder="Input Customer Code..."
28 + readonly
29 + disabled
30 + />
31 + </n-form-item>
32 + <n-form-item label="Customer Name" path="customer_name" class="grow">
33 + <n-input
34 + v-model:value.trim="form.customer_name"
35 + placeholder="Input Customer Name..."
36 + readonly
37 + disabled
38 + />
39 + </n-form-item>
40 + </div>
41 + <n-form-item
42 + label="Customer Grafana.org Name"
43 + path="customer_grafana_org_name"
44 + class="grow"
45 + >
46 + <n-input
47 + v-model:value.trim="form.customer_grafana_org_name"
48 + placeholder="Customer Grafana.org Name..."
49 + clearable
50 + />
51 + </n-form-item>
52 + </div>
53 +
54 + <div v-else-if="current === 2" class="px-7 flex flex-col gap-3">
55 + <div class="flex flex-col sm:flex-row gap-3">
56 + <n-form-item
57 + label="Customer Index name"
58 + path="customer_index_name"
59 + class="grow basis-1/2"
60 + >
61 + <n-input
62 + v-model:value.trim="form.customer_index_name"
63 + placeholder="Customer Index name..."
64 + clearable
65 + class="grow"
66 + />
67 + </n-form-item>
68 +
69 + <n-form-item label="Index replicas" path="index_replicas" class="grow basis-1/2">
70 + <n-input-number v-model:value="form.index_replicas" min="0" class="grow" />
71 + </n-form-item>
72 + </div>
73 + <div class="flex flex-wrap gap-3">
74 + <n-form-item label="Index shards" path="index_shards" class="grow">
75 + <n-input-number v-model:value="form.index_shards" min="0" class="grow" />
76 + </n-form-item>
77 + <n-form-item label="Hot Data Retention" path="hot_data_retention" class="grow">
78 + <n-input-number v-model:value="form.hot_data_retention" min="0" class="grow" />
79 + </n-form-item>
80 + </div>
81 + </div>
82 +
83 + <div v-else-if="current === 3" class="px-7 flex flex-col gap-3">
84 + <n-form-item label="Subscriptions" path="customer_subscription" class="grow">
85 + <n-select
86 + v-model:value="form.customer_subscription"
87 + :options="subscriptionOptions"
88 + :loading="loadingSubscriptions"
89 + :placeholder="
90 + loadingSubscriptions ? 'Loading Subscriptions...' : 'Select Subscriptions'
91 + "
92 + multiple
93 + clearable
94 + to="body"
95 + class="grow"
96 + />
97 + </n-form-item>
98 + <n-form-item
99 + path="dashboards_to_include.dashboards"
100 + class="grow"
101 + label-style="flex-direction: column; align-items: stretch;"
102 + :show-require-mark="false"
103 + >
104 + <template #label>
105 + <div class="flex items-center justify-between gap-4 w-full">
106 + <div>
107 + Dashboards
108 + <span class="n-form-item-label__asterisk">*</span>
109 + </div>
110 + <div>
111 + <n-button
112 + size="tiny"
113 + v-if="dashboardOptions.length"
114 + @click="toggleDashboards()"
115 + >
116 + {{ allDashboardsSelected ? "Deselect All" : "Select All" }}
117 + </n-button>
118 + </div>
119 + </div>
120 + </template>
121 + <n-select
122 + v-model:value="form.dashboards_to_include.dashboards"
123 + :options="dashboardOptions"
124 + :loading="loadingDashboards"
125 + :placeholder="loadingDashboards ? 'Loading Dashboards...' : 'Select Dashboards'"
126 + multiple
127 + clearable
128 + to="body"
129 + class="grow"
130 + />
131 + </n-form-item>
132 + </div>
133 +
134 + <div v-else-if="current === 4" class="px-7 flex flex-wrap gap-3">
135 + <n-form-item label="Auth Password" path="wazuh_auth_password" class="grow">
136 + <n-input
137 + v-model:value="form.wazuh_auth_password"
138 + placeholder="Auth Password..."
139 + clearable
140 + />
141 + </n-form-item>
142 + <n-form-item label="Registration Port" path="wazuh_registration_port" class="grow">
143 + <n-input
144 + v-model:value="form.wazuh_registration_port"
145 + placeholder="Registration Port..."
146 + clearable
147 + @blur="validate()"
148 + />
149 + </n-form-item>
150 + <n-form-item label="Logs Port" path="wazuh_logs_port" class="grow">
151 + <n-input
152 + v-model:value="form.wazuh_logs_port"
153 + placeholder="Logs Port..."
154 + clearable
155 + @blur="validate()"
156 + />
157 + </n-form-item>
158 + <n-form-item label="Api Port" path="wazuh_api_port" class="grow">
159 + <n-input
160 + v-model:value="form.wazuh_api_port"
161 + placeholder="Api Port..."
162 + clearable
163 + @blur="validate()"
164 + />
165 + </n-form-item>
166 + <n-form-item label="Cluster Name" path="wazuh_cluster_name" class="grow">
167 + <n-input
168 + v-model:value="form.wazuh_cluster_name"
169 + placeholder="Cluster Name..."
170 + clearable
171 + />
172 + </n-form-item>
173 + <n-form-item label="Cluster Key" path="wazuh_cluster_key" class="grow">
174 + <n-input
175 + v-model:value="form.wazuh_cluster_key"
176 + placeholder="Cluster Key..."
177 + clearable
178 + />
179 + </n-form-item>
180 + <n-form-item label="Master IP" path="wazuh_master_ip" class="grow">
181 + <n-input v-model:value="form.wazuh_master_ip" placeholder="Master IP..." clearable />
182 + </n-form-item>
183 + <n-form-item label="Grafana Url" path="grafana_url" class="grow">
184 + <n-input v-model:value="form.grafana_url" placeholder="Grafana Url..." clearable />
185 + </n-form-item>
186 + <div>* Registration Port, Logs Port, and Api Port must all be unique.</div>
187 + </div>
188 + </Transition>
189 + </n-form>
190 + </div>
191 +
192 + <div class="flex justify-between gap-4 p-7 pt-4">
193 + <div class="flex gap-4">
194 + <slot name="additionalActions"></slot>
195 + </div>
196 + <div class="flex gap-4">
197 + <n-button @click="prev()" v-if="isPrevStepEnabled">
198 + <template #icon>
199 + <Icon :name="ArrowLeftIcon"></Icon>
200 + </template>
201 + Prev
202 + </n-button>
203 + <n-button @click="next()" v-if="isNextStepEnabled" icon-placement="right">
204 + <template #icon>
205 + <Icon :name="ArrowRightIcon"></Icon>
206 + </template>
207 + Next
208 + </n-button>
209 + <n-button type="primary" @click="validate(submit)" :loading="loading" v-if="isSubmitEnabled">
210 + Submit
211 + </n-button>
212 + </div>
213 + </div>
214 + </div>
215 + </n-spin>
216 +</template>
217 +
218 +<script setup lang="ts">
219 +import { computed, ref, toRefs } from "vue"
220 +import {
221 + NSteps,
222 + NStep,
223 + useMessage,
224 + NScrollbar,
225 + NButton,
226 + NForm,
227 + NFormItem,
228 + NInput,
229 + NSelect,
230 + NInputNumber,
231 + NSpin,
232 + type StepsProps,
233 + type FormRules,
234 + type FormInst,
235 + type FormItemRule,
236 + type FormValidationError
237 +} from "naive-ui"
238 +import type { CustomerMeta, CustomerProvision } from "@/types/customers.d"
239 +import Icon from "@/components/common/Icon.vue"
240 +import Api from "@/api"
241 +import isURL from "validator/es/lib/isURL"
242 +import isPort from "validator/es/lib/isPort"
243 +import isIP from "validator/es/lib/isIP"
244 +import { onBeforeMount } from "vue"
245 +
246 +const emit = defineEmits<{
247 + (e: "update:loading", value: boolean): void
248 + (e: "submitted", value: CustomerMeta): void
249 +}>()
250 +
251 +const props = defineProps<{
252 + customerCode: string
253 + customerName: string
254 + mode?: "new" | "update"
255 +}>()
256 +const { customerCode, customerName, mode } = toRefs(props)
257 +
258 +const SkipIcon = "carbon:subtract"
259 +const ArrowRightIcon = "carbon:arrow-right"
260 +const ArrowLeftIcon = "carbon:arrow-left"
261 +
262 +const loading = ref(false)
263 +const loadingSubscriptions = ref(false)
264 +const loadingDashboards = ref(false)
265 +const message = useMessage()
266 +const current = ref<number>(1)
267 +const currentStatus = ref<StepsProps["status"]>("process")
268 +const form = ref<CustomerProvision>(getClearForm())
269 +const formRef = ref<FormInst | null>(null)
270 +
271 +const subscriptionOptions = ref<{ label: string; value: string }[]>([])
272 +const dashboardOptions = ref<{ label: string; value: string }[]>([])
273 +
274 +const allDashboardsSelected = computed(
275 + () => form.value.dashboards_to_include.dashboards.length === dashboardOptions.value.length
276 +)
277 +
278 +const isWazuhStepEnabled = computed(() => form.value.customer_subscription.map(o => o.toLowerCase()).includes("wazuh"))
279 +const isNextStepEnabled = computed(() => current.value < 3 || (current.value === 3 && isWazuhStepEnabled.value))
280 +const isPrevStepEnabled = computed(() => current.value > 1)
281 +const isSubmitEnabled = computed(
282 + () => (current.value === 3 && !isWazuhStepEnabled.value) || (current.value === 4 && isWazuhStepEnabled.value)
283 +)
284 +const slideFormDirection = ref<"right" | "left">("right")
285 +
286 +const rules: FormRules = {
287 + customer_name: {
288 + required: true,
289 + message: "Please input Customer Name",
290 + trigger: ["input", "blur"]
291 + },
292 + customer_code: {
293 + required: true,
294 + message: "Please input Customer Code",
295 + trigger: ["input", "blur"]
296 + },
297 + customer_grafana_org_name: {
298 + required: true,
299 + message: "Please input Customer Grafana.org Name",
300 + trigger: ["input", "blur"]
301 + },
302 + customer_index_name: {
303 + required: true,
304 + message: "Please input Customer Index Name",
305 + trigger: ["input", "blur"]
306 + },
307 + customer_subscription: {
308 + required: true,
309 + validator: validateAtLeastOne,
310 + trigger: ["blur"]
311 + },
312 + dashboards_to_include: {
313 + dashboards: {
314 + required: true,
315 + validator: validateAtLeastOne,
316 + trigger: ["blur"]
317 + }
318 + },
319 + wazuh_auth_password: {
320 + required: true,
321 + message: "Please input Auth password",
322 + trigger: ["input", "blur"]
323 + },
324 + wazuh_registration_port: {
325 + required: true,
326 + validator: validatePort,
327 + trigger: ["blur"]
328 + },
329 + wazuh_logs_port: {
330 + required: true,
331 + validator: validatePort,
332 + trigger: ["blur"]
333 + },
334 + wazuh_api_port: {
335 + required: true,
336 + validator: validatePort,
337 + trigger: ["blur"]
338 + },
339 + wazuh_cluster_name: {
340 + required: true,
341 + message: "Please input Cluster name",
342 + trigger: ["input", "blur"]
343 + },
344 + wazuh_cluster_key: {
345 + required: true,
346 + message: "Please input Cluster key",
347 + trigger: ["input", "blur"]
348 + },
349 + wazuh_master_ip: {
350 + required: true,
351 + validator: validateIp,
352 + trigger: ["blur"]
353 + },
354 + grafana_url: {
355 + required: true,
356 + validator: validateUrl,
357 + trigger: ["blur"]
358 + }
359 +}
360 +
361 +function validateUrl(rule: FormItemRule, value: string) {
362 + if (!value || !isURL(value)) {
363 + return new Error("Please input a valid URL")
364 + }
365 +
366 + return true
367 +}
368 +
369 +function validatePort(rule: FormItemRule, value: string) {
370 + if (!value || !isPort(value)) {
371 + return new Error("Please input a valid Port number")
372 + }
373 +
374 + const array: string[] = [form.value.wazuh_registration_port, form.value.wazuh_logs_port, form.value.wazuh_api_port]
375 + const filled: string[] = array.filter(value => !!value)
376 + const uniques: string[] = array.filter((value, index, self) => self.indexOf(value) === index)
377 +
378 + if (filled.length === array.length && uniques.length !== array.length) {
379 + return new Error("Wazuh Ports must all be unique")
380 + }
381 +
382 + return true
383 +}
384 +
385 +function validateIp(rule: FormItemRule, value: string) {
386 + if (!value || !isIP(value)) {
387 + return new Error("Please input a valid IP Address")
388 + }
389 +
390 + return true
391 +}
392 +
393 +function validateAtLeastOne(rule: FormItemRule, value: string[]) {
394 + if (!value || !value.length) {
395 + return new Error("Please select at least one option")
396 + }
397 +
398 + return true
399 +}
400 +
401 +function getClearForm(): CustomerProvision {
402 + return {
403 + // step1
404 + customer_name: customerName.value,
405 + customer_code: customerCode.value,
406 + customer_grafana_org_name: "",
407 +
408 + // step 2
409 + customer_index_name: "",
410 + hot_data_retention: 0,
411 + index_replicas: 0,
412 + index_shards: 1,
413 +
414 + // step 3
415 + customer_subscription: ["Wazuh"],
416 + dashboards_to_include: {
417 + dashboards: [],
418 + organizationId: 0, // hide on form
419 + folderId: 0, // hide on form
420 + datasourceUid: "uid-to-be-replaced" // hide on form
421 + },
422 +
423 + // step 4
424 + wazuh_auth_password: "",
425 + wazuh_registration_port: "",
426 + wazuh_logs_port: "",
427 + wazuh_api_port: "",
428 + wazuh_cluster_name: "",
429 + wazuh_cluster_key: "",
430 + wazuh_master_ip: "",
431 + grafana_url: ""
432 + }
433 +}
434 +
435 +function next() {
436 + validate(() => {
437 + currentStatus.value = "process"
438 + slideFormDirection.value = "right"
439 + current.value++
440 + })
441 +}
442 +
443 +function prev() {
444 + currentStatus.value = "process"
445 + slideFormDirection.value = "left"
446 + current.value--
447 +}
448 +
449 +function getSubscriptions() {
450 + loadingSubscriptions.value = true
451 +
452 + Api.customers
453 + .getProvisioningSubscriptions()
454 + .then(res => {
455 + if (res.data.success) {
456 + subscriptionOptions.value = (res.data?.available_subscriptions || []).map(o => ({ label: o, value: o }))
457 + } else {
458 + message.warning(res.data?.message || "An error occurred. Please try again later.")
459 + }
460 + })
461 + .catch(err => {
462 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
463 + })
464 + .finally(() => {
465 + loadingSubscriptions.value = false
466 + })
467 +}
468 +
469 +function getDashboards() {
470 + loadingDashboards.value = true
471 +
472 + Api.customers
473 + .getProvisioningDashboards()
474 + .then(res => {
475 + if (res.data.success) {
476 + dashboardOptions.value = (res.data?.available_dashboards || []).map(o => ({ label: o, value: o }))
477 + } else {
478 + message.warning(res.data?.message || "An error occurred. Please try again later.")
479 + }
480 + })
481 + .catch(err => {
482 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
483 + })
484 + .finally(() => {
485 + loadingDashboards.value = false
486 + })
487 +}
488 +
489 +function toggleDashboards() {
490 + if (allDashboardsSelected.value) {
491 + form.value.dashboards_to_include.dashboards = []
492 + } else {
493 + form.value.dashboards_to_include.dashboards = dashboardOptions.value.map(o => o.value)
494 + }
495 +}
496 +
497 +function validate(cb?: () => void) {
498 + if (!formRef.value) return
499 +
500 + formRef.value.validate((errors?: Array<FormValidationError>) => {
501 + if (!errors) {
502 + if (cb) cb()
503 + } else {
504 + message.warning("You must fill in the required fields correctly.")
505 + return false
506 + }
507 + })
508 +}
509 +
510 +function reset() {
511 + currentStatus.value = "process"
512 + slideFormDirection.value = "right"
513 + current.value = 1
514 +}
515 +
516 +async function submit() {
517 + currentStatus.value = "finish"
518 + loading.value = true
519 +
520 + if (mode.value === "update") {
521 + await Api.customers.decommissionCustomer(customerCode.value)
522 + }
523 +
524 + Api.customers
525 + .newCustomerProvision(form.value, customerCode.value)
526 + .then(res => {
527 + if (res.data.success) {
528 + emit("submitted", res.data.customer_meta)
529 + reset()
530 + } else {
531 + message.warning(res.data?.message || "An error occurred. Please try again later.")
532 + }
533 + })
534 + .catch(err => {
535 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
536 + })
537 + .finally(() => {
538 + loading.value = false
539 + })
540 +}
541 +
542 +onBeforeMount(() => {
543 + getSubscriptions()
544 + getDashboards()
545 +})
546 +</script>
547 +
548 +<style lang="scss" scoped>
549 +.customer-provision-wizard {
550 + .wrapper {
551 + min-height: 480px;
552 + }
553 +
554 + .slide-form-right-enter-active,
555 + .slide-form-right-leave-active,
556 + .slide-form-left-enter-active,
557 + .slide-form-left-leave-active {
558 + transition: all 0.2s ease-out;
559 + position: absolute;
560 + width: 100%;
561 + }
562 +
563 + .slide-form-left-enter-from {
564 + transform: translateX(-100%);
565 + }
566 +
567 + .slide-form-left-leave-to {
568 + transform: translateX(100%);
569 + }
570 +
571 + .slide-form-right-enter-from {
572 + transform: translateX(100%);
573 + }
574 +
575 + .slide-form-right-leave-to {
576 + transform: translateX(-100%);
577 + }
578 +}
579 +</style>
src/components/customers/CustomersList.vue
+9 -1
@@ -6,7 +6,12 @@
6 <strong class="font-mono">{{ totalCustomers }}</strong>
7 </div>
8 <div>
9 - <n-button size="small" type="primary" @click="showAddCustomer = true">Add Customer</n-button>
9 + <n-button size="small" type="primary" @click="showAddCustomer = true">
10 + <template #icon>
11 + <Icon :name="AddUserIcon" :size="14"></Icon>
12 + </template>
13 + Add Customer
14 + </n-button>
15 </div>
16 </div>
17 <n-spin :show="loadingCustomers">
@@ -45,6 +50,7 @@
50 <script setup lang="ts">
51 import { ref, onBeforeMount, computed, watch, toRefs, nextTick } from "vue"
52 import { useMessage, NSpin, NEmpty, NButton, NDrawer, NDrawerContent } from "naive-ui"
53 +import Icon from "@/components/common/Icon.vue"
54 import Api from "@/api"
55 import CustomerForm from "./CustomerForm.vue"
56 import CustomerItem from "./CustomerItem.vue"
@@ -53,6 +59,8 @@ import type { Customer } from "@/types/customers.d"
59 const props = defineProps<{ highlight: string | null | undefined }>()
60 const { highlight } = toRefs(props)
61
62 +const AddUserIcon = "carbon:user-follow"
63 +
64 const customerFormCTX = ref<{ reset: () => void } | null>(null)
65 const message = useMessage()
66 const loadingCustomers = ref(false)
src/types/customers.d.ts
+42 -1
@@ -16,8 +16,10 @@ export interface Customer {
16 logo_file: string
17 }
18
19 -// all required
19 export interface CustomerMeta {
20 + id: number
21 + customer_code: string
22 + customer_name: string
23 customer_meta_graylog_index: string
24 customer_meta_graylog_stream: string
25 customer_meta_grafana_org_id: string
@@ -26,6 +28,8 @@ export interface CustomerMeta {
28 customer_meta_wazuh_registration_port: string
29 customer_meta_wazuh_log_ingestion_port: string
30 customer_meta_wazuh_auth_password: string
31 + customer_meta_iris_customer_id: number
32 + customer_meta_office365_organization_id: string
33 }
34
35 export type CustomerHealthcheckSource = "wazuh" | "velociraptor"
@@ -48,3 +52,40 @@ export interface CustomerAgentHealth {
52 unhealthy_velociraptor_agent: boolean | null
53 unhealthy_recent_logs_collected: null
54 }
55 +
56 +export interface CustomerProvision {
57 + customer_name: string
58 + customer_code: string
59 + customer_index_name: string
60 + customer_grafana_org_name: string
61 + hot_data_retention: number
62 + index_replicas: number
63 + /** default this to 1 */
64 + index_shards: number
65 + /** default to Wazuh */
66 + customer_subscription: string[] // ??
67 + dashboards_to_include: {
68 + dashboards: string[]
69 + /** default to 0 */
70 + organizationId: number
71 + /** default to 0 */
72 + folderId: number
73 + /** default to "uid-to-be-replaced" */
74 + datasourceUid: string
75 + }
76 + wazuh_auth_password: string
77 + wazuh_registration_port: string
78 + wazuh_logs_port: string
79 + wazuh_api_port: string
80 + wazuh_cluster_name: string
81 + wazuh_cluster_key: string
82 + wazuh_master_ip: string
83 + grafana_url: string
84 +}
85 +
86 +export interface CustomerDecomissionedData {
87 + agents_deleted: string[]
88 + groups_deleted: string[]
89 + stream_deleted: string
90 + index_deleted: string
91 +}
src/utils/index.ts
+5
@@ -1,6 +1,7 @@
1 import Icon from "@/components/common/Icon.vue"
2 import { type Component, h } from "vue"
3 import { isMobile as detectMobile } from "detect-touch-device"
4 +import { md5 } from "js-md5"
5
6 export type OS = "Unknown" | "Windows" | "MacOS" | "UNIX" | "Linux"
7
@@ -60,3 +61,7 @@ export function getOS(): OS {
61 export const delay = (t: number) => {
62 return new Promise(res => setTimeout(res, t))
63 }
64 +
65 +export const hashMD5 = (text: number | string) => {
66 + return md5(text.toString())
67 +}