@cryptotaxi247 / CoPilot / commits / 0436388e

Healthchecks (#105)

* added soc pages * added soc api * updated badge component * updated soc alert page * Updated soc alert item component * updated soc alert page * updated soc alert page * added soc cases page * updated soc cases page * improved soc cases assets list * graylog running and configured inputs model fix pydantic model failure when GELF input is configured. Made missing fields optional * remove logging during debugging * soc asset pydantic model fix * add connectors if not exist async * return connector extra data * added soc case note components * influxdb verification check * added soc users page * influxdb get alerts * influxdb alert query * grafana connector * precommit fixes * precommit fixes * grafana dashboard upload test * grafana dashboard provision * GRAFANA WAZUH DASHBOARDS PROVISIONING * Grafana dashboards provisioning improvements * create index set in graylog * graylog index creation refactor * precommit fixes * create graylog stream * updated soc users page * added soc user assign feature * updated soc users page * added healthchecks api/types * influxdb alerts fix * get single alert api endpoint * single alret api * get soc alerts assigned to user * updated soc api * updated healthcheck type * bummped up bookmark * updated alert assign feature * graylog stream connection to pipeline * updated soc alert item component * create wazuh groups * configure wazuh agent groups * grafana provisioning * grafana datasource creation * universal connector attribute * updated soc users list component * replace dashboard uid with correct value * provisioning update customermeta table * precommit fixes * added realtime chart on graylog/metrics page * broke up customer provisioning into various modules * precommit fixes * modify dashboard replacement template * wazuh worker provision * updated uncommitted-entries component * updated unhealthy-indices component * improved global actions * updated env vars * updated dependencies * refactored pinia stores * added healthcheck store * added Healthchecks Notify composable * updated global notification composable * updated notifications components * Add main function for provisioning a new customer * Add docstrings to update_customer_meta_table and provision_wazuh_worker functions * Refactor Grafana and Graylog provisioning code * updated env files * updated notifications * Add Wazuh Manager decommissioning functionality * Update customer decom services * Refactor customer decommissioning route and service * rename * Add decommissioning functionality for Wazuh worker * Update decommission_wazuh_worker function * Refactor exception handlers with docs * Decommission Wazuh customer and delete associated data docs * Add threat intelligence router * remove logger from response * Update customer_code field in SocfortressThreatIntelRequest schema * remove 404 response * Added healthcheck page * httpx * updated healthcheck card component * precommit fixes --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Dec 10, 2023 at 08:44 UTC 0436388e7e2ff49c8825c3353f60311959835e29
71 files changed +4726 -2929
.env.example
+9
@@ -1,2 +1,11 @@
1 +# base url
2 VITE_API_URL=http://127.0.0.1:5000
3 +
4 +# value in seconds
5 VITE_TOKEN_DEBOUNCE_TIME=10
6 +
7 +# alert if value is over
8 +VITE_UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD=50000
9 +
10 +# value in seconds
11 +VITE_HEALTHCHECKS_INTERVAL=120
.env.production
+9
@@ -1,2 +1,11 @@
1 +# base url
2 VITE_API_URL=http://127.0.0.1:5000
3 +
4 +# value in seconds
5 VITE_TOKEN_DEBOUNCE_TIME=10
6 +
7 +# alert if value is over
8 +VITE_UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD=50000
9 +
10 +# value in seconds
11 +VITE_HEALTHCHECKS_INTERVAL=120
backend/app/connectors/grafana/dashboards/Wazuh/edr_ad_inventory.json
+14 -14
@@ -31,7 +31,7 @@
31 {
32 "datasource": {
33 "type": "elasticsearch",
34 - "uid": "wazuh_datasource_uid"
34 + "uid": "replace_datasource_uid"
35 },
36 "fieldConfig": {
37 "defaults": {
@@ -86,7 +86,7 @@
86 ],
87 "datasource": {
88 "type": "elasticsearch",
89 - "uid": "wazuh_datasource_uid"
89 + "uid": "replace_datasource_uid"
90 },
91 "metrics": [
92 {
@@ -106,7 +106,7 @@
106 {
107 "datasource": {
108 "type": "elasticsearch",
109 - "uid": "wazuh_datasource_uid"
109 + "uid": "replace_datasource_uid"
110 },
111 "fieldConfig": {
112 "defaults": {
@@ -174,7 +174,7 @@
174 ],
175 "datasource": {
176 "type": "elasticsearch",
177 - "uid": "wazuh_datasource_uid"
177 + "uid": "replace_datasource_uid"
178 },
179 "metrics": [
180 {
@@ -193,7 +193,7 @@
193 {
194 "datasource": {
195 "type": "elasticsearch",
196 - "uid": "wazuh_datasource_uid"
196 + "uid": "replace_datasource_uid"
197 },
198 "fieldConfig": {
199 "defaults": {
@@ -263,7 +263,7 @@
263 ],
264 "datasource": {
265 "type": "elasticsearch",
266 - "uid": "wazuh_datasource_uid"
266 + "uid": "replace_datasource_uid"
267 },
268 "metrics": [
269 {
@@ -282,7 +282,7 @@
282 {
283 "datasource": {
284 "type": "elasticsearch",
285 - "uid": "wazuh_datasource_uid"
285 + "uid": "replace_datasource_uid"
286 },
287 "fieldConfig": {
288 "defaults": {
@@ -337,7 +337,7 @@
337 ],
338 "datasource": {
339 "type": "elasticsearch",
340 - "uid": "wazuh_datasource_uid"
340 + "uid": "replace_datasource_uid"
341 },
342 "metrics": [
343 {
@@ -356,7 +356,7 @@
356 {
357 "datasource": {
358 "type": "elasticsearch",
359 - "uid": "wazuh_datasource_uid"
359 + "uid": "replace_datasource_uid"
360 },
361 "fieldConfig": {
362 "defaults": {
@@ -440,7 +440,7 @@
440 ],
441 "datasource": {
442 "type": "elasticsearch",
443 - "uid": "wazuh_datasource_uid"
443 + "uid": "replace_datasource_uid"
444 },
445 "metrics": [
446 {
@@ -459,7 +459,7 @@
459 {
460 "datasource": {
461 "type": "elasticsearch",
462 - "uid": "wazuh_datasource_uid"
462 + "uid": "replace_datasource_uid"
463 },
464 "fieldConfig": {
465 "defaults": {
@@ -529,7 +529,7 @@
529 ],
530 "datasource": {
531 "type": "elasticsearch",
532 - "uid": "wazuh_datasource_uid"
532 + "uid": "replace_datasource_uid"
533 },
534 "metrics": [
535 {
@@ -548,7 +548,7 @@
548 {
549 "datasource": {
550 "type": "elasticsearch",
551 - "uid": "wazuh_datasource_uid"
551 + "uid": "replace_datasource_uid"
552 },
553 "fieldConfig": {
554 "defaults": {
@@ -675,7 +675,7 @@
675 "bucketAggs": [],
676 "datasource": {
677 "type": "elasticsearch",
678 - "uid": "wazuh_datasource_uid"
678 + "uid": "replace_datasource_uid"
679 },
680 "metrics": [
681 {
backend/app/connectors/grafana/dashboards/Wazuh/edr_agent_inventory.json
+122 -122
@@ -44,7 +44,7 @@
44 "collapsed": false,
45 "datasource": {
46 "type": "elasticsearch",
47 - "uid": "wazuh_datasource_uid"
47 + "uid": "replace_datasource_uid"
48 },
49 "gridPos": {
50 "h": 1,
@@ -60,7 +60,7 @@
60 {
61 "datasource": {
62 "type": "elasticsearch",
63 - "uid": "wazuh_datasource_uid"
63 + "uid": "replace_datasource_uid"
64 },
65 "fieldConfig": {
66 "defaults": {
@@ -127,7 +127,7 @@
127 ],
128 "datasource": {
129 "type": "elasticsearch",
130 - "uid": "wazuh_datasource_uid"
130 + "uid": "replace_datasource_uid"
131 },
132 "metrics": [
133 {
@@ -148,7 +148,7 @@
148 {
149 "datasource": {
150 "type": "elasticsearch",
151 - "uid": "wazuh_datasource_uid"
151 + "uid": "replace_datasource_uid"
152 },
153 "fieldConfig": {
154 "defaults": {
@@ -393,7 +393,7 @@
393 ],
394 "datasource": {
395 "type": "elasticsearch",
396 - "uid": "wazuh_datasource_uid"
396 + "uid": "replace_datasource_uid"
397 },
398 "metrics": [
399 {
@@ -414,7 +414,7 @@
414 {
415 "datasource": {
416 "type": "elasticsearch",
417 - "uid": "wazuh_datasource_uid"
417 + "uid": "replace_datasource_uid"
418 },
419 "fieldConfig": {
420 "defaults": {
@@ -648,7 +648,7 @@
648 ],
649 "datasource": {
650 "type": "elasticsearch",
651 - "uid": "wazuh_datasource_uid"
651 + "uid": "replace_datasource_uid"
652 },
653 "metrics": [
654 {
@@ -669,7 +669,7 @@
669 {
670 "datasource": {
671 "type": "elasticsearch",
672 - "uid": "wazuh_datasource_uid"
672 + "uid": "replace_datasource_uid"
673 },
674 "fieldConfig": {
675 "defaults": {
@@ -820,7 +820,7 @@
820 ],
821 "datasource": {
822 "type": "elasticsearch",
823 - "uid": "wazuh_datasource_uid"
823 + "uid": "replace_datasource_uid"
824 },
825 "metrics": [
826 {
@@ -841,7 +841,7 @@
841 {
842 "datasource": {
843 "type": "elasticsearch",
844 - "uid": "wazuh_datasource_uid"
844 + "uid": "replace_datasource_uid"
845 },
846 "fieldConfig": {
847 "defaults": {
@@ -908,7 +908,7 @@
908 ],
909 "datasource": {
910 "type": "elasticsearch",
911 - "uid": "wazuh_datasource_uid"
911 + "uid": "replace_datasource_uid"
912 },
913 "metrics": [
914 {
@@ -929,7 +929,7 @@
929 {
930 "datasource": {
931 "type": "elasticsearch",
932 - "uid": "wazuh_datasource_uid"
932 + "uid": "replace_datasource_uid"
933 },
934 "fieldConfig": {
935 "defaults": {
@@ -1163,7 +1163,7 @@
1163 ],
1164 "datasource": {
1165 "type": "elasticsearch",
1166 - "uid": "wazuh_datasource_uid"
1166 + "uid": "replace_datasource_uid"
1167 },
1168 "metrics": [
1169 {
@@ -1184,7 +1184,7 @@
1184 {
1185 "datasource": {
1186 "type": "elasticsearch",
1187 - "uid": "wazuh_datasource_uid"
1187 + "uid": "replace_datasource_uid"
1188 },
1189 "fieldConfig": {
1190 "defaults": {
@@ -1251,7 +1251,7 @@
1251 ],
1252 "datasource": {
1253 "type": "elasticsearch",
1254 - "uid": "wazuh_datasource_uid"
1254 + "uid": "replace_datasource_uid"
1255 },
1256 "metrics": [
1257 {
@@ -1272,7 +1272,7 @@
1272 {
1273 "datasource": {
1274 "type": "elasticsearch",
1275 - "uid": "wazuh_datasource_uid"
1275 + "uid": "replace_datasource_uid"
1276 },
1277 "fieldConfig": {
1278 "defaults": {
@@ -1506,7 +1506,7 @@
1506 ],
1507 "datasource": {
1508 "type": "elasticsearch",
1509 - "uid": "wazuh_datasource_uid"
1509 + "uid": "replace_datasource_uid"
1510 },
1511 "metrics": [
1512 {
@@ -1527,7 +1527,7 @@
1527 {
1528 "datasource": {
1529 "type": "elasticsearch",
1530 - "uid": "wazuh_datasource_uid"
1530 + "uid": "replace_datasource_uid"
1531 },
1532 "fieldConfig": {
1533 "defaults": {
@@ -1640,7 +1640,7 @@
1640 "bucketAggs": [],
1641 "datasource": {
1642 "type": "elasticsearch",
1643 - "uid": "wazuh_datasource_uid"
1643 + "uid": "replace_datasource_uid"
1644 },
1645 "metrics": [
1646 {
@@ -1839,7 +1839,7 @@
1839 "collapsed": true,
1840 "datasource": {
1841 "type": "elasticsearch",
1842 - "uid": "wazuh_datasource_uid"
1842 + "uid": "replace_datasource_uid"
1843 },
1844 "gridPos": {
1845 "h": 1,
@@ -1852,7 +1852,7 @@
1852 {
1853 "datasource": {
1854 "type": "elasticsearch",
1855 - "uid": "wazuh_datasource_uid"
1855 + "uid": "replace_datasource_uid"
1856 },
1857 "fieldConfig": {
1858 "defaults": {
@@ -2096,7 +2096,7 @@
2096 ],
2097 "datasource": {
2098 "type": "elasticsearch",
2099 - "uid": "wazuh_datasource_uid"
2099 + "uid": "replace_datasource_uid"
2100 },
2101 "metrics": [
2102 {
@@ -2117,7 +2117,7 @@
2117 {
2118 "datasource": {
2119 "type": "elasticsearch",
2120 - "uid": "wazuh_datasource_uid"
2120 + "uid": "replace_datasource_uid"
2121 },
2122 "fieldConfig": {
2123 "defaults": {
@@ -2361,7 +2361,7 @@
2361 ],
2362 "datasource": {
2363 "type": "elasticsearch",
2364 - "uid": "wazuh_datasource_uid"
2364 + "uid": "replace_datasource_uid"
2365 },
2366 "metrics": [
2367 {
@@ -2382,7 +2382,7 @@
2382 {
2383 "datasource": {
2384 "type": "elasticsearch",
2385 - "uid": "wazuh_datasource_uid"
2385 + "uid": "replace_datasource_uid"
2386 },
2387 "fieldConfig": {
2388 "defaults": {
@@ -2517,7 +2517,7 @@
2517 "bucketAggs": [],
2518 "datasource": {
2519 "type": "elasticsearch",
2520 - "uid": "wazuh_datasource_uid"
2520 + "uid": "replace_datasource_uid"
2521 },
2522 "metrics": [
2523 {
@@ -2713,7 +2713,7 @@
2713 {
2714 "datasource": {
2715 "type": "elasticsearch",
2716 - "uid": "wazuh_datasource_uid"
2716 + "uid": "replace_datasource_uid"
2717 },
2718 "fieldConfig": {
2719 "defaults": {
@@ -2813,7 +2813,7 @@
2813 ],
2814 "datasource": {
2815 "type": "elasticsearch",
2816 - "uid": "wazuh_datasource_uid"
2816 + "uid": "replace_datasource_uid"
2817 },
2818 "metrics": [
2819 {
@@ -2847,7 +2847,7 @@
2847 {
2848 "datasource": {
2849 "type": "elasticsearch",
2850 - "uid": "wazuh_datasource_uid"
2850 + "uid": "replace_datasource_uid"
2851 },
2852 "fieldConfig": {
2853 "defaults": {
@@ -3091,7 +3091,7 @@
3091 ],
3092 "datasource": {
3093 "type": "elasticsearch",
3094 - "uid": "wazuh_datasource_uid"
3094 + "uid": "replace_datasource_uid"
3095 },
3096 "metrics": [
3097 {
@@ -3112,7 +3112,7 @@
3112 {
3113 "datasource": {
3114 "type": "elasticsearch",
3115 - "uid": "wazuh_datasource_uid"
3115 + "uid": "replace_datasource_uid"
3116 },
3117 "fieldConfig": {
3118 "defaults": {
@@ -3259,7 +3259,7 @@
3259 "bucketAggs": [],
3260 "datasource": {
3261 "type": "elasticsearch",
3262 - "uid": "wazuh_datasource_uid"
3262 + "uid": "replace_datasource_uid"
3263 },
3264 "metrics": [
3265 {
@@ -3452,7 +3452,7 @@
3452 {
3453 "datasource": {
3454 "type": "elasticsearch",
3455 - "uid": "wazuh_datasource_uid"
3455 + "uid": "replace_datasource_uid"
3456 },
3457 "fieldConfig": {
3458 "defaults": {
@@ -3587,7 +3587,7 @@
3587 "bucketAggs": [],
3588 "datasource": {
3589 "type": "elasticsearch",
3590 - "uid": "wazuh_datasource_uid"
3590 + "uid": "replace_datasource_uid"
3591 },
3592 "metrics": [
3593 {
@@ -3781,7 +3781,7 @@
3781 {
3782 "datasource": {
3783 "type": "elasticsearch",
3784 - "uid": "wazuh_datasource_uid"
3784 + "uid": "replace_datasource_uid"
3785 },
3786 "fieldConfig": {
3787 "defaults": {
@@ -3847,7 +3847,7 @@
3847 ],
3848 "datasource": {
3849 "type": "elasticsearch",
3850 - "uid": "wazuh_datasource_uid"
3850 + "uid": "replace_datasource_uid"
3851 },
3852 "metrics": [
3853 {
@@ -3868,7 +3868,7 @@
3868 {
3869 "datasource": {
3870 "type": "elasticsearch",
3871 - "uid": "wazuh_datasource_uid"
3871 + "uid": "replace_datasource_uid"
3872 },
3873 "fieldConfig": {
3874 "defaults": {
@@ -4100,7 +4100,7 @@
4100 ],
4101 "datasource": {
4102 "type": "elasticsearch",
4103 - "uid": "wazuh_datasource_uid"
4103 + "uid": "replace_datasource_uid"
4104 },
4105 "metrics": [
4106 {
@@ -4121,7 +4121,7 @@
4121 {
4122 "datasource": {
4123 "type": "elasticsearch",
4124 - "uid": "wazuh_datasource_uid"
4124 + "uid": "replace_datasource_uid"
4125 },
4126 "fieldConfig": {
4127 "defaults": {
@@ -4304,7 +4304,7 @@
4304 "bucketAggs": [],
4305 "datasource": {
4306 "type": "elasticsearch",
4307 - "uid": "wazuh_datasource_uid"
4307 + "uid": "replace_datasource_uid"
4308 },
4309 "metrics": [
4310 {
@@ -4509,7 +4509,7 @@
4509 {
4510 "datasource": {
4511 "type": "elasticsearch",
4512 - "uid": "wazuh_datasource_uid"
4512 + "uid": "replace_datasource_uid"
4513 },
4514 "fieldConfig": {
4515 "defaults": {
@@ -4694,7 +4694,7 @@
4694 "bucketAggs": [],
4695 "datasource": {
4696 "type": "elasticsearch",
4697 - "uid": "wazuh_datasource_uid"
4697 + "uid": "replace_datasource_uid"
4698 },
4699 "metrics": [
4700 {
@@ -4907,7 +4907,7 @@
4907 {
4908 "datasource": {
4909 "type": "elasticsearch",
4910 - "uid": "wazuh_datasource_uid"
4910 + "uid": "replace_datasource_uid"
4911 },
4912 "fieldConfig": {
4913 "defaults": {
@@ -5090,7 +5090,7 @@
5090 "bucketAggs": [],
5091 "datasource": {
5092 "type": "elasticsearch",
5093 - "uid": "wazuh_datasource_uid"
5093 + "uid": "replace_datasource_uid"
5094 },
5095 "metrics": [
5096 {
@@ -5309,7 +5309,7 @@
5309 "collapsed": true,
5310 "datasource": {
5311 "type": "elasticsearch",
5312 - "uid": "wazuh_datasource_uid"
5312 + "uid": "replace_datasource_uid"
5313 },
5314 "gridPos": {
5315 "h": 1,
@@ -5322,7 +5322,7 @@
5322 {
5323 "datasource": {
5324 "type": "elasticsearch",
5325 - "uid": "wazuh_datasource_uid"
5325 + "uid": "replace_datasource_uid"
5326 },
5327 "fieldConfig": {
5328 "defaults": {
@@ -5566,7 +5566,7 @@
5566 ],
5567 "datasource": {
5568 "type": "elasticsearch",
5569 - "uid": "wazuh_datasource_uid"
5569 + "uid": "replace_datasource_uid"
5570 },
5571 "metrics": [
5572 {
@@ -5587,7 +5587,7 @@
5587 {
5588 "datasource": {
5589 "type": "elasticsearch",
5590 - "uid": "wazuh_datasource_uid"
5590 + "uid": "replace_datasource_uid"
5591 },
5592 "fieldConfig": {
5593 "defaults": {
@@ -5675,7 +5675,7 @@
5675 ],
5676 "datasource": {
5677 "type": "elasticsearch",
5678 - "uid": "wazuh_datasource_uid"
5678 + "uid": "replace_datasource_uid"
5679 },
5680 "metrics": [
5681 {
@@ -5696,7 +5696,7 @@
5696 {
5697 "datasource": {
5698 "type": "elasticsearch",
5699 - "uid": "wazuh_datasource_uid"
5699 + "uid": "replace_datasource_uid"
5700 },
5701 "fieldConfig": {
5702 "defaults": {
@@ -5795,7 +5795,7 @@
5795 ],
5796 "datasource": {
5797 "type": "elasticsearch",
5798 - "uid": "wazuh_datasource_uid"
5798 + "uid": "replace_datasource_uid"
5799 },
5800 "metrics": [
5801 {
@@ -5816,7 +5816,7 @@
5816 {
5817 "datasource": {
5818 "type": "elasticsearch",
5819 - "uid": "wazuh_datasource_uid"
5819 + "uid": "replace_datasource_uid"
5820 },
5821 "fieldConfig": {
5822 "defaults": {
@@ -5927,7 +5927,7 @@
5927 "bucketAggs": [],
5928 "datasource": {
5929 "type": "elasticsearch",
5930 - "uid": "wazuh_datasource_uid"
5930 + "uid": "replace_datasource_uid"
5931 },
5932 "metrics": [
5933 {
@@ -6139,7 +6139,7 @@
6139 "collapsed": true,
6140 "datasource": {
6141 "type": "elasticsearch",
6142 - "uid": "wazuh_datasource_uid"
6142 + "uid": "replace_datasource_uid"
6143 },
6144 "gridPos": {
6145 "h": 1,
@@ -6152,7 +6152,7 @@
6152 {
6153 "datasource": {
6154 "type": "elasticsearch",
6155 - "uid": "wazuh_datasource_uid"
6155 + "uid": "replace_datasource_uid"
6156 },
6157 "fieldConfig": {
6158 "defaults": {
@@ -6263,7 +6263,7 @@
6263 "bucketAggs": [],
6264 "datasource": {
6265 "type": "elasticsearch",
6266 - "uid": "wazuh_datasource_uid"
6266 + "uid": "replace_datasource_uid"
6267 },
6268 "metrics": [
6269 {
@@ -6469,7 +6469,7 @@
6469 "collapsed": true,
6470 "datasource": {
6471 "type": "elasticsearch",
6472 - "uid": "wazuh_datasource_uid"
6472 + "uid": "replace_datasource_uid"
6473 },
6474 "gridPos": {
6475 "h": 1,
@@ -6482,7 +6482,7 @@
6482 {
6483 "datasource": {
6484 "type": "elasticsearch",
6485 - "uid": "wazuh_datasource_uid"
6485 + "uid": "replace_datasource_uid"
6486 },
6487 "fieldConfig": {
6488 "defaults": {
@@ -6689,7 +6689,7 @@
6689 "bucketAggs": [],
6690 "datasource": {
6691 "type": "elasticsearch",
6692 - "uid": "wazuh_datasource_uid"
6692 + "uid": "replace_datasource_uid"
6693 },
6694 "metrics": [
6695 {
@@ -6965,7 +6965,7 @@
6965 {
6966 "datasource": {
6967 "type": "elasticsearch",
6968 - "uid": "wazuh_datasource_uid"
6968 + "uid": "replace_datasource_uid"
6969 },
6970 "fieldConfig": {
6971 "defaults": {
@@ -7172,7 +7172,7 @@
7172 "bucketAggs": [],
7173 "datasource": {
7174 "type": "elasticsearch",
7175 - "uid": "wazuh_datasource_uid"
7175 + "uid": "replace_datasource_uid"
7176 },
7177 "metrics": [
7178 {
@@ -7456,7 +7456,7 @@
7456 "collapsed": true,
7457 "datasource": {
7458 "type": "elasticsearch",
7459 - "uid": "wazuh_datasource_uid"
7459 + "uid": "replace_datasource_uid"
7460 },
7461 "gridPos": {
7462 "h": 1,
@@ -7469,7 +7469,7 @@
7469 {
7470 "datasource": {
7471 "type": "elasticsearch",
7472 - "uid": "wazuh_datasource_uid"
7472 + "uid": "replace_datasource_uid"
7473 },
7474 "fieldConfig": {
7475 "defaults": {
@@ -7535,7 +7535,7 @@
7535 ],
7536 "datasource": {
7537 "type": "elasticsearch",
7538 - "uid": "wazuh_datasource_uid"
7538 + "uid": "replace_datasource_uid"
7539 },
7540 "metrics": [
7541 {
@@ -7555,7 +7555,7 @@
7555 {
7556 "datasource": {
7557 "type": "elasticsearch",
7558 - "uid": "wazuh_datasource_uid"
7558 + "uid": "replace_datasource_uid"
7559 },
7560 "fieldConfig": {
7561 "defaults": {
@@ -7814,7 +7814,7 @@
7814 ],
7815 "datasource": {
7816 "type": "elasticsearch",
7817 - "uid": "wazuh_datasource_uid"
7817 + "uid": "replace_datasource_uid"
7818 },
7819 "metrics": [
7820 {
@@ -7835,7 +7835,7 @@
7835 {
7836 "datasource": {
7837 "type": "elasticsearch",
7838 - "uid": "wazuh_datasource_uid"
7838 + "uid": "replace_datasource_uid"
7839 },
7840 "fieldConfig": {
7841 "defaults": {
@@ -7980,7 +7980,7 @@
7980 ],
7981 "datasource": {
7982 "type": "elasticsearch",
7983 - "uid": "wazuh_datasource_uid"
7983 + "uid": "replace_datasource_uid"
7984 },
7985 "metrics": [
7986 {
@@ -8001,7 +8001,7 @@
8001 {
8002 "datasource": {
8003 "type": "elasticsearch",
8004 - "uid": "wazuh_datasource_uid"
8004 + "uid": "replace_datasource_uid"
8005 },
8006 "fieldConfig": {
8007 "defaults": {
@@ -8160,7 +8160,7 @@
8160 "bucketAggs": [],
8161 "datasource": {
8162 "type": "elasticsearch",
8163 - "uid": "wazuh_datasource_uid"
8163 + "uid": "replace_datasource_uid"
8164 },
8165 "metrics": [
8166 {
@@ -8354,7 +8354,7 @@
8354 {
8355 "datasource": {
8356 "type": "elasticsearch",
8357 - "uid": "wazuh_datasource_uid"
8357 + "uid": "replace_datasource_uid"
8358 },
8359 "fieldConfig": {
8360 "defaults": {
@@ -8513,7 +8513,7 @@
8513 "bucketAggs": [],
8514 "datasource": {
8515 "type": "elasticsearch",
8516 - "uid": "wazuh_datasource_uid"
8516 + "uid": "replace_datasource_uid"
8517 },
8518 "metrics": [
8519 {
@@ -8716,7 +8716,7 @@
8716 "collapsed": true,
8717 "datasource": {
8718 "type": "elasticsearch",
8719 - "uid": "wazuh_datasource_uid"
8719 + "uid": "replace_datasource_uid"
8720 },
8721 "gridPos": {
8722 "h": 1,
@@ -8729,7 +8729,7 @@
8729 {
8730 "datasource": {
8731 "type": "elasticsearch",
8732 - "uid": "wazuh_datasource_uid"
8732 + "uid": "replace_datasource_uid"
8733 },
8734 "fieldConfig": {
8735 "defaults": {
@@ -8840,7 +8840,7 @@
8840 "bucketAggs": [],
8841 "datasource": {
8842 "type": "elasticsearch",
8843 - "uid": "wazuh_datasource_uid"
8843 + "uid": "replace_datasource_uid"
8844 },
8845 "metrics": [
8846 {
@@ -9036,7 +9036,7 @@
9036 "collapsed": true,
9037 "datasource": {
9038 "type": "elasticsearch",
9039 - "uid": "wazuh_datasource_uid"
9039 + "uid": "replace_datasource_uid"
9040 },
9041 "gridPos": {
9042 "h": 1,
@@ -9049,7 +9049,7 @@
9049 {
9050 "datasource": {
9051 "type": "elasticsearch",
9052 - "uid": "wazuh_datasource_uid"
9052 + "uid": "replace_datasource_uid"
9053 },
9054 "fieldConfig": {
9055 "defaults": {
@@ -9115,7 +9115,7 @@
9115 ],
9116 "datasource": {
9117 "type": "elasticsearch",
9118 - "uid": "wazuh_datasource_uid"
9118 + "uid": "replace_datasource_uid"
9119 },
9120 "metrics": [
9121 {
@@ -9135,7 +9135,7 @@
9135 {
9136 "datasource": {
9137 "type": "elasticsearch",
9138 - "uid": "wazuh_datasource_uid"
9138 + "uid": "replace_datasource_uid"
9139 },
9140 "fieldConfig": {
9141 "defaults": {
@@ -9319,7 +9319,7 @@
9319 ],
9320 "datasource": {
9321 "type": "elasticsearch",
9322 - "uid": "wazuh_datasource_uid"
9322 + "uid": "replace_datasource_uid"
9323 },
9324 "metrics": [
9325 {
@@ -9340,7 +9340,7 @@
9340 {
9341 "datasource": {
9342 "type": "elasticsearch",
9343 - "uid": "wazuh_datasource_uid"
9343 + "uid": "replace_datasource_uid"
9344 },
9345 "fieldConfig": {
9346 "defaults": {
@@ -9439,7 +9439,7 @@
9439 ],
9440 "datasource": {
9441 "type": "elasticsearch",
9442 - "uid": "wazuh_datasource_uid"
9442 + "uid": "replace_datasource_uid"
9443 },
9444 "metrics": [
9445 {
@@ -9460,7 +9460,7 @@
9460 {
9461 "datasource": {
9462 "type": "elasticsearch",
9463 - "uid": "wazuh_datasource_uid"
9463 + "uid": "replace_datasource_uid"
9464 },
9465 "fieldConfig": {
9466 "defaults": {
@@ -9655,7 +9655,7 @@
9655 "bucketAggs": [],
9656 "datasource": {
9657 "type": "elasticsearch",
9658 - "uid": "wazuh_datasource_uid"
9658 + "uid": "replace_datasource_uid"
9659 },
9660 "metrics": [
9661 {
@@ -9908,7 +9908,7 @@
9908 "collapsed": true,
9909 "datasource": {
9910 "type": "elasticsearch",
9911 - "uid": "wazuh_datasource_uid"
9911 + "uid": "replace_datasource_uid"
9912 },
9913 "gridPos": {
9914 "h": 1,
@@ -9921,7 +9921,7 @@
9921 {
9922 "datasource": {
9923 "type": "elasticsearch",
9924 - "uid": "wazuh_datasource_uid"
9924 + "uid": "replace_datasource_uid"
9925 },
9926 "fieldConfig": {
9927 "defaults": {
@@ -10032,7 +10032,7 @@
10032 "bucketAggs": [],
10033 "datasource": {
10034 "type": "elasticsearch",
10035 - "uid": "wazuh_datasource_uid"
10035 + "uid": "replace_datasource_uid"
10036 },
10037 "metrics": [
10038 {
@@ -10232,7 +10232,7 @@
10232 "collapsed": true,
10233 "datasource": {
10234 "type": "elasticsearch",
10235 - "uid": "wazuh_datasource_uid"
10235 + "uid": "replace_datasource_uid"
10236 },
10237 "gridPos": {
10238 "h": 1,
@@ -10245,7 +10245,7 @@
10245 {
10246 "datasource": {
10247 "type": "elasticsearch",
10248 - "uid": "wazuh_datasource_uid"
10248 + "uid": "replace_datasource_uid"
10249 },
10250 "fieldConfig": {
10251 "defaults": {
@@ -10311,7 +10311,7 @@
10311 ],
10312 "datasource": {
10313 "type": "elasticsearch",
10314 - "uid": "wazuh_datasource_uid"
10314 + "uid": "replace_datasource_uid"
10315 },
10316 "metrics": [
10317 {
@@ -10332,7 +10332,7 @@
10332 {
10333 "datasource": {
10334 "type": "elasticsearch",
10335 - "uid": "wazuh_datasource_uid"
10335 + "uid": "replace_datasource_uid"
10336 },
10337 "fieldConfig": {
10338 "defaults": {
@@ -10398,7 +10398,7 @@
10398 ],
10399 "datasource": {
10400 "type": "elasticsearch",
10401 - "uid": "wazuh_datasource_uid"
10401 + "uid": "replace_datasource_uid"
10402 },
10403 "metrics": [
10404 {
@@ -10419,7 +10419,7 @@
10419 {
10420 "datasource": {
10421 "type": "elasticsearch",
10422 - "uid": "wazuh_datasource_uid"
10422 + "uid": "replace_datasource_uid"
10423 },
10424 "fieldConfig": {
10425 "defaults": {
@@ -10485,7 +10485,7 @@
10485 ],
10486 "datasource": {
10487 "type": "elasticsearch",
10488 - "uid": "wazuh_datasource_uid"
10488 + "uid": "replace_datasource_uid"
10489 },
10490 "metrics": [
10491 {
@@ -10506,7 +10506,7 @@
10506 {
10507 "datasource": {
10508 "type": "elasticsearch",
10509 - "uid": "wazuh_datasource_uid"
10509 + "uid": "replace_datasource_uid"
10510 },
10511 "fieldConfig": {
10512 "defaults": {
@@ -10572,7 +10572,7 @@
10572 ],
10573 "datasource": {
10574 "type": "elasticsearch",
10575 - "uid": "wazuh_datasource_uid"
10575 + "uid": "replace_datasource_uid"
10576 },
10577 "metrics": [
10578 {
@@ -10593,7 +10593,7 @@
10593 {
10594 "datasource": {
10595 "type": "elasticsearch",
10596 - "uid": "wazuh_datasource_uid"
10596 + "uid": "replace_datasource_uid"
10597 },
10598 "fieldConfig": {
10599 "defaults": {
@@ -10659,7 +10659,7 @@
10659 ],
10660 "datasource": {
10661 "type": "elasticsearch",
10662 - "uid": "wazuh_datasource_uid"
10662 + "uid": "replace_datasource_uid"
10663 },
10664 "metrics": [
10665 {
@@ -10680,7 +10680,7 @@
10680 {
10681 "datasource": {
10682 "type": "elasticsearch",
10683 - "uid": "wazuh_datasource_uid"
10683 + "uid": "replace_datasource_uid"
10684 },
10685 "fieldConfig": {
10686 "defaults": {
@@ -10746,7 +10746,7 @@
10746 ],
10747 "datasource": {
10748 "type": "elasticsearch",
10749 - "uid": "wazuh_datasource_uid"
10749 + "uid": "replace_datasource_uid"
10750 },
10751 "metrics": [
10752 {
@@ -10767,7 +10767,7 @@
10767 {
10768 "datasource": {
10769 "type": "elasticsearch",
10770 - "uid": "wazuh_datasource_uid"
10770 + "uid": "replace_datasource_uid"
10771 },
10772 "fieldConfig": {
10773 "defaults": {
@@ -10994,7 +10994,7 @@
10994 "bucketAggs": [],
10995 "datasource": {
10996 "type": "elasticsearch",
10997 - "uid": "wazuh_datasource_uid"
10997 + "uid": "replace_datasource_uid"
10998 },
10999 "metrics": [
11000 {
@@ -11247,7 +11247,7 @@
11247 {
11248 "datasource": {
11249 "type": "elasticsearch",
11250 - "uid": "wazuh_datasource_uid"
11250 + "uid": "replace_datasource_uid"
11251 },
11252 "fieldConfig": {
11253 "defaults": {
@@ -11313,7 +11313,7 @@
11313 ],
11314 "datasource": {
11315 "type": "elasticsearch",
11316 - "uid": "wazuh_datasource_uid"
11316 + "uid": "replace_datasource_uid"
11317 },
11318 "metrics": [
11319 {
@@ -11334,7 +11334,7 @@
11334 {
11335 "datasource": {
11336 "type": "elasticsearch",
11337 - "uid": "wazuh_datasource_uid"
11337 + "uid": "replace_datasource_uid"
11338 },
11339 "fieldConfig": {
11340 "defaults": {
@@ -11400,7 +11400,7 @@
11400 ],
11401 "datasource": {
11402 "type": "elasticsearch",
11403 - "uid": "wazuh_datasource_uid"
11403 + "uid": "replace_datasource_uid"
11404 },
11405 "metrics": [
11406 {
@@ -11421,7 +11421,7 @@
11421 {
11422 "datasource": {
11423 "type": "elasticsearch",
11424 - "uid": "wazuh_datasource_uid"
11424 + "uid": "replace_datasource_uid"
11425 },
11426 "fieldConfig": {
11427 "defaults": {
@@ -11487,7 +11487,7 @@
11487 ],
11488 "datasource": {
11489 "type": "elasticsearch",
11490 - "uid": "wazuh_datasource_uid"
11490 + "uid": "replace_datasource_uid"
11491 },
11492 "metrics": [
11493 {
@@ -11508,7 +11508,7 @@
11508 {
11509 "datasource": {
11510 "type": "elasticsearch",
11511 - "uid": "wazuh_datasource_uid"
11511 + "uid": "replace_datasource_uid"
11512 },
11513 "fieldConfig": {
11514 "defaults": {
@@ -11574,7 +11574,7 @@
11574 ],
11575 "datasource": {
11576 "type": "elasticsearch",
11577 - "uid": "wazuh_datasource_uid"
11577 + "uid": "replace_datasource_uid"
11578 },
11579 "metrics": [
11580 {
@@ -11595,7 +11595,7 @@
11595 {
11596 "datasource": {
11597 "type": "elasticsearch",
11598 - "uid": "wazuh_datasource_uid"
11598 + "uid": "replace_datasource_uid"
11599 },
11600 "fieldConfig": {
11601 "defaults": {
@@ -11661,7 +11661,7 @@
11661 ],
11662 "datasource": {
11663 "type": "elasticsearch",
11664 - "uid": "wazuh_datasource_uid"
11664 + "uid": "replace_datasource_uid"
11665 },
11666 "metrics": [
11667 {
@@ -11682,7 +11682,7 @@
11682 {
11683 "datasource": {
11684 "type": "elasticsearch",
11685 - "uid": "wazuh_datasource_uid"
11685 + "uid": "replace_datasource_uid"
11686 },
11687 "fieldConfig": {
11688 "defaults": {
@@ -11768,7 +11768,7 @@
11768 ],
11769 "datasource": {
11770 "type": "elasticsearch",
11771 - "uid": "wazuh_datasource_uid"
11771 + "uid": "replace_datasource_uid"
11772 },
11773 "metrics": [
11774 {
@@ -11802,7 +11802,7 @@
11802 {
11803 "datasource": {
11804 "type": "elasticsearch",
11805 - "uid": "wazuh_datasource_uid"
11805 + "uid": "replace_datasource_uid"
11806 },
11807 "fieldConfig": {
11808 "defaults": {
@@ -11868,7 +11868,7 @@
11868 ],
11869 "datasource": {
11870 "type": "elasticsearch",
11871 - "uid": "wazuh_datasource_uid"
11871 + "uid": "replace_datasource_uid"
11872 },
11873 "metrics": [
11874 {
@@ -11889,7 +11889,7 @@
11889 {
11890 "datasource": {
11891 "type": "elasticsearch",
11892 - "uid": "wazuh_datasource_uid"
11892 + "uid": "replace_datasource_uid"
11893 },
11894 "fieldConfig": {
11895 "defaults": {
@@ -11975,7 +11975,7 @@
11975 ],
11976 "datasource": {
11977 "type": "elasticsearch",
11978 - "uid": "wazuh_datasource_uid"
11978 + "uid": "replace_datasource_uid"
11979 },
11980 "metrics": [
11981 {
@@ -12009,7 +12009,7 @@
12009 {
12010 "datasource": {
12011 "type": "elasticsearch",
12012 - "uid": "wazuh_datasource_uid"
12012 + "uid": "replace_datasource_uid"
12013 },
12014 "fieldConfig": {
12015 "defaults": {
@@ -12120,7 +12120,7 @@
12120 "bucketAggs": [],
12121 "datasource": {
12122 "type": "elasticsearch",
12123 - "uid": "wazuh_datasource_uid"
12123 + "uid": "replace_datasource_uid"
12124 },
12125 "metrics": [
12126 {
@@ -12329,7 +12329,7 @@
12329 {
12330 "datasource": {
12331 "type": "elasticsearch",
12332 - "uid": "wazuh_datasource_uid"
12332 + "uid": "replace_datasource_uid"
12333 },
12334 "filters": [],
12335 "hide": 0,
@@ -12346,7 +12346,7 @@
12346 },
12347 "datasource": {
12348 "type": "elasticsearch",
12349 - "uid": "wazuh_datasource_uid"
12349 + "uid": "replace_datasource_uid"
12350 },
12351 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_groups:*inventory\"}",
12352 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_av_malware_ioc.json
+71 -71
@@ -52,7 +52,7 @@
52 {
53 "datasource": {
54 "type": "elasticsearch",
55 - "uid": "wazuh_datasource_uid"
55 + "uid": "replace_datasource_uid"
56 },
57 "fieldConfig": {
58 "defaults": {
@@ -119,7 +119,7 @@
119 ],
120 "datasource": {
121 "type": "elasticsearch",
122 - "uid": "wazuh_datasource_uid"
122 + "uid": "replace_datasource_uid"
123 },
124 "metrics": [
125 {
@@ -140,7 +140,7 @@
140 {
141 "datasource": {
142 "type": "elasticsearch",
143 - "uid": "wazuh_datasource_uid"
143 + "uid": "replace_datasource_uid"
144 },
145 "fieldConfig": {
146 "defaults": {
@@ -222,7 +222,7 @@
222 ],
223 "datasource": {
224 "type": "elasticsearch",
225 - "uid": "wazuh_datasource_uid"
225 + "uid": "replace_datasource_uid"
226 },
227 "metrics": [
228 {
@@ -243,7 +243,7 @@
243 {
244 "datasource": {
245 "type": "elasticsearch",
246 - "uid": "wazuh_datasource_uid"
246 + "uid": "replace_datasource_uid"
247 },
248 "fieldConfig": {
249 "defaults": {
@@ -397,7 +397,7 @@
397 ],
398 "datasource": {
399 "type": "elasticsearch",
400 - "uid": "wazuh_datasource_uid"
400 + "uid": "replace_datasource_uid"
401 },
402 "metrics": [
403 {
@@ -430,7 +430,7 @@
430 {
431 "datasource": {
432 "type": "elasticsearch",
433 - "uid": "wazuh_datasource_uid"
433 + "uid": "replace_datasource_uid"
434 },
435 "fieldConfig": {
436 "defaults": {
@@ -655,7 +655,7 @@
655 "bucketAggs": [],
656 "datasource": {
657 "type": "elasticsearch",
658 - "uid": "wazuh_datasource_uid"
658 + "uid": "replace_datasource_uid"
659 },
660 "metrics": [
661 {
@@ -1098,7 +1098,7 @@
1098 {
1099 "datasource": {
1100 "type": "elasticsearch",
1101 - "uid": "wazuh_datasource_uid"
1101 + "uid": "replace_datasource_uid"
1102 },
1103 "fieldConfig": {
1104 "defaults": {
@@ -1165,7 +1165,7 @@
1165 ],
1166 "datasource": {
1167 "type": "elasticsearch",
1168 - "uid": "wazuh_datasource_uid"
1168 + "uid": "replace_datasource_uid"
1169 },
1170 "metrics": [
1171 {
@@ -1186,7 +1186,7 @@
1186 {
1187 "datasource": {
1188 "type": "elasticsearch",
1189 - "uid": "wazuh_datasource_uid"
1189 + "uid": "replace_datasource_uid"
1190 },
1191 "fieldConfig": {
1192 "defaults": {
@@ -1268,7 +1268,7 @@
1268 ],
1269 "datasource": {
1270 "type": "elasticsearch",
1271 - "uid": "wazuh_datasource_uid"
1271 + "uid": "replace_datasource_uid"
1272 },
1273 "metrics": [
1274 {
@@ -1301,7 +1301,7 @@
1301 {
1302 "datasource": {
1303 "type": "elasticsearch",
1304 - "uid": "wazuh_datasource_uid"
1304 + "uid": "replace_datasource_uid"
1305 },
1306 "fieldConfig": {
1307 "defaults": {
@@ -1455,7 +1455,7 @@
1455 ],
1456 "datasource": {
1457 "type": "elasticsearch",
1458 - "uid": "wazuh_datasource_uid"
1458 + "uid": "replace_datasource_uid"
1459 },
1460 "metrics": [
1461 {
@@ -1489,7 +1489,7 @@
1489 {
1490 "datasource": {
1491 "type": "elasticsearch",
1492 - "uid": "wazuh_datasource_uid"
1492 + "uid": "replace_datasource_uid"
1493 },
1494 "fieldConfig": {
1495 "defaults": {
@@ -1716,7 +1716,7 @@
1716 "bucketAggs": [],
1717 "datasource": {
1718 "type": "elasticsearch",
1719 - "uid": "wazuh_datasource_uid"
1719 + "uid": "replace_datasource_uid"
1720 },
1721 "metrics": [
1722 {
@@ -2342,7 +2342,7 @@
2342 "collapsed": true,
2343 "datasource": {
2344 "type": "elasticsearch",
2345 - "uid": "wazuh_datasource_uid"
2345 + "uid": "replace_datasource_uid"
2346 },
2347 "gridPos": {
2348 "h": 1,
@@ -2355,7 +2355,7 @@
2355 {
2356 "datasource": {
2357 "type": "elasticsearch",
2358 - "uid": "wazuh_datasource_uid"
2358 + "uid": "replace_datasource_uid"
2359 },
2360 "fieldConfig": {
2361 "defaults": {
@@ -2422,7 +2422,7 @@
2422 ],
2423 "datasource": {
2424 "type": "elasticsearch",
2425 - "uid": "wazuh_datasource_uid"
2425 + "uid": "replace_datasource_uid"
2426 },
2427 "metrics": [
2428 {
@@ -2443,7 +2443,7 @@
2443 {
2444 "datasource": {
2445 "type": "elasticsearch",
2446 - "uid": "wazuh_datasource_uid"
2446 + "uid": "replace_datasource_uid"
2447 },
2448 "fieldConfig": {
2449 "defaults": {
@@ -2689,7 +2689,7 @@
2689 ],
2690 "datasource": {
2691 "type": "elasticsearch",
2692 - "uid": "wazuh_datasource_uid"
2692 + "uid": "replace_datasource_uid"
2693 },
2694 "metrics": [
2695 {
@@ -2710,7 +2710,7 @@
2710 {
2711 "datasource": {
2712 "type": "elasticsearch",
2713 - "uid": "wazuh_datasource_uid"
2713 + "uid": "replace_datasource_uid"
2714 },
2715 "fieldConfig": {
2716 "defaults": {
@@ -2881,7 +2881,7 @@
2881 ],
2882 "datasource": {
2883 "type": "elasticsearch",
2884 - "uid": "wazuh_datasource_uid"
2884 + "uid": "replace_datasource_uid"
2885 },
2886 "metrics": [
2887 {
@@ -2902,7 +2902,7 @@
2902 {
2903 "datasource": {
2904 "type": "elasticsearch",
2905 - "uid": "wazuh_datasource_uid"
2905 + "uid": "replace_datasource_uid"
2906 },
2907 "fieldConfig": {
2908 "defaults": {
@@ -2984,7 +2984,7 @@
2984 ],
2985 "datasource": {
2986 "type": "elasticsearch",
2987 - "uid": "wazuh_datasource_uid"
2987 + "uid": "replace_datasource_uid"
2988 },
2989 "metrics": [
2990 {
@@ -3009,7 +3009,7 @@
3009 "dashes": false,
3010 "datasource": {
3011 "type": "elasticsearch",
3012 - "uid": "wazuh_datasource_uid"
3012 + "uid": "replace_datasource_uid"
3013 },
3014 "fill": 1,
3015 "fillGradient": 0,
@@ -3077,7 +3077,7 @@
3077 ],
3078 "datasource": {
3079 "type": "elasticsearch",
3080 - "uid": "wazuh_datasource_uid"
3080 + "uid": "replace_datasource_uid"
3081 },
3082 "metrics": [
3083 {
@@ -3125,7 +3125,7 @@
3125 {
3126 "datasource": {
3127 "type": "elasticsearch",
3128 - "uid": "wazuh_datasource_uid"
3128 + "uid": "replace_datasource_uid"
3129 },
3130 "fieldConfig": {
3131 "defaults": {
@@ -3284,7 +3284,7 @@
3284 "bucketAggs": [],
3285 "datasource": {
3286 "type": "elasticsearch",
3287 - "uid": "wazuh_datasource_uid"
3287 + "uid": "replace_datasource_uid"
3288 },
3289 "metrics": [
3290 {
@@ -3490,7 +3490,7 @@
3490 "collapsed": true,
3491 "datasource": {
3492 "type": "elasticsearch",
3493 - "uid": "wazuh_datasource_uid"
3493 + "uid": "replace_datasource_uid"
3494 },
3495 "gridPos": {
3496 "h": 1,
@@ -3503,7 +3503,7 @@
3503 {
3504 "datasource": {
3505 "type": "elasticsearch",
3506 - "uid": "wazuh_datasource_uid"
3506 + "uid": "replace_datasource_uid"
3507 },
3508 "fieldConfig": {
3509 "defaults": {
@@ -3570,7 +3570,7 @@
3570 ],
3571 "datasource": {
3572 "type": "elasticsearch",
3573 - "uid": "wazuh_datasource_uid"
3573 + "uid": "replace_datasource_uid"
3574 },
3575 "metrics": [
3576 {
@@ -3591,7 +3591,7 @@
3591 {
3592 "datasource": {
3593 "type": "elasticsearch",
3594 - "uid": "wazuh_datasource_uid"
3594 + "uid": "replace_datasource_uid"
3595 },
3596 "fieldConfig": {
3597 "defaults": {
@@ -3792,7 +3792,7 @@
3792 ],
3793 "datasource": {
3794 "type": "elasticsearch",
3795 - "uid": "wazuh_datasource_uid"
3795 + "uid": "replace_datasource_uid"
3796 },
3797 "metrics": [
3798 {
@@ -3813,7 +3813,7 @@
3813 {
3814 "datasource": {
3815 "type": "elasticsearch",
3816 - "uid": "wazuh_datasource_uid"
3816 + "uid": "replace_datasource_uid"
3817 },
3818 "fieldConfig": {
3819 "defaults": {
@@ -3934,7 +3934,7 @@
3934 ],
3935 "datasource": {
3936 "type": "elasticsearch",
3937 - "uid": "wazuh_datasource_uid"
3937 + "uid": "replace_datasource_uid"
3938 },
3939 "metrics": [
3940 {
@@ -3955,7 +3955,7 @@
3955 {
3956 "datasource": {
3957 "type": "elasticsearch",
3958 - "uid": "wazuh_datasource_uid"
3958 + "uid": "replace_datasource_uid"
3959 },
3960 "fieldConfig": {
3961 "defaults": {
@@ -4036,7 +4036,7 @@
4036 ],
4037 "datasource": {
4038 "type": "elasticsearch",
4039 - "uid": "wazuh_datasource_uid"
4039 + "uid": "replace_datasource_uid"
4040 },
4041 "metrics": [
4042 {
@@ -4061,7 +4061,7 @@
4061 "dashes": false,
4062 "datasource": {
4063 "type": "elasticsearch",
4064 - "uid": "wazuh_datasource_uid"
4064 + "uid": "replace_datasource_uid"
4065 },
4066 "fill": 1,
4067 "fillGradient": 0,
@@ -4129,7 +4129,7 @@
4129 ],
4130 "datasource": {
4131 "type": "elasticsearch",
4132 - "uid": "wazuh_datasource_uid"
4132 + "uid": "replace_datasource_uid"
4133 },
4134 "metrics": [
4135 {
@@ -4177,7 +4177,7 @@
4177 {
4178 "datasource": {
4179 "type": "elasticsearch",
4180 - "uid": "wazuh_datasource_uid"
4180 + "uid": "replace_datasource_uid"
4181 },
4182 "fieldConfig": {
4183 "defaults": {
@@ -4378,7 +4378,7 @@
4378 ],
4379 "datasource": {
4380 "type": "elasticsearch",
4381 - "uid": "wazuh_datasource_uid"
4381 + "uid": "replace_datasource_uid"
4382 },
4383 "metrics": [
4384 {
@@ -4399,7 +4399,7 @@
4399 {
4400 "datasource": {
4401 "type": "elasticsearch",
4402 - "uid": "wazuh_datasource_uid"
4402 + "uid": "replace_datasource_uid"
4403 },
4404 "fieldConfig": {
4405 "defaults": {
@@ -4492,7 +4492,7 @@
4492 ],
4493 "datasource": {
4494 "type": "elasticsearch",
4495 - "uid": "wazuh_datasource_uid"
4495 + "uid": "replace_datasource_uid"
4496 },
4497 "metrics": [
4498 {
@@ -4513,7 +4513,7 @@
4513 {
4514 "datasource": {
4515 "type": "elasticsearch",
4516 - "uid": "wazuh_datasource_uid"
4516 + "uid": "replace_datasource_uid"
4517 },
4518 "fieldConfig": {
4519 "defaults": {
@@ -4744,7 +4744,7 @@
4744 "bucketAggs": [],
4745 "datasource": {
4746 "type": "elasticsearch",
4747 - "uid": "wazuh_datasource_uid"
4747 + "uid": "replace_datasource_uid"
4748 },
4749 "metrics": [
4750 {
@@ -5036,7 +5036,7 @@
5036 "collapsed": true,
5037 "datasource": {
5038 "type": "elasticsearch",
5039 - "uid": "wazuh_datasource_uid"
5039 + "uid": "replace_datasource_uid"
5040 },
5041 "gridPos": {
5042 "h": 1,
@@ -5049,7 +5049,7 @@
5049 {
5050 "datasource": {
5051 "type": "elasticsearch",
5052 - "uid": "wazuh_datasource_uid"
5052 + "uid": "replace_datasource_uid"
5053 },
5054 "fieldConfig": {
5055 "defaults": {
@@ -5116,7 +5116,7 @@
5116 ],
5117 "datasource": {
5118 "type": "elasticsearch",
5119 - "uid": "wazuh_datasource_uid"
5119 + "uid": "replace_datasource_uid"
5120 },
5121 "metrics": [
5122 {
@@ -5137,7 +5137,7 @@
5137 {
5138 "datasource": {
5139 "type": "elasticsearch",
5140 - "uid": "wazuh_datasource_uid"
5140 + "uid": "replace_datasource_uid"
5141 },
5142 "fieldConfig": {
5143 "defaults": {
@@ -5338,7 +5338,7 @@
5338 ],
5339 "datasource": {
5340 "type": "elasticsearch",
5341 - "uid": "wazuh_datasource_uid"
5341 + "uid": "replace_datasource_uid"
5342 },
5343 "metrics": [
5344 {
@@ -5359,7 +5359,7 @@
5359 {
5360 "datasource": {
5361 "type": "elasticsearch",
5362 - "uid": "wazuh_datasource_uid"
5362 + "uid": "replace_datasource_uid"
5363 },
5364 "fieldConfig": {
5365 "defaults": {
@@ -5480,7 +5480,7 @@
5480 ],
5481 "datasource": {
5482 "type": "elasticsearch",
5483 - "uid": "wazuh_datasource_uid"
5483 + "uid": "replace_datasource_uid"
5484 },
5485 "metrics": [
5486 {
@@ -5501,7 +5501,7 @@
5501 {
5502 "datasource": {
5503 "type": "elasticsearch",
5504 - "uid": "wazuh_datasource_uid"
5504 + "uid": "replace_datasource_uid"
5505 },
5506 "fieldConfig": {
5507 "defaults": {
@@ -5582,7 +5582,7 @@
5582 ],
5583 "datasource": {
5584 "type": "elasticsearch",
5585 - "uid": "wazuh_datasource_uid"
5585 + "uid": "replace_datasource_uid"
5586 },
5587 "metrics": [
5588 {
@@ -5607,7 +5607,7 @@
5607 "dashes": false,
5608 "datasource": {
5609 "type": "elasticsearch",
5610 - "uid": "wazuh_datasource_uid"
5610 + "uid": "replace_datasource_uid"
5611 },
5612 "fill": 1,
5613 "fillGradient": 0,
@@ -5675,7 +5675,7 @@
5675 ],
5676 "datasource": {
5677 "type": "elasticsearch",
5678 - "uid": "wazuh_datasource_uid"
5678 + "uid": "replace_datasource_uid"
5679 },
5680 "metrics": [
5681 {
@@ -5723,7 +5723,7 @@
5723 {
5724 "datasource": {
5725 "type": "elasticsearch",
5726 - "uid": "wazuh_datasource_uid"
5726 + "uid": "replace_datasource_uid"
5727 },
5728 "fieldConfig": {
5729 "defaults": {
@@ -5924,7 +5924,7 @@
5924 ],
5925 "datasource": {
5926 "type": "elasticsearch",
5927 - "uid": "wazuh_datasource_uid"
5927 + "uid": "replace_datasource_uid"
5928 },
5929 "metrics": [
5930 {
@@ -5945,7 +5945,7 @@
5945 {
5946 "datasource": {
5947 "type": "elasticsearch",
5948 - "uid": "wazuh_datasource_uid"
5948 + "uid": "replace_datasource_uid"
5949 },
5950 "fieldConfig": {
5951 "defaults": {
@@ -6026,7 +6026,7 @@
6026 ],
6027 "datasource": {
6028 "type": "elasticsearch",
6029 - "uid": "wazuh_datasource_uid"
6029 + "uid": "replace_datasource_uid"
6030 },
6031 "metrics": [
6032 {
@@ -6047,7 +6047,7 @@
6047 {
6048 "datasource": {
6049 "type": "elasticsearch",
6050 - "uid": "wazuh_datasource_uid"
6050 + "uid": "replace_datasource_uid"
6051 },
6052 "fieldConfig": {
6053 "defaults": {
@@ -6143,7 +6143,7 @@
6143 ],
6144 "datasource": {
6145 "type": "elasticsearch",
6146 - "uid": "wazuh_datasource_uid"
6146 + "uid": "replace_datasource_uid"
6147 },
6148 "metrics": [
6149 {
@@ -6164,7 +6164,7 @@
6164 {
6165 "datasource": {
6166 "type": "elasticsearch",
6167 - "uid": "wazuh_datasource_uid"
6167 + "uid": "replace_datasource_uid"
6168 },
6169 "fieldConfig": {
6170 "defaults": {
@@ -6271,7 +6271,7 @@
6271 ],
6272 "datasource": {
6273 "type": "elasticsearch",
6274 - "uid": "wazuh_datasource_uid"
6274 + "uid": "replace_datasource_uid"
6275 },
6276 "metrics": [
6277 {
@@ -6292,7 +6292,7 @@
6292 {
6293 "datasource": {
6294 "type": "elasticsearch",
6295 - "uid": "wazuh_datasource_uid"
6295 + "uid": "replace_datasource_uid"
6296 },
6297 "fieldConfig": {
6298 "defaults": {
@@ -6385,7 +6385,7 @@
6385 ],
6386 "datasource": {
6387 "type": "elasticsearch",
6388 - "uid": "wazuh_datasource_uid"
6388 + "uid": "replace_datasource_uid"
6389 },
6390 "metrics": [
6391 {
@@ -6406,7 +6406,7 @@
6406 {
6407 "datasource": {
6408 "type": "elasticsearch",
6409 - "uid": "wazuh_datasource_uid"
6409 + "uid": "replace_datasource_uid"
6410 },
6411 "fieldConfig": {
6412 "defaults": {
@@ -6655,7 +6655,7 @@
6655 "bucketAggs": [],
6656 "datasource": {
6657 "type": "elasticsearch",
6658 - "uid": "wazuh_datasource_uid"
6658 + "uid": "replace_datasource_uid"
6659 },
6660 "metrics": [
6661 {
@@ -6940,7 +6940,7 @@
6940 {
6941 "datasource": {
6942 "type": "elasticsearch",
6943 - "uid": "wazuh_datasource_uid"
6943 + "uid": "replace_datasource_uid"
6944 },
6945 "filters": [],
6946 "hide": 0,
@@ -6957,7 +6957,7 @@
6957 },
6958 "datasource": {
6959 "type": "elasticsearch",
6960 - "uid": "wazuh_datasource_uid"
6960 + "uid": "replace_datasource_uid"
6961 },
6962 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"(rule_group2:windows_defender OR rule_groups:yara OR rule_group2:windows_autoruns OR rule_group2:windows_sigcheck OR rule_group1:threat_intel)\"}",
6963 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_compliance.json
+40 -40
@@ -53,7 +53,7 @@
53 {
54 "datasource": {
55 "type": "elasticsearch",
56 - "uid": "wazuh_datasource_uid"
56 + "uid": "replace_datasource_uid"
57 },
58 "fieldConfig": {
59 "defaults": {
@@ -120,7 +120,7 @@
120 ],
121 "datasource": {
122 "type": "elasticsearch",
123 - "uid": "wazuh_datasource_uid"
123 + "uid": "replace_datasource_uid"
124 },
125 "metrics": [
126 {
@@ -141,7 +141,7 @@
141 {
142 "datasource": {
143 "type": "elasticsearch",
144 - "uid": "wazuh_datasource_uid"
144 + "uid": "replace_datasource_uid"
145 },
146 "fieldConfig": {
147 "defaults": {
@@ -387,7 +387,7 @@
387 ],
388 "datasource": {
389 "type": "elasticsearch",
390 - "uid": "wazuh_datasource_uid"
390 + "uid": "replace_datasource_uid"
391 },
392 "metrics": [
393 {
@@ -408,7 +408,7 @@
408 {
409 "datasource": {
410 "type": "elasticsearch",
411 - "uid": "wazuh_datasource_uid"
411 + "uid": "replace_datasource_uid"
412 },
413 "fieldConfig": {
414 "defaults": {
@@ -579,7 +579,7 @@
579 ],
580 "datasource": {
581 "type": "elasticsearch",
582 - "uid": "wazuh_datasource_uid"
582 + "uid": "replace_datasource_uid"
583 },
584 "metrics": [
585 {
@@ -600,7 +600,7 @@
600 {
601 "datasource": {
602 "type": "elasticsearch",
603 - "uid": "wazuh_datasource_uid"
603 + "uid": "replace_datasource_uid"
604 },
605 "fieldConfig": {
606 "defaults": {
@@ -682,7 +682,7 @@
682 ],
683 "datasource": {
684 "type": "elasticsearch",
685 - "uid": "wazuh_datasource_uid"
685 + "uid": "replace_datasource_uid"
686 },
687 "metrics": [
688 {
@@ -707,7 +707,7 @@
707 "dashes": false,
708 "datasource": {
709 "type": "elasticsearch",
710 - "uid": "wazuh_datasource_uid"
710 + "uid": "replace_datasource_uid"
711 },
712 "fill": 1,
713 "fillGradient": 0,
@@ -775,7 +775,7 @@
775 ],
776 "datasource": {
777 "type": "elasticsearch",
778 - "uid": "wazuh_datasource_uid"
778 + "uid": "replace_datasource_uid"
779 },
780 "metrics": [
781 {
@@ -823,7 +823,7 @@
823 {
824 "datasource": {
825 "type": "elasticsearch",
826 - "uid": "wazuh_datasource_uid"
826 + "uid": "replace_datasource_uid"
827 },
828 "fieldConfig": {
829 "defaults": {
@@ -1010,7 +1010,7 @@
1010 ],
1011 "datasource": {
1012 "type": "elasticsearch",
1013 - "uid": "wazuh_datasource_uid"
1013 + "uid": "replace_datasource_uid"
1014 },
1015 "metrics": [
1016 {
@@ -1266,7 +1266,7 @@
1266 "collapsed": true,
1267 "datasource": {
1268 "type": "elasticsearch",
1269 - "uid": "wazuh_datasource_uid"
1269 + "uid": "replace_datasource_uid"
1270 },
1271 "gridPos": {
1272 "h": 1,
@@ -1279,7 +1279,7 @@
1279 {
1280 "datasource": {
1281 "type": "elasticsearch",
1282 - "uid": "wazuh_datasource_uid"
1282 + "uid": "replace_datasource_uid"
1283 },
1284 "fieldConfig": {
1285 "defaults": {
@@ -1346,7 +1346,7 @@
1346 ],
1347 "datasource": {
1348 "type": "elasticsearch",
1349 - "uid": "wazuh_datasource_uid"
1349 + "uid": "replace_datasource_uid"
1350 },
1351 "metrics": [
1352 {
@@ -1367,7 +1367,7 @@
1367 {
1368 "datasource": {
1369 "type": "elasticsearch",
1370 - "uid": "wazuh_datasource_uid"
1370 + "uid": "replace_datasource_uid"
1371 },
1372 "fieldConfig": {
1373 "defaults": {
@@ -1613,7 +1613,7 @@
1613 ],
1614 "datasource": {
1615 "type": "elasticsearch",
1616 - "uid": "wazuh_datasource_uid"
1616 + "uid": "replace_datasource_uid"
1617 },
1618 "metrics": [
1619 {
@@ -1634,7 +1634,7 @@
1634 {
1635 "datasource": {
1636 "type": "elasticsearch",
1637 - "uid": "wazuh_datasource_uid"
1637 + "uid": "replace_datasource_uid"
1638 },
1639 "fieldConfig": {
1640 "defaults": {
@@ -1805,7 +1805,7 @@
1805 ],
1806 "datasource": {
1807 "type": "elasticsearch",
1808 - "uid": "wazuh_datasource_uid"
1808 + "uid": "replace_datasource_uid"
1809 },
1810 "metrics": [
1811 {
@@ -1826,7 +1826,7 @@
1826 {
1827 "datasource": {
1828 "type": "elasticsearch",
1829 - "uid": "wazuh_datasource_uid"
1829 + "uid": "replace_datasource_uid"
1830 },
1831 "fieldConfig": {
1832 "defaults": {
@@ -1908,7 +1908,7 @@
1908 ],
1909 "datasource": {
1910 "type": "elasticsearch",
1911 - "uid": "wazuh_datasource_uid"
1911 + "uid": "replace_datasource_uid"
1912 },
1913 "metrics": [
1914 {
@@ -1933,7 +1933,7 @@
1933 "dashes": false,
1934 "datasource": {
1935 "type": "elasticsearch",
1936 - "uid": "wazuh_datasource_uid"
1936 + "uid": "replace_datasource_uid"
1937 },
1938 "fill": 1,
1939 "fillGradient": 0,
@@ -2001,7 +2001,7 @@
2001 ],
2002 "datasource": {
2003 "type": "elasticsearch",
2004 - "uid": "wazuh_datasource_uid"
2004 + "uid": "replace_datasource_uid"
2005 },
2006 "metrics": [
2007 {
@@ -2049,7 +2049,7 @@
2049 {
2050 "datasource": {
2051 "type": "elasticsearch",
2052 - "uid": "wazuh_datasource_uid"
2052 + "uid": "replace_datasource_uid"
2053 },
2054 "fieldConfig": {
2055 "defaults": {
@@ -2236,7 +2236,7 @@
2236 ],
2237 "datasource": {
2238 "type": "elasticsearch",
2239 - "uid": "wazuh_datasource_uid"
2239 + "uid": "replace_datasource_uid"
2240 },
2241 "metrics": [
2242 {
@@ -2495,7 +2495,7 @@
2495 "collapsed": true,
2496 "datasource": {
2497 "type": "elasticsearch",
2498 - "uid": "wazuh_datasource_uid"
2498 + "uid": "replace_datasource_uid"
2499 },
2500 "gridPos": {
2501 "h": 1,
@@ -2508,7 +2508,7 @@
2508 {
2509 "datasource": {
2510 "type": "elasticsearch",
2511 - "uid": "wazuh_datasource_uid"
2511 + "uid": "replace_datasource_uid"
2512 },
2513 "fieldConfig": {
2514 "defaults": {
@@ -2574,7 +2574,7 @@
2574 ],
2575 "datasource": {
2576 "type": "elasticsearch",
2577 - "uid": "wazuh_datasource_uid"
2577 + "uid": "replace_datasource_uid"
2578 },
2579 "metrics": [
2580 {
@@ -2595,7 +2595,7 @@
2595 {
2596 "datasource": {
2597 "type": "elasticsearch",
2598 - "uid": "wazuh_datasource_uid"
2598 + "uid": "replace_datasource_uid"
2599 },
2600 "fieldConfig": {
2601 "defaults": {
@@ -2840,7 +2840,7 @@
2840 ],
2841 "datasource": {
2842 "type": "elasticsearch",
2843 - "uid": "wazuh_datasource_uid"
2843 + "uid": "replace_datasource_uid"
2844 },
2845 "metrics": [
2846 {
@@ -2861,7 +2861,7 @@
2861 {
2862 "datasource": {
2863 "type": "elasticsearch",
2864 - "uid": "wazuh_datasource_uid"
2864 + "uid": "replace_datasource_uid"
2865 },
2866 "fieldConfig": {
2867 "defaults": {
@@ -3028,7 +3028,7 @@
3028 ],
3029 "datasource": {
3030 "type": "elasticsearch",
3031 - "uid": "wazuh_datasource_uid"
3031 + "uid": "replace_datasource_uid"
3032 },
3033 "metrics": [
3034 {
@@ -3049,7 +3049,7 @@
3049 {
3050 "datasource": {
3051 "type": "elasticsearch",
3052 - "uid": "wazuh_datasource_uid"
3052 + "uid": "replace_datasource_uid"
3053 },
3054 "fieldConfig": {
3055 "defaults": {
@@ -3127,7 +3127,7 @@
3127 ],
3128 "datasource": {
3129 "type": "elasticsearch",
3130 - "uid": "wazuh_datasource_uid"
3130 + "uid": "replace_datasource_uid"
3131 },
3132 "metrics": [
3133 {
@@ -3152,7 +3152,7 @@
3152 "dashes": false,
3153 "datasource": {
3154 "type": "elasticsearch",
3155 - "uid": "wazuh_datasource_uid"
3155 + "uid": "replace_datasource_uid"
3156 },
3157 "fill": 1,
3158 "fillGradient": 0,
@@ -3220,7 +3220,7 @@
3220 ],
3221 "datasource": {
3222 "type": "elasticsearch",
3223 - "uid": "wazuh_datasource_uid"
3223 + "uid": "replace_datasource_uid"
3224 },
3225 "metrics": [
3226 {
@@ -3268,7 +3268,7 @@
3268 {
3269 "datasource": {
3270 "type": "elasticsearch",
3271 - "uid": "wazuh_datasource_uid"
3271 + "uid": "replace_datasource_uid"
3272 },
3273 "fieldConfig": {
3274 "defaults": {
@@ -3451,7 +3451,7 @@
3451 ],
3452 "datasource": {
3453 "type": "elasticsearch",
3454 - "uid": "wazuh_datasource_uid"
3454 + "uid": "replace_datasource_uid"
3455 },
3456 "metrics": [
3457 {
@@ -3720,7 +3720,7 @@
3720 {
3721 "datasource": {
3722 "type": "elasticsearch",
3723 - "uid": "wazuh_datasource_uid"
3723 + "uid": "replace_datasource_uid"
3724 },
3725 "filters": [],
3726 "hide": 0,
@@ -3737,7 +3737,7 @@
3737 },
3738 "datasource": {
3739 "type": "elasticsearch",
3740 - "uid": "wazuh_datasource_uid"
3740 + "uid": "replace_datasource_uid"
3741 },
3742 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"*\"}",
3743 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_dll_side_loading.json
+31 -31
@@ -43,7 +43,7 @@
43 {
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "fieldConfig": {
49 "defaults": {
@@ -127,7 +127,7 @@
127 {
128 "datasource": {
129 "type": "elasticsearch",
130 - "uid": "wazuh_datasource_uid"
130 + "uid": "replace_datasource_uid"
131 },
132 "fieldConfig": {
133 "defaults": {
@@ -216,7 +216,7 @@
216 ],
217 "datasource": {
218 "type": "elasticsearch",
219 - "uid": "wazuh_datasource_uid"
219 + "uid": "replace_datasource_uid"
220 },
221 "metrics": [
222 {
@@ -238,7 +238,7 @@
238 {
239 "datasource": {
240 "type": "elasticsearch",
241 - "uid": "wazuh_datasource_uid"
241 + "uid": "replace_datasource_uid"
242 },
243 "fieldConfig": {
244 "defaults": {
@@ -430,7 +430,7 @@
430 ],
431 "datasource": {
432 "type": "elasticsearch",
433 - "uid": "wazuh_datasource_uid"
433 + "uid": "replace_datasource_uid"
434 },
435 "metrics": [
436 {
@@ -474,7 +474,7 @@
474 {
475 "datasource": {
476 "type": "elasticsearch",
477 - "uid": "wazuh_datasource_uid"
477 + "uid": "replace_datasource_uid"
478 },
479 "fieldConfig": {
480 "defaults": {
@@ -558,7 +558,7 @@
558 {
559 "datasource": {
560 "type": "elasticsearch",
561 - "uid": "wazuh_datasource_uid"
561 + "uid": "replace_datasource_uid"
562 },
563 "fieldConfig": {
564 "defaults": {
@@ -643,7 +643,7 @@
643 ],
644 "datasource": {
645 "type": "elasticsearch",
646 - "uid": "wazuh_datasource_uid"
646 + "uid": "replace_datasource_uid"
647 },
648 "metrics": [
649 {
@@ -665,7 +665,7 @@
665 {
666 "datasource": {
667 "type": "elasticsearch",
668 - "uid": "wazuh_datasource_uid"
668 + "uid": "replace_datasource_uid"
669 },
670 "fieldConfig": {
671 "defaults": {
@@ -745,7 +745,7 @@
745 ],
746 "datasource": {
747 "type": "elasticsearch",
748 - "uid": "wazuh_datasource_uid"
748 + "uid": "replace_datasource_uid"
749 },
750 "metrics": [
751 {
@@ -767,7 +767,7 @@
767 {
768 "datasource": {
769 "type": "elasticsearch",
770 - "uid": "wazuh_datasource_uid"
770 + "uid": "replace_datasource_uid"
771 },
772 "fieldConfig": {
773 "defaults": {
@@ -831,7 +831,7 @@
831 ],
832 "datasource": {
833 "type": "elasticsearch",
834 - "uid": "wazuh_datasource_uid"
834 + "uid": "replace_datasource_uid"
835 },
836 "metrics": [
837 {
@@ -853,7 +853,7 @@
853 {
854 "datasource": {
855 "type": "elasticsearch",
856 - "uid": "wazuh_datasource_uid"
856 + "uid": "replace_datasource_uid"
857 },
858 "fieldConfig": {
859 "defaults": {
@@ -943,7 +943,7 @@
943 ],
944 "datasource": {
945 "type": "elasticsearch",
946 - "uid": "wazuh_datasource_uid"
946 + "uid": "replace_datasource_uid"
947 },
948 "metrics": [
949 {
@@ -962,7 +962,7 @@
962 {
963 "datasource": {
964 "type": "elasticsearch",
965 - "uid": "wazuh_datasource_uid"
965 + "uid": "replace_datasource_uid"
966 },
967 "fieldConfig": {
968 "defaults": {
@@ -1044,7 +1044,7 @@
1044 {
1045 "datasource": {
1046 "type": "elasticsearch",
1047 - "uid": "wazuh_datasource_uid"
1047 + "uid": "replace_datasource_uid"
1048 },
1049 "fieldConfig": {
1050 "defaults": {
@@ -1139,7 +1139,7 @@
1139 ],
1140 "datasource": {
1141 "type": "elasticsearch",
1142 - "uid": "wazuh_datasource_uid"
1142 + "uid": "replace_datasource_uid"
1143 },
1144 "metrics": [
1145 {
@@ -1159,7 +1159,7 @@
1159 {
1160 "datasource": {
1161 "type": "elasticsearch",
1162 - "uid": "wazuh_datasource_uid"
1162 + "uid": "replace_datasource_uid"
1163 },
1164 "fieldConfig": {
1165 "defaults": {
@@ -1249,7 +1249,7 @@
1249 {
1250 "datasource": {
1251 "type": "elasticsearch",
1252 - "uid": "wazuh_datasource_uid"
1252 + "uid": "replace_datasource_uid"
1253 },
1254 "fieldConfig": {
1255 "defaults": {
@@ -1348,7 +1348,7 @@
1348 {
1349 "datasource": {
1350 "type": "elasticsearch",
1351 - "uid": "wazuh_datasource_uid"
1351 + "uid": "replace_datasource_uid"
1352 },
1353 "fieldConfig": {
1354 "defaults": {
@@ -1438,7 +1438,7 @@
1438 {
1439 "datasource": {
1440 "type": "elasticsearch",
1441 - "uid": "wazuh_datasource_uid"
1441 + "uid": "replace_datasource_uid"
1442 },
1443 "fieldConfig": {
1444 "defaults": {
@@ -1565,7 +1565,7 @@
1565 "bucketAggs": [],
1566 "datasource": {
1567 "type": "elasticsearch",
1568 - "uid": "wazuh_datasource_uid"
1568 + "uid": "replace_datasource_uid"
1569 },
1570 "metrics": [
1571 {
@@ -1837,7 +1837,7 @@
1837 {
1838 "datasource": {
1839 "type": "elasticsearch",
1840 - "uid": "wazuh_datasource_uid"
1840 + "uid": "replace_datasource_uid"
1841 },
1842 "filters": [],
1843 "hide": 0,
@@ -1854,7 +1854,7 @@
1854 },
1855 "datasource": {
1856 "type": "elasticsearch",
1857 - "uid": "wazuh_datasource_uid"
1857 + "uid": "replace_datasource_uid"
1858 },
1859 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_group3:sysmon_event7\"}",
1860 "hide": 0,
@@ -1882,7 +1882,7 @@
1882 },
1883 "datasource": {
1884 "type": "elasticsearch",
1885 - "uid": "wazuh_datasource_uid"
1885 + "uid": "replace_datasource_uid"
1886 },
1887 "definition": "{ \"find\": \"terms\", \"field\": \"process_name\", \"query\": \"rule_group3:sysmon_event7\"}",
1888 "hide": 2,
@@ -1909,7 +1909,7 @@
1909 },
1910 "datasource": {
1911 "type": "elasticsearch",
1912 - "uid": "wazuh_datasource_uid"
1912 + "uid": "replace_datasource_uid"
1913 },
1914 "definition": "{ \"find\": \"terms\", \"field\": \"parent_cmd_line\", \"query\": \"rule_group3:sysmon_event7\"}",
1915 "hide": 2,
@@ -1936,7 +1936,7 @@
1936 },
1937 "datasource": {
1938 "type": "elasticsearch",
1939 - "uid": "wazuh_datasource_uid"
1939 + "uid": "replace_datasource_uid"
1940 },
1941 "definition": "{ \"find\": \"terms\", \"field\": \"parent_process_id\", \"query\": \"rule_group3:sysmon_event7\"}",
1942 "hide": 2,
@@ -1963,7 +1963,7 @@
1963 },
1964 "datasource": {
1965 "type": "elasticsearch",
1966 - "uid": "wazuh_datasource_uid"
1966 + "uid": "replace_datasource_uid"
1967 },
1968 "definition": "{ \"find\": \"terms\", \"field\": \"parent_process_image\", \"query\": \"rule_group3:sysmon_event7\"}",
1969 "hide": 2,
@@ -1989,7 +1989,7 @@
1989 },
1990 "datasource": {
1991 "type": "elasticsearch",
1992 - "uid": "wazuh_datasource_uid"
1992 + "uid": "replace_datasource_uid"
1993 },
1994 "definition": "{ \"find\": \"terms\", \"field\": \"process_image\", \"query\": \"rule_group3:sysmon_event7\"}",
1995 "hide": 2,
@@ -2016,7 +2016,7 @@
2016 },
2017 "datasource": {
2018 "type": "elasticsearch",
2019 - "uid": "wazuh_datasource_uid"
2019 + "uid": "replace_datasource_uid"
2020 },
2021 "definition": "{ \"find\": \"terms\", \"field\": \"process_cmd_line\", \"query\": \"rule_group3:sysmon_event7\"}",
2022 "hide": 2,
@@ -2042,7 +2042,7 @@
2042 },
2043 "datasource": {
2044 "type": "elasticsearch",
2045 - "uid": "wazuh_datasource_uid"
2045 + "uid": "replace_datasource_uid"
2046 },
2047 "definition": "{ \"find\": \"terms\", \"field\": \"process_id\", \"query\": \"rule_group3:sysmon_event7\"}",
2048 "hide": 2,
backend/app/connectors/grafana/dashboards/Wazuh/edr_dns_requests.json
+21 -21
@@ -44,7 +44,7 @@
44 "collapsed": false,
45 "datasource": {
46 "type": "elasticsearch",
47 - "uid": "wazuh_datasource_uid"
47 + "uid": "replace_datasource_uid"
48 },
49 "gridPos": {
50 "h": 1,
@@ -60,7 +60,7 @@
60 {
61 "datasource": {
62 "type": "elasticsearch",
63 - "uid": "wazuh_datasource_uid"
63 + "uid": "replace_datasource_uid"
64 },
65 "fieldConfig": {
66 "defaults": {
@@ -126,7 +126,7 @@
126 ],
127 "datasource": {
128 "type": "elasticsearch",
129 - "uid": "wazuh_datasource_uid"
129 + "uid": "replace_datasource_uid"
130 },
131 "metrics": [
132 {
@@ -147,7 +147,7 @@
147 "columns": [],
148 "datasource": {
149 "type": "elasticsearch",
150 - "uid": "wazuh_datasource_uid"
150 + "uid": "replace_datasource_uid"
151 },
152 "fontSize": "100%",
153 "gridPos": {
@@ -216,7 +216,7 @@
216 ],
217 "datasource": {
218 "type": "elasticsearch",
219 - "uid": "wazuh_datasource_uid"
219 + "uid": "replace_datasource_uid"
220 },
221 "metrics": [
222 {
@@ -237,7 +237,7 @@
237 {
238 "datasource": {
239 "type": "elasticsearch",
240 - "uid": "wazuh_datasource_uid"
240 + "uid": "replace_datasource_uid"
241 },
242 "fieldConfig": {
243 "defaults": {
@@ -333,7 +333,7 @@
333 ],
334 "datasource": {
335 "type": "elasticsearch",
336 - "uid": "wazuh_datasource_uid"
336 + "uid": "replace_datasource_uid"
337 },
338 "metrics": [
339 {
@@ -353,7 +353,7 @@
353 {
354 "datasource": {
355 "type": "elasticsearch",
356 - "uid": "wazuh_datasource_uid"
356 + "uid": "replace_datasource_uid"
357 },
358 "fieldConfig": {
359 "defaults": {
@@ -433,7 +433,7 @@
433 ],
434 "datasource": {
435 "type": "elasticsearch",
436 - "uid": "wazuh_datasource_uid"
436 + "uid": "replace_datasource_uid"
437 },
438 "metrics": [
439 {
@@ -456,7 +456,7 @@
456 {
457 "datasource": {
458 "type": "elasticsearch",
459 - "uid": "wazuh_datasource_uid"
459 + "uid": "replace_datasource_uid"
460 },
461 "fieldConfig": {
462 "defaults": {
@@ -532,7 +532,7 @@
532 ],
533 "datasource": {
534 "type": "elasticsearch",
535 - "uid": "wazuh_datasource_uid"
535 + "uid": "replace_datasource_uid"
536 },
537 "metrics": [
538 {
@@ -555,7 +555,7 @@
555 {
556 "datasource": {
557 "type": "elasticsearch",
558 - "uid": "wazuh_datasource_uid"
558 + "uid": "replace_datasource_uid"
559 },
560 "fieldConfig": {
561 "defaults": {
@@ -628,7 +628,7 @@
628 ],
629 "datasource": {
630 "type": "elasticsearch",
631 - "uid": "wazuh_datasource_uid"
631 + "uid": "replace_datasource_uid"
632 },
633 "metrics": [
634 {
@@ -651,7 +651,7 @@
651 {
652 "datasource": {
653 "type": "elasticsearch",
654 - "uid": "wazuh_datasource_uid"
654 + "uid": "replace_datasource_uid"
655 },
656 "fieldConfig": {
657 "defaults": {
@@ -727,7 +727,7 @@
727 ],
728 "datasource": {
729 "type": "elasticsearch",
730 - "uid": "wazuh_datasource_uid"
730 + "uid": "replace_datasource_uid"
731 },
732 "metrics": [
733 {
@@ -750,7 +750,7 @@
750 {
751 "datasource": {
752 "type": "elasticsearch",
753 - "uid": "wazuh_datasource_uid"
753 + "uid": "replace_datasource_uid"
754 },
755 "fieldConfig": {
756 "defaults": {
@@ -822,7 +822,7 @@
822 ],
823 "datasource": {
824 "type": "elasticsearch",
825 - "uid": "wazuh_datasource_uid"
825 + "uid": "replace_datasource_uid"
826 },
827 "metrics": [
828 {
@@ -845,7 +845,7 @@
845 {
846 "datasource": {
847 "type": "elasticsearch",
848 - "uid": "wazuh_datasource_uid"
848 + "uid": "replace_datasource_uid"
849 },
850 "fieldConfig": {
851 "defaults": {
@@ -1149,7 +1149,7 @@
1149 "bucketAggs": [],
1150 "datasource": {
1151 "type": "elasticsearch",
1152 - "uid": "wazuh_datasource_uid"
1152 + "uid": "replace_datasource_uid"
1153 },
1154 "metrics": [
1155 {
@@ -1220,7 +1220,7 @@
1220 {
1221 "datasource": {
1222 "type": "elasticsearch",
1223 - "uid": "wazuh_datasource_uid"
1223 + "uid": "replace_datasource_uid"
1224 },
1225 "filters": [],
1226 "hide": 0,
@@ -1237,7 +1237,7 @@
1237 },
1238 "datasource": {
1239 "type": "elasticsearch",
1240 - "uid": "wazuh_datasource_uid"
1240 + "uid": "replace_datasource_uid"
1241 },
1242 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_group3:sysmon_event_22 OR rule_group3:dns OR rule_group1:dnsstat\"}",
1243 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_docker_monitoring.json
+19 -19
@@ -42,7 +42,7 @@
42 {
43 "datasource": {
44 "type": "elasticsearch",
45 - "uid": "wazuh_datasource_uid"
45 + "uid": "replace_datasource_uid"
46 },
47 "fieldConfig": {
48 "defaults": {
@@ -110,7 +110,7 @@
110 ],
111 "datasource": {
112 "type": "elasticsearch",
113 - "uid": "wazuh_datasource_uid"
113 + "uid": "replace_datasource_uid"
114 },
115 "metrics": [
116 {
@@ -133,7 +133,7 @@
133 {
134 "datasource": {
135 "type": "elasticsearch",
136 - "uid": "wazuh_datasource_uid"
136 + "uid": "replace_datasource_uid"
137 },
138 "fieldConfig": {
139 "defaults": {
@@ -229,7 +229,7 @@
229 ],
230 "datasource": {
231 "type": "elasticsearch",
232 - "uid": "wazuh_datasource_uid"
232 + "uid": "replace_datasource_uid"
233 },
234 "metrics": [
235 {
@@ -249,7 +249,7 @@
249 {
250 "datasource": {
251 "type": "elasticsearch",
252 - "uid": "wazuh_datasource_uid"
252 + "uid": "replace_datasource_uid"
253 },
254 "fieldConfig": {
255 "defaults": {
@@ -316,7 +316,7 @@
316 ],
317 "datasource": {
318 "type": "elasticsearch",
319 - "uid": "wazuh_datasource_uid"
319 + "uid": "replace_datasource_uid"
320 },
321 "metrics": [
322 {
@@ -337,7 +337,7 @@
337 {
338 "datasource": {
339 "type": "elasticsearch",
340 - "uid": "wazuh_datasource_uid"
340 + "uid": "replace_datasource_uid"
341 },
342 "fieldConfig": {
343 "defaults": {
@@ -567,7 +567,7 @@
567 ],
568 "datasource": {
569 "type": "elasticsearch",
570 - "uid": "wazuh_datasource_uid"
570 + "uid": "replace_datasource_uid"
571 },
572 "metrics": [
573 {
@@ -590,7 +590,7 @@
590 {
591 "datasource": {
592 "type": "elasticsearch",
593 - "uid": "wazuh_datasource_uid"
593 + "uid": "replace_datasource_uid"
594 },
595 "fieldConfig": {
596 "defaults": {
@@ -686,7 +686,7 @@
686 ],
687 "datasource": {
688 "type": "elasticsearch",
689 - "uid": "wazuh_datasource_uid"
689 + "uid": "replace_datasource_uid"
690 },
691 "metrics": [
692 {
@@ -705,7 +705,7 @@
705 {
706 "datasource": {
707 "type": "elasticsearch",
708 - "uid": "wazuh_datasource_uid"
708 + "uid": "replace_datasource_uid"
709 },
710 "fieldConfig": {
711 "defaults": {
@@ -1187,7 +1187,7 @@
1187 ],
1188 "datasource": {
1189 "type": "elasticsearch",
1190 - "uid": "wazuh_datasource_uid"
1190 + "uid": "replace_datasource_uid"
1191 },
1192 "metrics": [
1193 {
@@ -1222,7 +1222,7 @@
1222 {
1223 "datasource": {
1224 "type": "elasticsearch",
1225 - "uid": "wazuh_datasource_uid"
1225 + "uid": "replace_datasource_uid"
1226 },
1227 "fieldConfig": {
1228 "defaults": {
@@ -1318,7 +1318,7 @@
1318 ],
1319 "datasource": {
1320 "type": "elasticsearch",
1321 - "uid": "wazuh_datasource_uid"
1321 + "uid": "replace_datasource_uid"
1322 },
1323 "metrics": [
1324 {
@@ -1338,7 +1338,7 @@
1338 {
1339 "datasource": {
1340 "type": "elasticsearch",
1341 - "uid": "wazuh_datasource_uid"
1341 + "uid": "replace_datasource_uid"
1342 },
1343 "fieldConfig": {
1344 "defaults": {
@@ -1634,7 +1634,7 @@
1634 "bucketAggs": [],
1635 "datasource": {
1636 "type": "elasticsearch",
1637 - "uid": "wazuh_datasource_uid"
1637 + "uid": "replace_datasource_uid"
1638 },
1639 "metrics": [
1640 {
@@ -2164,7 +2164,7 @@
2164 {
2165 "datasource": {
2166 "type": "elasticsearch",
2167 - "uid": "wazuh_datasource_uid"
2167 + "uid": "replace_datasource_uid"
2168 },
2169 "filters": [],
2170 "hide": 0,
@@ -2181,7 +2181,7 @@
2181 },
2182 "datasource": {
2183 "type": "elasticsearch",
2184 - "uid": "wazuh_datasource_uid"
2184 + "uid": "replace_datasource_uid"
2185 },
2186 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_group1:docker\"}",
2187 "hide": 0,
@@ -2208,7 +2208,7 @@
2208 },
2209 "datasource": {
2210 "type": "elasticsearch",
2211 - "uid": "wazuh_datasource_uid"
2211 + "uid": "replace_datasource_uid"
2212 },
2213 "definition": "{ \"find\": \"terms\", \"field\": \"rule_level\", \"query\": \"rule_group1:docker\"}",
2214 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_fim.json
+59 -59
@@ -59,7 +59,7 @@
59 {
60 "datasource": {
61 "type": "elasticsearch",
62 - "uid": "wazuh_datasource_uid"
62 + "uid": "replace_datasource_uid"
63 },
64 "fieldConfig": {
65 "defaults": {
@@ -126,7 +126,7 @@
126 ],
127 "datasource": {
128 "type": "elasticsearch",
129 - "uid": "wazuh_datasource_uid"
129 + "uid": "replace_datasource_uid"
130 },
131 "metrics": [
132 {
@@ -147,7 +147,7 @@
147 {
148 "datasource": {
149 "type": "elasticsearch",
150 - "uid": "wazuh_datasource_uid"
150 + "uid": "replace_datasource_uid"
151 },
152 "fieldConfig": {
153 "defaults": {
@@ -371,7 +371,7 @@
371 ],
372 "datasource": {
373 "type": "elasticsearch",
374 - "uid": "wazuh_datasource_uid"
374 + "uid": "replace_datasource_uid"
375 },
376 "metrics": [
377 {
@@ -407,7 +407,7 @@
407 {
408 "datasource": {
409 "type": "elasticsearch",
410 - "uid": "wazuh_datasource_uid"
410 + "uid": "replace_datasource_uid"
411 },
412 "fieldConfig": {
413 "defaults": {
@@ -474,7 +474,7 @@
474 ],
475 "datasource": {
476 "type": "elasticsearch",
477 - "uid": "wazuh_datasource_uid"
477 + "uid": "replace_datasource_uid"
478 },
479 "metrics": [
480 {
@@ -495,7 +495,7 @@
495 {
496 "datasource": {
497 "type": "elasticsearch",
498 - "uid": "wazuh_datasource_uid"
498 + "uid": "replace_datasource_uid"
499 },
500 "fieldConfig": {
501 "defaults": {
@@ -786,7 +786,7 @@
786 ],
787 "datasource": {
788 "type": "elasticsearch",
789 - "uid": "wazuh_datasource_uid"
789 + "uid": "replace_datasource_uid"
790 },
791 "metrics": [
792 {
@@ -807,7 +807,7 @@
807 {
808 "datasource": {
809 "type": "elasticsearch",
810 - "uid": "wazuh_datasource_uid"
810 + "uid": "replace_datasource_uid"
811 },
812 "fieldConfig": {
813 "defaults": {
@@ -1028,7 +1028,7 @@
1028 ],
1029 "datasource": {
1030 "type": "elasticsearch",
1031 - "uid": "wazuh_datasource_uid"
1031 + "uid": "replace_datasource_uid"
1032 },
1033 "metrics": [
1034 {
@@ -1062,7 +1062,7 @@
1062 {
1063 "datasource": {
1064 "type": "elasticsearch",
1065 - "uid": "wazuh_datasource_uid"
1065 + "uid": "replace_datasource_uid"
1066 },
1067 "fieldConfig": {
1068 "defaults": {
@@ -1144,7 +1144,7 @@
1144 ],
1145 "datasource": {
1146 "type": "elasticsearch",
1147 - "uid": "wazuh_datasource_uid"
1147 + "uid": "replace_datasource_uid"
1148 },
1149 "metrics": [
1150 {
@@ -1181,7 +1181,7 @@
1181 "dashes": false,
1182 "datasource": {
1183 "type": "elasticsearch",
1184 - "uid": "wazuh_datasource_uid"
1184 + "uid": "replace_datasource_uid"
1185 },
1186 "fill": 1,
1187 "fillGradient": 0,
@@ -1249,7 +1249,7 @@
1249 ],
1250 "datasource": {
1251 "type": "elasticsearch",
1252 - "uid": "wazuh_datasource_uid"
1252 + "uid": "replace_datasource_uid"
1253 },
1254 "metrics": [
1255 {
@@ -1297,7 +1297,7 @@
1297 {
1298 "datasource": {
1299 "type": "elasticsearch",
1300 - "uid": "wazuh_datasource_uid"
1300 + "uid": "replace_datasource_uid"
1301 },
1302 "fieldConfig": {
1303 "defaults": {
@@ -1508,7 +1508,7 @@
1508 "bucketAggs": [],
1509 "datasource": {
1510 "type": "elasticsearch",
1511 - "uid": "wazuh_datasource_uid"
1511 + "uid": "replace_datasource_uid"
1512 },
1513 "metrics": [
1514 {
@@ -1790,7 +1790,7 @@
1790 {
1791 "datasource": {
1792 "type": "elasticsearch",
1793 - "uid": "wazuh_datasource_uid"
1793 + "uid": "replace_datasource_uid"
1794 },
1795 "fieldConfig": {
1796 "defaults": {
@@ -1857,7 +1857,7 @@
1857 ],
1858 "datasource": {
1859 "type": "elasticsearch",
1860 - "uid": "wazuh_datasource_uid"
1860 + "uid": "replace_datasource_uid"
1861 },
1862 "metrics": [
1863 {
@@ -1878,7 +1878,7 @@
1878 {
1879 "datasource": {
1880 "type": "elasticsearch",
1881 - "uid": "wazuh_datasource_uid"
1881 + "uid": "replace_datasource_uid"
1882 },
1883 "fieldConfig": {
1884 "defaults": {
@@ -1960,7 +1960,7 @@
1960 ],
1961 "datasource": {
1962 "type": "elasticsearch",
1963 - "uid": "wazuh_datasource_uid"
1963 + "uid": "replace_datasource_uid"
1964 },
1965 "metrics": [
1966 {
@@ -1993,7 +1993,7 @@
1993 {
1994 "datasource": {
1995 "type": "elasticsearch",
1996 - "uid": "wazuh_datasource_uid"
1996 + "uid": "replace_datasource_uid"
1997 },
1998 "fieldConfig": {
1999 "defaults": {
@@ -2107,7 +2107,7 @@
2107 ],
2108 "datasource": {
2109 "type": "elasticsearch",
2110 - "uid": "wazuh_datasource_uid"
2110 + "uid": "replace_datasource_uid"
2111 },
2112 "metrics": [
2113 {
@@ -2126,7 +2126,7 @@
2126 {
2127 "datasource": {
2128 "type": "elasticsearch",
2129 - "uid": "wazuh_datasource_uid"
2129 + "uid": "replace_datasource_uid"
2130 },
2131 "fieldConfig": {
2132 "defaults": {
@@ -2280,7 +2280,7 @@
2280 ],
2281 "datasource": {
2282 "type": "elasticsearch",
2283 - "uid": "wazuh_datasource_uid"
2283 + "uid": "replace_datasource_uid"
2284 },
2285 "metrics": [
2286 {
@@ -2313,7 +2313,7 @@
2313 {
2314 "datasource": {
2315 "type": "elasticsearch",
2316 - "uid": "wazuh_datasource_uid"
2316 + "uid": "replace_datasource_uid"
2317 },
2318 "fieldConfig": {
2319 "defaults": {
@@ -2467,7 +2467,7 @@
2467 ],
2468 "datasource": {
2469 "type": "elasticsearch",
2470 - "uid": "wazuh_datasource_uid"
2470 + "uid": "replace_datasource_uid"
2471 },
2472 "metrics": [
2473 {
@@ -2501,7 +2501,7 @@
2501 {
2502 "datasource": {
2503 "type": "elasticsearch",
2504 - "uid": "wazuh_datasource_uid"
2504 + "uid": "replace_datasource_uid"
2505 },
2506 "fieldConfig": {
2507 "defaults": {
@@ -2668,7 +2668,7 @@
2668 ],
2669 "datasource": {
2670 "type": "elasticsearch",
2671 - "uid": "wazuh_datasource_uid"
2671 + "uid": "replace_datasource_uid"
2672 },
2673 "metrics": [
2674 {
@@ -2699,7 +2699,7 @@
2699 ],
2700 "datasource": {
2701 "type": "elasticsearch",
2702 - "uid": "wazuh_datasource_uid"
2702 + "uid": "replace_datasource_uid"
2703 },
2704 "hide": false,
2705 "metrics": [
@@ -2733,7 +2733,7 @@
2733 {
2734 "datasource": {
2735 "type": "elasticsearch",
2736 - "uid": "wazuh_datasource_uid"
2736 + "uid": "replace_datasource_uid"
2737 },
2738 "fieldConfig": {
2739 "defaults": {
@@ -2930,7 +2930,7 @@
2930 "bucketAggs": [],
2931 "datasource": {
2932 "type": "elasticsearch",
2933 - "uid": "wazuh_datasource_uid"
2933 + "uid": "replace_datasource_uid"
2934 },
2935 "metrics": [
2936 {
@@ -3345,7 +3345,7 @@
3345 {
3346 "datasource": {
3347 "type": "elasticsearch",
3348 - "uid": "wazuh_datasource_uid"
3348 + "uid": "replace_datasource_uid"
3349 },
3350 "fieldConfig": {
3351 "defaults": {
@@ -3412,7 +3412,7 @@
3412 ],
3413 "datasource": {
3414 "type": "elasticsearch",
3415 - "uid": "wazuh_datasource_uid"
3415 + "uid": "replace_datasource_uid"
3416 },
3417 "metrics": [
3418 {
@@ -3433,7 +3433,7 @@
3433 {
3434 "datasource": {
3435 "type": "elasticsearch",
3436 - "uid": "wazuh_datasource_uid"
3436 + "uid": "replace_datasource_uid"
3437 },
3438 "fieldConfig": {
3439 "defaults": {
@@ -3515,7 +3515,7 @@
3515 ],
3516 "datasource": {
3517 "type": "elasticsearch",
3518 - "uid": "wazuh_datasource_uid"
3518 + "uid": "replace_datasource_uid"
3519 },
3520 "metrics": [
3521 {
@@ -3548,7 +3548,7 @@
3548 {
3549 "datasource": {
3550 "type": "elasticsearch",
3551 - "uid": "wazuh_datasource_uid"
3551 + "uid": "replace_datasource_uid"
3552 },
3553 "fieldConfig": {
3554 "defaults": {
@@ -3616,7 +3616,7 @@
3616 ],
3617 "datasource": {
3618 "type": "elasticsearch",
3619 - "uid": "wazuh_datasource_uid"
3619 + "uid": "replace_datasource_uid"
3620 },
3621 "metrics": [
3622 {
@@ -3635,7 +3635,7 @@
3635 {
3636 "datasource": {
3637 "type": "elasticsearch",
3638 - "uid": "wazuh_datasource_uid"
3638 + "uid": "replace_datasource_uid"
3639 },
3640 "fieldConfig": {
3641 "defaults": {
@@ -3789,7 +3789,7 @@
3789 ],
3790 "datasource": {
3791 "type": "elasticsearch",
3792 - "uid": "wazuh_datasource_uid"
3792 + "uid": "replace_datasource_uid"
3793 },
3794 "metrics": [
3795 {
@@ -3822,7 +3822,7 @@
3822 {
3823 "datasource": {
3824 "type": "elasticsearch",
3825 - "uid": "wazuh_datasource_uid"
3825 + "uid": "replace_datasource_uid"
3826 },
3827 "fieldConfig": {
3828 "defaults": {
@@ -3976,7 +3976,7 @@
3976 ],
3977 "datasource": {
3978 "type": "elasticsearch",
3979 - "uid": "wazuh_datasource_uid"
3979 + "uid": "replace_datasource_uid"
3980 },
3981 "metrics": [
3982 {
@@ -4010,7 +4010,7 @@
4010 {
4011 "datasource": {
4012 "type": "elasticsearch",
4013 - "uid": "wazuh_datasource_uid"
4013 + "uid": "replace_datasource_uid"
4014 },
4015 "fieldConfig": {
4016 "defaults": {
@@ -4176,7 +4176,7 @@
4176 ],
4177 "datasource": {
4178 "type": "elasticsearch",
4179 - "uid": "wazuh_datasource_uid"
4179 + "uid": "replace_datasource_uid"
4180 },
4181 "metrics": [
4182 {
@@ -4211,7 +4211,7 @@
4211 {
4212 "datasource": {
4213 "type": "elasticsearch",
4214 - "uid": "wazuh_datasource_uid"
4214 + "uid": "replace_datasource_uid"
4215 },
4216 "fieldConfig": {
4217 "defaults": {
@@ -4396,7 +4396,7 @@
4396 "bucketAggs": [],
4397 "datasource": {
4398 "type": "elasticsearch",
4399 - "uid": "wazuh_datasource_uid"
4399 + "uid": "replace_datasource_uid"
4400 },
4401 "metrics": [
4402 {
@@ -4873,7 +4873,7 @@
4873 {
4874 "datasource": {
4875 "type": "elasticsearch",
4876 - "uid": "wazuh_datasource_uid"
4876 + "uid": "replace_datasource_uid"
4877 },
4878 "fieldConfig": {
4879 "defaults": {
@@ -4940,7 +4940,7 @@
4940 ],
4941 "datasource": {
4942 "type": "elasticsearch",
4943 - "uid": "wazuh_datasource_uid"
4943 + "uid": "replace_datasource_uid"
4944 },
4945 "metrics": [
4946 {
@@ -4961,7 +4961,7 @@
4961 {
4962 "datasource": {
4963 "type": "elasticsearch",
4964 - "uid": "wazuh_datasource_uid"
4964 + "uid": "replace_datasource_uid"
4965 },
4966 "fieldConfig": {
4967 "defaults": {
@@ -5043,7 +5043,7 @@
5043 ],
5044 "datasource": {
5045 "type": "elasticsearch",
5046 - "uid": "wazuh_datasource_uid"
5046 + "uid": "replace_datasource_uid"
5047 },
5048 "metrics": [
5049 {
@@ -5076,7 +5076,7 @@
5076 {
5077 "datasource": {
5078 "type": "elasticsearch",
5079 - "uid": "wazuh_datasource_uid"
5079 + "uid": "replace_datasource_uid"
5080 },
5081 "fieldConfig": {
5082 "defaults": {
@@ -5277,7 +5277,7 @@
5277 ],
5278 "datasource": {
5279 "type": "elasticsearch",
5280 - "uid": "wazuh_datasource_uid"
5280 + "uid": "replace_datasource_uid"
5281 },
5282 "metrics": [
5283 {
@@ -5298,7 +5298,7 @@
5298 {
5299 "datasource": {
5300 "type": "elasticsearch",
5301 - "uid": "wazuh_datasource_uid"
5301 + "uid": "replace_datasource_uid"
5302 },
5303 "fieldConfig": {
5304 "defaults": {
@@ -5379,7 +5379,7 @@
5379 ],
5380 "datasource": {
5381 "type": "elasticsearch",
5382 - "uid": "wazuh_datasource_uid"
5382 + "uid": "replace_datasource_uid"
5383 },
5384 "metrics": [
5385 {
@@ -5412,7 +5412,7 @@
5412 {
5413 "datasource": {
5414 "type": "elasticsearch",
5415 - "uid": "wazuh_datasource_uid"
5415 + "uid": "replace_datasource_uid"
5416 },
5417 "fieldConfig": {
5418 "defaults": {
@@ -5546,7 +5546,7 @@
5546 ],
5547 "datasource": {
5548 "type": "elasticsearch",
5549 - "uid": "wazuh_datasource_uid"
5549 + "uid": "replace_datasource_uid"
5550 },
5551 "metrics": [
5552 {
@@ -5579,7 +5579,7 @@
5579 {
5580 "datasource": {
5581 "type": "elasticsearch",
5582 - "uid": "wazuh_datasource_uid"
5582 + "uid": "replace_datasource_uid"
5583 },
5584 "fieldConfig": {
5585 "defaults": {
@@ -5850,7 +5850,7 @@
5850 "bucketAggs": [],
5851 "datasource": {
5852 "type": "elasticsearch",
5853 - "uid": "wazuh_datasource_uid"
5853 + "uid": "replace_datasource_uid"
5854 },
5855 "metrics": [
5856 {
@@ -6187,7 +6187,7 @@
6187 {
6188 "datasource": {
6189 "type": "elasticsearch",
6190 - "uid": "wazuh_datasource_uid"
6190 + "uid": "replace_datasource_uid"
6191 },
6192 "filters": [],
6193 "hide": 0,
@@ -6204,7 +6204,7 @@
6204 },
6205 "datasource": {
6206 "type": "elasticsearch",
6207 - "uid": "wazuh_datasource_uid"
6207 + "uid": "replace_datasource_uid"
6208 },
6209 "definition": "{ \"find\": \"terms\", \"field\": \"rule_level\", \"query\": \"(rule_group2:syscheck OR rule_group3:sysmon_event_11 OR rule_group3:sysmon_event_12 OR rule_group3:sysmon_event_15 OR rule_group3:sysmon_event_13)\"}",
6210 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_mitre.json
+19 -19
@@ -43,7 +43,7 @@
43 {
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "fieldConfig": {
49 "defaults": {
@@ -128,7 +128,7 @@
128 ],
129 "datasource": {
130 "type": "elasticsearch",
131 - "uid": "wazuh_datasource_uid"
131 + "uid": "replace_datasource_uid"
132 },
133 "metrics": [
134 {
@@ -156,7 +156,7 @@
156 ],
157 "datasource": {
158 "type": "elasticsearch",
159 - "uid": "wazuh_datasource_uid"
159 + "uid": "replace_datasource_uid"
160 },
161 "hide": false,
162 "metrics": [
@@ -176,7 +176,7 @@
176 {
177 "datasource": {
178 "type": "elasticsearch",
179 - "uid": "wazuh_datasource_uid"
179 + "uid": "replace_datasource_uid"
180 },
181 "fieldConfig": {
182 "defaults": {
@@ -248,7 +248,7 @@
248 {
249 "datasource": {
250 "type": "elasticsearch",
251 - "uid": "wazuh_datasource_uid"
251 + "uid": "replace_datasource_uid"
252 },
253 "fieldConfig": {
254 "defaults": {
@@ -323,7 +323,7 @@
323 {
324 "datasource": {
325 "type": "elasticsearch",
326 - "uid": "wazuh_datasource_uid"
326 + "uid": "replace_datasource_uid"
327 },
328 "fieldConfig": {
329 "defaults": {
@@ -420,7 +420,7 @@
420 {
421 "datasource": {
422 "type": "elasticsearch",
423 - "uid": "wazuh_datasource_uid"
423 + "uid": "replace_datasource_uid"
424 },
425 "fieldConfig": {
426 "defaults": {
@@ -498,7 +498,7 @@
498 {
499 "datasource": {
500 "type": "elasticsearch",
501 - "uid": "wazuh_datasource_uid"
501 + "uid": "replace_datasource_uid"
502 },
503 "fieldConfig": {
504 "defaults": {
@@ -594,7 +594,7 @@
594 {
595 "datasource": {
596 "type": "elasticsearch",
597 - "uid": "wazuh_datasource_uid"
597 + "uid": "replace_datasource_uid"
598 },
599 "fieldConfig": {
600 "defaults": {
@@ -683,7 +683,7 @@
683 {
684 "datasource": {
685 "type": "elasticsearch",
686 - "uid": "wazuh_datasource_uid"
686 + "uid": "replace_datasource_uid"
687 },
688 "fieldConfig": {
689 "defaults": {
@@ -773,7 +773,7 @@
773 {
774 "datasource": {
775 "type": "elasticsearch",
776 - "uid": "wazuh_datasource_uid"
776 + "uid": "replace_datasource_uid"
777 },
778 "fieldConfig": {
779 "defaults": {
@@ -876,7 +876,7 @@
876 {
877 "datasource": {
878 "type": "elasticsearch",
879 - "uid": "wazuh_datasource_uid"
879 + "uid": "replace_datasource_uid"
880 },
881 "fieldConfig": {
882 "defaults": {
@@ -972,7 +972,7 @@
972 {
973 "datasource": {
974 "type": "elasticsearch",
975 - "uid": "wazuh_datasource_uid"
975 + "uid": "replace_datasource_uid"
976 },
977 "fieldConfig": {
978 "defaults": {
@@ -1061,7 +1061,7 @@
1061 {
1062 "datasource": {
1063 "type": "elasticsearch",
1064 - "uid": "wazuh_datasource_uid"
1064 + "uid": "replace_datasource_uid"
1065 },
1066 "fieldConfig": {
1067 "defaults": {
@@ -1155,7 +1155,7 @@
1155 "dashes": false,
1156 "datasource": {
1157 "type": "elasticsearch",
1158 - "uid": "wazuh_datasource_uid"
1158 + "uid": "replace_datasource_uid"
1159 },
1160 "fill": 1,
1161 "fillGradient": 0,
@@ -1269,7 +1269,7 @@
1269 {
1270 "datasource": {
1271 "type": "elasticsearch",
1272 - "uid": "wazuh_datasource_uid"
1272 + "uid": "replace_datasource_uid"
1273 },
1274 "fieldConfig": {
1275 "defaults": {
@@ -1491,7 +1491,7 @@
1491 "bucketAggs": [],
1492 "datasource": {
1493 "type": "elasticsearch",
1494 - "uid": "wazuh_datasource_uid"
1494 + "uid": "replace_datasource_uid"
1495 },
1496 "metrics": [
1497 {
@@ -1571,7 +1571,7 @@
1571 {
1572 "datasource": {
1573 "type": "elasticsearch",
1574 - "uid": "wazuh_datasource_uid"
1574 + "uid": "replace_datasource_uid"
1575 },
1576 "filters": [],
1577 "hide": 0,
@@ -1588,7 +1588,7 @@
1588 },
1589 "datasource": {
1590 "type": "elasticsearch",
1591 - "uid": "wazuh_datasource_uid"
1591 + "uid": "replace_datasource_uid"
1592 },
1593 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"_exists_:rule_mitre_tactic\"}",
1594 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_network_scan.json
+33 -33
@@ -43,7 +43,7 @@
43 {
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "fieldConfig": {
49 "defaults": {
@@ -109,7 +109,7 @@
109 ],
110 "datasource": {
111 "type": "elasticsearch",
112 - "uid": "wazuh_datasource_uid"
112 + "uid": "replace_datasource_uid"
113 },
114 "metrics": [
115 {
@@ -129,7 +129,7 @@
129 {
130 "datasource": {
131 "type": "elasticsearch",
132 - "uid": "wazuh_datasource_uid"
132 + "uid": "replace_datasource_uid"
133 },
134 "fieldConfig": {
135 "defaults": {
@@ -262,7 +262,7 @@
262 ],
263 "datasource": {
264 "type": "elasticsearch",
265 - "uid": "wazuh_datasource_uid"
265 + "uid": "replace_datasource_uid"
266 },
267 "metrics": [
268 {
@@ -291,7 +291,7 @@
291 {
292 "datasource": {
293 "type": "elasticsearch",
294 - "uid": "wazuh_datasource_uid"
294 + "uid": "replace_datasource_uid"
295 },
296 "fieldConfig": {
297 "defaults": {
@@ -419,7 +419,7 @@
419 ],
420 "datasource": {
421 "type": "elasticsearch",
422 - "uid": "wazuh_datasource_uid"
422 + "uid": "replace_datasource_uid"
423 },
424 "metrics": [
425 {
@@ -449,7 +449,7 @@
449 ],
450 "datasource": {
451 "type": "elasticsearch",
452 - "uid": "wazuh_datasource_uid"
452 + "uid": "replace_datasource_uid"
453 },
454 "hide": false,
455 "metrics": [
@@ -477,7 +477,7 @@
477 {
478 "datasource": {
479 "type": "elasticsearch",
480 - "uid": "wazuh_datasource_uid"
480 + "uid": "replace_datasource_uid"
481 },
482 "fieldConfig": {
483 "defaults": {
@@ -544,7 +544,7 @@
544 ],
545 "datasource": {
546 "type": "elasticsearch",
547 - "uid": "wazuh_datasource_uid"
547 + "uid": "replace_datasource_uid"
548 },
549 "metrics": [
550 {
@@ -566,7 +566,7 @@
566 "columns": [],
567 "datasource": {
568 "type": "elasticsearch",
569 - "uid": "wazuh_datasource_uid"
569 + "uid": "replace_datasource_uid"
570 },
571 "fontSize": "100%",
572 "gridPos": {
@@ -632,7 +632,7 @@
632 ],
633 "datasource": {
634 "type": "elasticsearch",
635 - "uid": "wazuh_datasource_uid"
635 + "uid": "replace_datasource_uid"
636 },
637 "metrics": [
638 {
@@ -653,7 +653,7 @@
653 {
654 "datasource": {
655 "type": "elasticsearch",
656 - "uid": "wazuh_datasource_uid"
656 + "uid": "replace_datasource_uid"
657 },
658 "fieldConfig": {
659 "defaults": {
@@ -724,7 +724,7 @@
724 ],
725 "datasource": {
726 "type": "elasticsearch",
727 - "uid": "wazuh_datasource_uid"
727 + "uid": "replace_datasource_uid"
728 },
729 "metrics": [
730 {
@@ -746,7 +746,7 @@
746 {
747 "datasource": {
748 "type": "elasticsearch",
749 - "uid": "wazuh_datasource_uid"
749 + "uid": "replace_datasource_uid"
750 },
751 "fieldConfig": {
752 "defaults": {
@@ -822,7 +822,7 @@
822 ],
823 "datasource": {
824 "type": "elasticsearch",
825 - "uid": "wazuh_datasource_uid"
825 + "uid": "replace_datasource_uid"
826 },
827 "metrics": [
828 {
@@ -857,7 +857,7 @@
857 {
858 "datasource": {
859 "type": "elasticsearch",
860 - "uid": "wazuh_datasource_uid"
860 + "uid": "replace_datasource_uid"
861 },
862 "fieldConfig": {
863 "defaults": {
@@ -952,7 +952,7 @@
952 ],
953 "datasource": {
954 "type": "elasticsearch",
955 - "uid": "wazuh_datasource_uid"
955 + "uid": "replace_datasource_uid"
956 },
957 "metrics": [
958 {
@@ -975,7 +975,7 @@
975 "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"],
976 "datasource": {
977 "type": "elasticsearch",
978 - "uid": "wazuh_datasource_uid"
978 + "uid": "replace_datasource_uid"
979 },
980 "decimals": 0,
981 "esMetric": "Count",
@@ -1032,7 +1032,7 @@
1032 ],
1033 "datasource": {
1034 "type": "elasticsearch",
1035 - "uid": "wazuh_datasource_uid"
1035 + "uid": "replace_datasource_uid"
1036 },
1037 "metrics": [
1038 {
@@ -1056,7 +1056,7 @@
1056 {
1057 "datasource": {
1058 "type": "elasticsearch",
1059 - "uid": "wazuh_datasource_uid"
1059 + "uid": "replace_datasource_uid"
1060 },
1061 "fieldConfig": {
1062 "defaults": {
@@ -1126,7 +1126,7 @@
1126 ],
1127 "datasource": {
1128 "type": "elasticsearch",
1129 - "uid": "wazuh_datasource_uid"
1129 + "uid": "replace_datasource_uid"
1130 },
1131 "metrics": [
1132 {
@@ -1148,7 +1148,7 @@
1148 {
1149 "datasource": {
1150 "type": "elasticsearch",
1151 - "uid": "wazuh_datasource_uid"
1151 + "uid": "replace_datasource_uid"
1152 },
1153 "fieldConfig": {
1154 "defaults": {
@@ -1210,7 +1210,7 @@
1210 ],
1211 "datasource": {
1212 "type": "elasticsearch",
1213 - "uid": "wazuh_datasource_uid"
1213 + "uid": "replace_datasource_uid"
1214 },
1215 "metrics": [
1216 {
@@ -1233,7 +1233,7 @@
1233 {
1234 "datasource": {
1235 "type": "elasticsearch",
1236 - "uid": "wazuh_datasource_uid"
1236 + "uid": "replace_datasource_uid"
1237 },
1238 "fieldConfig": {
1239 "defaults": {
@@ -1303,7 +1303,7 @@
1303 ],
1304 "datasource": {
1305 "type": "elasticsearch",
1306 - "uid": "wazuh_datasource_uid"
1306 + "uid": "replace_datasource_uid"
1307 },
1308 "metrics": [
1309 {
@@ -1325,7 +1325,7 @@
1325 {
1326 "datasource": {
1327 "type": "elasticsearch",
1328 - "uid": "wazuh_datasource_uid"
1328 + "uid": "replace_datasource_uid"
1329 },
1330 "fieldConfig": {
1331 "defaults": {
@@ -1404,7 +1404,7 @@
1404 ],
1405 "datasource": {
1406 "type": "elasticsearch",
1407 - "uid": "wazuh_datasource_uid"
1407 + "uid": "replace_datasource_uid"
1408 },
1409 "metrics": [
1410 {
@@ -1425,7 +1425,7 @@
1425 {
1426 "datasource": {
1427 "type": "elasticsearch",
1428 - "uid": "wazuh_datasource_uid"
1428 + "uid": "replace_datasource_uid"
1429 },
1430 "fieldConfig": {
1431 "defaults": {
@@ -1488,7 +1488,7 @@
1488 ],
1489 "datasource": {
1490 "type": "elasticsearch",
1491 - "uid": "wazuh_datasource_uid"
1491 + "uid": "replace_datasource_uid"
1492 },
1493 "metrics": [
1494 {
@@ -1509,7 +1509,7 @@
1509 {
1510 "datasource": {
1511 "type": "elasticsearch",
1512 - "uid": "wazuh_datasource_uid"
1512 + "uid": "replace_datasource_uid"
1513 },
1514 "fieldConfig": {
1515 "defaults": {
@@ -1773,7 +1773,7 @@
1773 "bucketAggs": [],
1774 "datasource": {
1775 "type": "elasticsearch",
1776 - "uid": "wazuh_datasource_uid"
1776 + "uid": "replace_datasource_uid"
1777 },
1778 "metrics": [
1779 {
@@ -1856,7 +1856,7 @@
1856 {
1857 "datasource": {
1858 "type": "elasticsearch",
1859 - "uid": "wazuh_datasource_uid"
1859 + "uid": "replace_datasource_uid"
1860 },
1861 "filters": [],
1862 "hide": 0,
@@ -1873,7 +1873,7 @@
1873 },
1874 "datasource": {
1875 "type": "elasticsearch",
1876 - "uid": "wazuh_datasource_uid"
1876 + "uid": "replace_datasource_uid"
1877 },
1878 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"(rule_group3:sysmon_event3 OR rule_group2:misp_alert OR rule_group2:packetbeat) AND (data_win_eventdata_destinationIsIpv6:false OR data_eventdata_destinationIsIpv6:false OR data_event_category:\\\"network_traffic, network\\\")\"}",
1879 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_open_audit.json
+81 -81
@@ -43,7 +43,7 @@
43 "collapsed": false,
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "gridPos": {
49 "h": 1,
@@ -59,7 +59,7 @@
59 {
60 "datasource": {
61 "type": "elasticsearch",
62 - "uid": "wazuh_datasource_uid"
62 + "uid": "replace_datasource_uid"
63 },
64 "fieldConfig": {
65 "defaults": {
@@ -126,7 +126,7 @@
126 ],
127 "datasource": {
128 "type": "elasticsearch",
129 - "uid": "wazuh_datasource_uid"
129 + "uid": "replace_datasource_uid"
130 },
131 "metrics": [
132 {
@@ -147,7 +147,7 @@
147 {
148 "datasource": {
149 "type": "elasticsearch",
150 - "uid": "wazuh_datasource_uid"
150 + "uid": "replace_datasource_uid"
151 },
152 "fieldConfig": {
153 "defaults": {
@@ -393,7 +393,7 @@
393 ],
394 "datasource": {
395 "type": "elasticsearch",
396 - "uid": "wazuh_datasource_uid"
396 + "uid": "replace_datasource_uid"
397 },
398 "metrics": [
399 {
@@ -414,7 +414,7 @@
414 {
415 "datasource": {
416 "type": "elasticsearch",
417 - "uid": "wazuh_datasource_uid"
417 + "uid": "replace_datasource_uid"
418 },
419 "fieldConfig": {
420 "defaults": {
@@ -652,7 +652,7 @@
652 ],
653 "datasource": {
654 "type": "elasticsearch",
655 - "uid": "wazuh_datasource_uid"
655 + "uid": "replace_datasource_uid"
656 },
657 "metrics": [
658 {
@@ -685,7 +685,7 @@
685 {
686 "datasource": {
687 "type": "elasticsearch",
688 - "uid": "wazuh_datasource_uid"
688 + "uid": "replace_datasource_uid"
689 },
690 "fieldConfig": {
691 "defaults": {
@@ -839,7 +839,7 @@
839 ],
840 "datasource": {
841 "type": "elasticsearch",
842 - "uid": "wazuh_datasource_uid"
842 + "uid": "replace_datasource_uid"
843 },
844 "metrics": [
845 {
@@ -873,7 +873,7 @@
873 "collapsed": true,
874 "datasource": {
875 "type": "elasticsearch",
876 - "uid": "wazuh_datasource_uid"
876 + "uid": "replace_datasource_uid"
877 },
878 "gridPos": {
879 "h": 1,
@@ -886,7 +886,7 @@
886 {
887 "datasource": {
888 "type": "elasticsearch",
889 - "uid": "wazuh_datasource_uid"
889 + "uid": "replace_datasource_uid"
890 },
891 "fieldConfig": {
892 "defaults": {
@@ -966,7 +966,7 @@
966 ],
967 "datasource": {
968 "type": "elasticsearch",
969 - "uid": "wazuh_datasource_uid"
969 + "uid": "replace_datasource_uid"
970 },
971 "metrics": [
972 {
@@ -987,7 +987,7 @@
987 {
988 "datasource": {
989 "type": "elasticsearch",
990 - "uid": "wazuh_datasource_uid"
990 + "uid": "replace_datasource_uid"
991 },
992 "fieldConfig": {
993 "defaults": {
@@ -1067,7 +1067,7 @@
1067 ],
1068 "datasource": {
1069 "type": "elasticsearch",
1070 - "uid": "wazuh_datasource_uid"
1070 + "uid": "replace_datasource_uid"
1071 },
1072 "metrics": [
1073 {
@@ -1088,7 +1088,7 @@
1088 {
1089 "datasource": {
1090 "type": "elasticsearch",
1091 - "uid": "wazuh_datasource_uid"
1091 + "uid": "replace_datasource_uid"
1092 },
1093 "fieldConfig": {
1094 "defaults": {
@@ -1204,7 +1204,7 @@
1204 "bucketAggs": [],
1205 "datasource": {
1206 "type": "elasticsearch",
1207 - "uid": "wazuh_datasource_uid"
1207 + "uid": "replace_datasource_uid"
1208 },
1209 "metrics": [
1210 {
@@ -1428,7 +1428,7 @@
1428 {
1429 "datasource": {
1430 "type": "elasticsearch",
1431 - "uid": "wazuh_datasource_uid"
1431 + "uid": "replace_datasource_uid"
1432 },
1433 "fieldConfig": {
1434 "defaults": {
@@ -1685,7 +1685,7 @@
1685 ],
1686 "datasource": {
1687 "type": "elasticsearch",
1688 - "uid": "wazuh_datasource_uid"
1688 + "uid": "replace_datasource_uid"
1689 },
1690 "metrics": [
1691 {
@@ -1706,7 +1706,7 @@
1706 {
1707 "datasource": {
1708 "type": "elasticsearch",
1709 - "uid": "wazuh_datasource_uid"
1709 + "uid": "replace_datasource_uid"
1710 },
1711 "fieldConfig": {
1712 "defaults": {
@@ -1858,7 +1858,7 @@
1858 "bucketAggs": [],
1859 "datasource": {
1860 "type": "elasticsearch",
1861 - "uid": "wazuh_datasource_uid"
1861 + "uid": "replace_datasource_uid"
1862 },
1863 "metrics": [
1864 {
@@ -2105,7 +2105,7 @@
2105 {
2106 "datasource": {
2107 "type": "elasticsearch",
2108 - "uid": "wazuh_datasource_uid"
2108 + "uid": "replace_datasource_uid"
2109 },
2110 "fieldConfig": {
2111 "defaults": {
@@ -2362,7 +2362,7 @@
2362 ],
2363 "datasource": {
2364 "type": "elasticsearch",
2365 - "uid": "wazuh_datasource_uid"
2365 + "uid": "replace_datasource_uid"
2366 },
2367 "metrics": [
2368 {
@@ -2383,7 +2383,7 @@
2383 {
2384 "datasource": {
2385 "type": "elasticsearch",
2386 - "uid": "wazuh_datasource_uid"
2386 + "uid": "replace_datasource_uid"
2387 },
2388 "fieldConfig": {
2389 "defaults": {
@@ -2535,7 +2535,7 @@
2535 "bucketAggs": [],
2536 "datasource": {
2537 "type": "elasticsearch",
2538 - "uid": "wazuh_datasource_uid"
2538 + "uid": "replace_datasource_uid"
2539 },
2540 "metrics": [
2541 {
@@ -2794,7 +2794,7 @@
2794 {
2795 "datasource": {
2796 "type": "elasticsearch",
2797 - "uid": "wazuh_datasource_uid"
2797 + "uid": "replace_datasource_uid"
2798 },
2799 "fieldConfig": {
2800 "defaults": {
@@ -3051,7 +3051,7 @@
3051 ],
3052 "datasource": {
3053 "type": "elasticsearch",
3054 - "uid": "wazuh_datasource_uid"
3054 + "uid": "replace_datasource_uid"
3055 },
3056 "metrics": [
3057 {
@@ -3072,7 +3072,7 @@
3072 {
3073 "datasource": {
3074 "type": "elasticsearch",
3075 - "uid": "wazuh_datasource_uid"
3075 + "uid": "replace_datasource_uid"
3076 },
3077 "fieldConfig": {
3078 "defaults": {
@@ -3212,7 +3212,7 @@
3212 "bucketAggs": [],
3213 "datasource": {
3214 "type": "elasticsearch",
3215 - "uid": "wazuh_datasource_uid"
3215 + "uid": "replace_datasource_uid"
3216 },
3217 "metrics": [
3218 {
@@ -3420,7 +3420,7 @@
3420 {
3421 "datasource": {
3422 "type": "elasticsearch",
3423 - "uid": "wazuh_datasource_uid"
3423 + "uid": "replace_datasource_uid"
3424 },
3425 "fieldConfig": {
3426 "defaults": {
@@ -3610,7 +3610,7 @@
3610 "bucketAggs": [],
3611 "datasource": {
3612 "type": "elasticsearch",
3613 - "uid": "wazuh_datasource_uid"
3613 + "uid": "replace_datasource_uid"
3614 },
3615 "metrics": [
3616 {
@@ -3833,7 +3833,7 @@
3833 {
3834 "datasource": {
3835 "type": "elasticsearch",
3836 - "uid": "wazuh_datasource_uid"
3836 + "uid": "replace_datasource_uid"
3837 },
3838 "fieldConfig": {
3839 "defaults": {
@@ -4021,7 +4021,7 @@
4021 "bucketAggs": [],
4022 "datasource": {
4023 "type": "elasticsearch",
4024 - "uid": "wazuh_datasource_uid"
4024 + "uid": "replace_datasource_uid"
4025 },
4026 "metrics": [
4027 {
@@ -4262,7 +4262,7 @@
4262 "collapsed": true,
4263 "datasource": {
4264 "type": "elasticsearch",
4265 - "uid": "wazuh_datasource_uid"
4265 + "uid": "replace_datasource_uid"
4266 },
4267 "gridPos": {
4268 "h": 1,
@@ -4275,7 +4275,7 @@
4275 {
4276 "datasource": {
4277 "type": "elasticsearch",
4278 - "uid": "wazuh_datasource_uid"
4278 + "uid": "replace_datasource_uid"
4279 },
4280 "fieldConfig": {
4281 "defaults": {
@@ -4521,7 +4521,7 @@
4521 ],
4522 "datasource": {
4523 "type": "elasticsearch",
4524 - "uid": "wazuh_datasource_uid"
4524 + "uid": "replace_datasource_uid"
4525 },
4526 "metrics": [
4527 {
@@ -4542,7 +4542,7 @@
4542 {
4543 "datasource": {
4544 "type": "elasticsearch",
4545 - "uid": "wazuh_datasource_uid"
4545 + "uid": "replace_datasource_uid"
4546 },
4547 "fieldConfig": {
4548 "defaults": {
@@ -4635,7 +4635,7 @@
4635 ],
4636 "datasource": {
4637 "type": "elasticsearch",
4638 - "uid": "wazuh_datasource_uid"
4638 + "uid": "replace_datasource_uid"
4639 },
4640 "metrics": [
4641 {
@@ -4668,7 +4668,7 @@
4668 {
4669 "datasource": {
4670 "type": "elasticsearch",
4671 - "uid": "wazuh_datasource_uid"
4671 + "uid": "replace_datasource_uid"
4672 },
4673 "fieldConfig": {
4674 "defaults": {
@@ -4772,7 +4772,7 @@
4772 ],
4773 "datasource": {
4774 "type": "elasticsearch",
4775 - "uid": "wazuh_datasource_uid"
4775 + "uid": "replace_datasource_uid"
4776 },
4777 "metrics": [
4778 {
@@ -4793,7 +4793,7 @@
4793 {
4794 "datasource": {
4795 "type": "elasticsearch",
4796 - "uid": "wazuh_datasource_uid"
4796 + "uid": "replace_datasource_uid"
4797 },
4798 "fieldConfig": {
4799 "defaults": {
@@ -4909,7 +4909,7 @@
4909 "bucketAggs": [],
4910 "datasource": {
4911 "type": "elasticsearch",
4912 - "uid": "wazuh_datasource_uid"
4912 + "uid": "replace_datasource_uid"
4913 },
4914 "metrics": [
4915 {
@@ -5164,7 +5164,7 @@
5164 "collapsed": true,
5165 "datasource": {
5166 "type": "elasticsearch",
5167 - "uid": "wazuh_datasource_uid"
5167 + "uid": "replace_datasource_uid"
5168 },
5169 "gridPos": {
5170 "h": 1,
@@ -5177,7 +5177,7 @@
5177 {
5178 "datasource": {
5179 "type": "elasticsearch",
5180 - "uid": "wazuh_datasource_uid"
5180 + "uid": "replace_datasource_uid"
5181 },
5182 "fieldConfig": {
5183 "defaults": {
@@ -5391,7 +5391,7 @@
5391 "bucketAggs": [],
5392 "datasource": {
5393 "type": "elasticsearch",
5394 - "uid": "wazuh_datasource_uid"
5394 + "uid": "replace_datasource_uid"
5395 },
5396 "metrics": [
5397 {
@@ -5702,7 +5702,7 @@
5702 {
5703 "datasource": {
5704 "type": "elasticsearch",
5705 - "uid": "wazuh_datasource_uid"
5705 + "uid": "replace_datasource_uid"
5706 },
5707 "fieldConfig": {
5708 "defaults": {
@@ -5916,7 +5916,7 @@
5916 "bucketAggs": [],
5917 "datasource": {
5918 "type": "elasticsearch",
5919 - "uid": "wazuh_datasource_uid"
5919 + "uid": "replace_datasource_uid"
5920 },
5921 "metrics": [
5922 {
@@ -6221,7 +6221,7 @@
6221 "collapsed": true,
6222 "datasource": {
6223 "type": "elasticsearch",
6224 - "uid": "wazuh_datasource_uid"
6224 + "uid": "replace_datasource_uid"
6225 },
6226 "gridPos": {
6227 "h": 1,
@@ -6234,7 +6234,7 @@
6234 {
6235 "datasource": {
6236 "type": "elasticsearch",
6237 - "uid": "wazuh_datasource_uid"
6237 + "uid": "replace_datasource_uid"
6238 },
6239 "fieldConfig": {
6240 "defaults": {
@@ -6300,7 +6300,7 @@
6300 ],
6301 "datasource": {
6302 "type": "elasticsearch",
6303 - "uid": "wazuh_datasource_uid"
6303 + "uid": "replace_datasource_uid"
6304 },
6305 "metrics": [
6306 {
@@ -6320,7 +6320,7 @@
6320 {
6321 "datasource": {
6322 "type": "elasticsearch",
6323 - "uid": "wazuh_datasource_uid"
6323 + "uid": "replace_datasource_uid"
6324 },
6325 "fieldConfig": {
6326 "defaults": {
@@ -6473,7 +6473,7 @@
6473 ],
6474 "datasource": {
6475 "type": "elasticsearch",
6476 - "uid": "wazuh_datasource_uid"
6476 + "uid": "replace_datasource_uid"
6477 },
6478 "metrics": [
6479 {
@@ -6506,7 +6506,7 @@
6506 {
6507 "datasource": {
6508 "type": "elasticsearch",
6509 - "uid": "wazuh_datasource_uid"
6509 + "uid": "replace_datasource_uid"
6510 },
6511 "fieldConfig": {
6512 "defaults": {
@@ -6672,7 +6672,7 @@
6672 "bucketAggs": [],
6673 "datasource": {
6674 "type": "elasticsearch",
6675 - "uid": "wazuh_datasource_uid"
6675 + "uid": "replace_datasource_uid"
6676 },
6677 "metrics": [
6678 {
@@ -6889,7 +6889,7 @@
6889 {
6890 "datasource": {
6891 "type": "elasticsearch",
6892 - "uid": "wazuh_datasource_uid"
6892 + "uid": "replace_datasource_uid"
6893 },
6894 "fieldConfig": {
6895 "defaults": {
@@ -7055,7 +7055,7 @@
7055 "bucketAggs": [],
7056 "datasource": {
7057 "type": "elasticsearch",
7058 - "uid": "wazuh_datasource_uid"
7058 + "uid": "replace_datasource_uid"
7059 },
7060 "metrics": [
7061 {
@@ -7266,7 +7266,7 @@
7266 "collapsed": true,
7267 "datasource": {
7268 "type": "elasticsearch",
7269 - "uid": "wazuh_datasource_uid"
7269 + "uid": "replace_datasource_uid"
7270 },
7271 "gridPos": {
7272 "h": 1,
@@ -7279,7 +7279,7 @@
7279 {
7280 "datasource": {
7281 "type": "elasticsearch",
7282 - "uid": "wazuh_datasource_uid"
7282 + "uid": "replace_datasource_uid"
7283 },
7284 "fieldConfig": {
7285 "defaults": {
@@ -7345,7 +7345,7 @@
7345 ],
7346 "datasource": {
7347 "type": "elasticsearch",
7348 - "uid": "wazuh_datasource_uid"
7348 + "uid": "replace_datasource_uid"
7349 },
7350 "metrics": [
7351 {
@@ -7365,7 +7365,7 @@
7365 {
7366 "datasource": {
7367 "type": "elasticsearch",
7368 - "uid": "wazuh_datasource_uid"
7368 + "uid": "replace_datasource_uid"
7369 },
7370 "fieldConfig": {
7371 "defaults": {
@@ -7551,7 +7551,7 @@
7551 ],
7552 "datasource": {
7553 "type": "elasticsearch",
7554 - "uid": "wazuh_datasource_uid"
7554 + "uid": "replace_datasource_uid"
7555 },
7556 "metrics": [
7557 {
@@ -7572,7 +7572,7 @@
7572 {
7573 "datasource": {
7574 "type": "elasticsearch",
7575 - "uid": "wazuh_datasource_uid"
7575 + "uid": "replace_datasource_uid"
7576 },
7577 "fieldConfig": {
7578 "defaults": {
@@ -7675,7 +7675,7 @@
7675 ],
7676 "datasource": {
7677 "type": "elasticsearch",
7678 - "uid": "wazuh_datasource_uid"
7678 + "uid": "replace_datasource_uid"
7679 },
7680 "metrics": [
7681 {
@@ -7696,7 +7696,7 @@
7696 {
7697 "datasource": {
7698 "type": "elasticsearch",
7699 - "uid": "wazuh_datasource_uid"
7699 + "uid": "replace_datasource_uid"
7700 },
7701 "fieldConfig": {
7702 "defaults": {
@@ -7898,7 +7898,7 @@
7898 "bucketAggs": [],
7899 "datasource": {
7900 "type": "elasticsearch",
7901 - "uid": "wazuh_datasource_uid"
7901 + "uid": "replace_datasource_uid"
7902 },
7903 "metrics": [
7904 {
@@ -8177,7 +8177,7 @@
8177 {
8178 "datasource": {
8179 "type": "elasticsearch",
8180 - "uid": "wazuh_datasource_uid"
8180 + "uid": "replace_datasource_uid"
8181 },
8182 "fieldConfig": {
8183 "defaults": {
@@ -8243,7 +8243,7 @@
8243 ],
8244 "datasource": {
8245 "type": "elasticsearch",
8246 - "uid": "wazuh_datasource_uid"
8246 + "uid": "replace_datasource_uid"
8247 },
8248 "metrics": [
8249 {
@@ -8263,7 +8263,7 @@
8263 {
8264 "datasource": {
8265 "type": "elasticsearch",
8266 - "uid": "wazuh_datasource_uid"
8266 + "uid": "replace_datasource_uid"
8267 },
8268 "fieldConfig": {
8269 "defaults": {
@@ -8520,7 +8520,7 @@
8520 ],
8521 "datasource": {
8522 "type": "elasticsearch",
8523 - "uid": "wazuh_datasource_uid"
8523 + "uid": "replace_datasource_uid"
8524 },
8525 "metrics": [
8526 {
@@ -8541,7 +8541,7 @@
8541 {
8542 "datasource": {
8543 "type": "elasticsearch",
8544 - "uid": "wazuh_datasource_uid"
8544 + "uid": "replace_datasource_uid"
8545 },
8546 "fieldConfig": {
8547 "defaults": {
@@ -8694,7 +8694,7 @@
8694 ],
8695 "datasource": {
8696 "type": "elasticsearch",
8697 - "uid": "wazuh_datasource_uid"
8697 + "uid": "replace_datasource_uid"
8698 },
8699 "metrics": [
8700 {
@@ -8728,7 +8728,7 @@
8728 {
8729 "datasource": {
8730 "type": "elasticsearch",
8731 - "uid": "wazuh_datasource_uid"
8731 + "uid": "replace_datasource_uid"
8732 },
8733 "fieldConfig": {
8734 "defaults": {
@@ -8894,7 +8894,7 @@
8894 "bucketAggs": [],
8895 "datasource": {
8896 "type": "elasticsearch",
8897 - "uid": "wazuh_datasource_uid"
8897 + "uid": "replace_datasource_uid"
8898 },
8899 "metrics": [
8900 {
@@ -9154,7 +9154,7 @@
9154 {
9155 "datasource": {
9156 "type": "elasticsearch",
9157 - "uid": "wazuh_datasource_uid"
9157 + "uid": "replace_datasource_uid"
9158 },
9159 "fieldConfig": {
9160 "defaults": {
@@ -9356,7 +9356,7 @@
9356 "bucketAggs": [],
9357 "datasource": {
9358 "type": "elasticsearch",
9359 - "uid": "wazuh_datasource_uid"
9359 + "uid": "replace_datasource_uid"
9360 },
9361 "metrics": [
9362 {
@@ -9680,7 +9680,7 @@
9680 {
9681 "datasource": {
9682 "type": "elasticsearch",
9683 - "uid": "wazuh_datasource_uid"
9683 + "uid": "replace_datasource_uid"
9684 },
9685 "fieldConfig": {
9686 "defaults": {
@@ -9882,7 +9882,7 @@
9882 "bucketAggs": [],
9883 "datasource": {
9884 "type": "elasticsearch",
9885 - "uid": "wazuh_datasource_uid"
9885 + "uid": "replace_datasource_uid"
9886 },
9887 "metrics": [
9888 {
@@ -10166,7 +10166,7 @@
10166 "collapsed": true,
10167 "datasource": {
10168 "type": "elasticsearch",
10169 - "uid": "wazuh_datasource_uid"
10169 + "uid": "replace_datasource_uid"
10170 },
10171 "gridPos": {
10172 "h": 1,
@@ -10179,7 +10179,7 @@
10179 {
10180 "datasource": {
10181 "type": "elasticsearch",
10182 - "uid": "wazuh_datasource_uid"
10182 + "uid": "replace_datasource_uid"
10183 },
10184 "fieldConfig": {
10185 "defaults": {
@@ -10297,7 +10297,7 @@
10297 "bucketAggs": [],
10298 "datasource": {
10299 "type": "elasticsearch",
10300 - "uid": "wazuh_datasource_uid"
10300 + "uid": "replace_datasource_uid"
10301 },
10302 "metrics": [
10303 {
@@ -10531,7 +10531,7 @@
10531 {
10532 "datasource": {
10533 "type": "elasticsearch",
10534 - "uid": "wazuh_datasource_uid"
10534 + "uid": "replace_datasource_uid"
10535 },
10536 "filters": [],
10537 "hide": 0,
@@ -10548,7 +10548,7 @@
10548 },
10549 "datasource": {
10550 "type": "elasticsearch",
10551 - "uid": "wazuh_datasource_uid"
10551 + "uid": "replace_datasource_uid"
10552 },
10553 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_groups:open-audit\"}",
10554 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_process_injection.json
+16 -16
@@ -43,7 +43,7 @@
43 {
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "fieldConfig": {
49 "defaults": {
@@ -127,7 +127,7 @@
127 {
128 "datasource": {
129 "type": "elasticsearch",
130 - "uid": "wazuh_datasource_uid"
130 + "uid": "replace_datasource_uid"
131 },
132 "fieldConfig": {
133 "defaults": {
@@ -210,7 +210,7 @@
210 {
211 "datasource": {
212 "type": "elasticsearch",
213 - "uid": "wazuh_datasource_uid"
213 + "uid": "replace_datasource_uid"
214 },
215 "fieldConfig": {
216 "defaults": {
@@ -306,7 +306,7 @@
306 ],
307 "datasource": {
308 "type": "elasticsearch",
309 - "uid": "wazuh_datasource_uid"
309 + "uid": "replace_datasource_uid"
310 },
311 "metrics": [
312 {
@@ -326,7 +326,7 @@
326 {
327 "datasource": {
328 "type": "elasticsearch",
329 - "uid": "wazuh_datasource_uid"
329 + "uid": "replace_datasource_uid"
330 },
331 "fieldConfig": {
332 "defaults": {
@@ -402,7 +402,7 @@
402 ],
403 "datasource": {
404 "type": "elasticsearch",
405 - "uid": "wazuh_datasource_uid"
405 + "uid": "replace_datasource_uid"
406 },
407 "metrics": [
408 {
@@ -421,7 +421,7 @@
421 {
422 "datasource": {
423 "type": "elasticsearch",
424 - "uid": "wazuh_datasource_uid"
424 + "uid": "replace_datasource_uid"
425 },
426 "fieldConfig": {
427 "defaults": {
@@ -494,7 +494,7 @@
494 ],
495 "datasource": {
496 "type": "elasticsearch",
497 - "uid": "wazuh_datasource_uid"
497 + "uid": "replace_datasource_uid"
498 },
499 "metrics": [
500 {
@@ -516,7 +516,7 @@
516 {
517 "datasource": {
518 "type": "elasticsearch",
519 - "uid": "wazuh_datasource_uid"
519 + "uid": "replace_datasource_uid"
520 },
521 "fieldConfig": {
522 "defaults": {
@@ -598,7 +598,7 @@
598 ],
599 "datasource": {
600 "type": "elasticsearch",
601 - "uid": "wazuh_datasource_uid"
601 + "uid": "replace_datasource_uid"
602 },
603 "metrics": [
604 {
@@ -620,7 +620,7 @@
620 {
621 "datasource": {
622 "type": "elasticsearch",
623 - "uid": "wazuh_datasource_uid"
623 + "uid": "replace_datasource_uid"
624 },
625 "fieldConfig": {
626 "defaults": {
@@ -692,7 +692,7 @@
692 ],
693 "datasource": {
694 "type": "elasticsearch",
695 - "uid": "wazuh_datasource_uid"
695 + "uid": "replace_datasource_uid"
696 },
697 "metrics": [
698 {
@@ -714,7 +714,7 @@
714 {
715 "datasource": {
716 "type": "elasticsearch",
717 - "uid": "wazuh_datasource_uid"
717 + "uid": "replace_datasource_uid"
718 },
719 "fieldConfig": {
720 "defaults": {
@@ -858,7 +858,7 @@
858 "bucketAggs": [],
859 "datasource": {
860 "type": "elasticsearch",
861 - "uid": "wazuh_datasource_uid"
861 + "uid": "replace_datasource_uid"
862 },
863 "metrics": [
864 {
@@ -1120,7 +1120,7 @@
1120 {
1121 "datasource": {
1122 "type": "elasticsearch",
1123 - "uid": "wazuh_datasource_uid"
1123 + "uid": "replace_datasource_uid"
1124 },
1125 "filters": [],
1126 "hide": 0,
@@ -1137,7 +1137,7 @@
1137 },
1138 "datasource": {
1139 "type": "elasticsearch",
1140 - "uid": "wazuh_datasource_uid"
1140 + "uid": "replace_datasource_uid"
1141 },
1142 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_group3:sysmon_event_10\"}",
1143 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_system_processes.json
+37 -37
@@ -42,7 +42,7 @@
42 {
43 "datasource": {
44 "type": "elasticsearch",
45 - "uid": "wazuh_datasource_uid"
45 + "uid": "replace_datasource_uid"
46 },
47 "fieldConfig": {
48 "defaults": {
@@ -109,7 +109,7 @@
109 ],
110 "datasource": {
111 "type": "elasticsearch",
112 - "uid": "wazuh_datasource_uid"
112 + "uid": "replace_datasource_uid"
113 },
114 "metrics": [
115 {
@@ -130,7 +130,7 @@
130 {
131 "datasource": {
132 "type": "elasticsearch",
133 - "uid": "wazuh_datasource_uid"
133 + "uid": "replace_datasource_uid"
134 },
135 "fieldConfig": {
136 "defaults": {
@@ -273,7 +273,7 @@
273 ],
274 "datasource": {
275 "type": "elasticsearch",
276 - "uid": "wazuh_datasource_uid"
276 + "uid": "replace_datasource_uid"
277 },
278 "metrics": [
279 {
@@ -302,7 +302,7 @@
302 {
303 "datasource": {
304 "type": "elasticsearch",
305 - "uid": "wazuh_datasource_uid"
305 + "uid": "replace_datasource_uid"
306 },
307 "fieldConfig": {
308 "defaults": {
@@ -382,7 +382,7 @@
382 ],
383 "datasource": {
384 "type": "elasticsearch",
385 - "uid": "wazuh_datasource_uid"
385 + "uid": "replace_datasource_uid"
386 },
387 "metrics": [
388 {
@@ -404,7 +404,7 @@
404 {
405 "datasource": {
406 "type": "elasticsearch",
407 - "uid": "wazuh_datasource_uid"
407 + "uid": "replace_datasource_uid"
408 },
409 "fieldConfig": {
410 "defaults": {
@@ -471,7 +471,7 @@
471 ],
472 "datasource": {
473 "type": "elasticsearch",
474 - "uid": "wazuh_datasource_uid"
474 + "uid": "replace_datasource_uid"
475 },
476 "metrics": [
477 {
@@ -493,7 +493,7 @@
493 {
494 "datasource": {
495 "type": "elasticsearch",
496 - "uid": "wazuh_datasource_uid"
496 + "uid": "replace_datasource_uid"
497 },
498 "fieldConfig": {
499 "defaults": {
@@ -558,7 +558,7 @@
558 ],
559 "datasource": {
560 "type": "elasticsearch",
561 - "uid": "wazuh_datasource_uid"
561 + "uid": "replace_datasource_uid"
562 },
563 "metrics": [
564 {
@@ -592,7 +592,7 @@
592 {
593 "datasource": {
594 "type": "elasticsearch",
595 - "uid": "wazuh_datasource_uid"
595 + "uid": "replace_datasource_uid"
596 },
597 "fieldConfig": {
598 "defaults": {
@@ -672,7 +672,7 @@
672 ],
673 "datasource": {
674 "type": "elasticsearch",
675 - "uid": "wazuh_datasource_uid"
675 + "uid": "replace_datasource_uid"
676 },
677 "metrics": [
678 {
@@ -694,7 +694,7 @@
694 {
695 "datasource": {
696 "type": "elasticsearch",
697 - "uid": "wazuh_datasource_uid"
697 + "uid": "replace_datasource_uid"
698 },
699 "fieldConfig": {
700 "defaults": {
@@ -775,7 +775,7 @@
775 ],
776 "datasource": {
777 "type": "elasticsearch",
778 - "uid": "wazuh_datasource_uid"
778 + "uid": "replace_datasource_uid"
779 },
780 "metrics": [
781 {
@@ -797,7 +797,7 @@
797 {
798 "datasource": {
799 "type": "elasticsearch",
800 - "uid": "wazuh_datasource_uid"
800 + "uid": "replace_datasource_uid"
801 },
802 "fieldConfig": {
803 "defaults": {
@@ -896,7 +896,7 @@
896 ],
897 "datasource": {
898 "type": "elasticsearch",
899 - "uid": "wazuh_datasource_uid"
899 + "uid": "replace_datasource_uid"
900 },
901 "metrics": [
902 {
@@ -916,7 +916,7 @@
916 {
917 "datasource": {
918 "type": "elasticsearch",
919 - "uid": "wazuh_datasource_uid"
919 + "uid": "replace_datasource_uid"
920 },
921 "fieldConfig": {
922 "defaults": {
@@ -994,7 +994,7 @@
994 ],
995 "datasource": {
996 "type": "elasticsearch",
997 - "uid": "wazuh_datasource_uid"
997 + "uid": "replace_datasource_uid"
998 },
999 "metrics": [
1000 {
@@ -1015,7 +1015,7 @@
1015 {
1016 "datasource": {
1017 "type": "elasticsearch",
1018 - "uid": "wazuh_datasource_uid"
1018 + "uid": "replace_datasource_uid"
1019 },
1020 "fieldConfig": {
1021 "defaults": {
@@ -1101,7 +1101,7 @@
1101 ],
1102 "datasource": {
1103 "type": "elasticsearch",
1104 - "uid": "wazuh_datasource_uid"
1104 + "uid": "replace_datasource_uid"
1105 },
1106 "metrics": [
1107 {
@@ -1122,7 +1122,7 @@
1122 {
1123 "datasource": {
1124 "type": "elasticsearch",
1125 - "uid": "wazuh_datasource_uid"
1125 + "uid": "replace_datasource_uid"
1126 },
1127 "fieldConfig": {
1128 "defaults": {
@@ -1194,7 +1194,7 @@
1194 ],
1195 "datasource": {
1196 "type": "elasticsearch",
1197 - "uid": "wazuh_datasource_uid"
1197 + "uid": "replace_datasource_uid"
1198 },
1199 "metrics": [
1200 {
@@ -1216,7 +1216,7 @@
1216 {
1217 "datasource": {
1218 "type": "elasticsearch",
1219 - "uid": "wazuh_datasource_uid"
1219 + "uid": "replace_datasource_uid"
1220 },
1221 "fieldConfig": {
1222 "defaults": {
@@ -1297,7 +1297,7 @@
1297 ],
1298 "datasource": {
1299 "type": "elasticsearch",
1300 - "uid": "wazuh_datasource_uid"
1300 + "uid": "replace_datasource_uid"
1301 },
1302 "metrics": [
1303 {
@@ -1319,7 +1319,7 @@
1319 {
1320 "datasource": {
1321 "type": "elasticsearch",
1322 - "uid": "wazuh_datasource_uid"
1322 + "uid": "replace_datasource_uid"
1323 },
1324 "fieldConfig": {
1325 "defaults": {
@@ -1391,7 +1391,7 @@
1391 ],
1392 "datasource": {
1393 "type": "elasticsearch",
1394 - "uid": "wazuh_datasource_uid"
1394 + "uid": "replace_datasource_uid"
1395 },
1396 "metrics": [
1397 {
@@ -1413,7 +1413,7 @@
1413 {
1414 "datasource": {
1415 "type": "elasticsearch",
1416 - "uid": "wazuh_datasource_uid"
1416 + "uid": "replace_datasource_uid"
1417 },
1418 "fieldConfig": {
1419 "defaults": {
@@ -1667,7 +1667,7 @@
1667 "bucketAggs": [],
1668 "datasource": {
1669 "type": "elasticsearch",
1670 - "uid": "wazuh_datasource_uid"
1670 + "uid": "replace_datasource_uid"
1671 },
1672 "metrics": [
1673 {
@@ -1746,7 +1746,7 @@
1746 {
1747 "datasource": {
1748 "type": "elasticsearch",
1749 - "uid": "wazuh_datasource_uid"
1749 + "uid": "replace_datasource_uid"
1750 },
1751 "filters": [],
1752 "hide": 0,
@@ -1763,7 +1763,7 @@
1763 },
1764 "datasource": {
1765 "type": "elasticsearch",
1766 - "uid": "wazuh_datasource_uid"
1766 + "uid": "replace_datasource_uid"
1767 },
1768 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_group3:sysmon_event1 OR rule_group2:\\\"list_processes\\\" OR rule_group2:\\\"process_events\\\"\"}",
1769 "hide": 0,
@@ -1790,7 +1790,7 @@
1790 },
1791 "datasource": {
1792 "type": "elasticsearch",
1793 - "uid": "wazuh_datasource_uid"
1793 + "uid": "replace_datasource_uid"
1794 },
1795 "definition": "{ \"find\": \"terms\", \"field\": \"process_name\", \"query\": \"rule_group3:sysmon_event1\"}",
1796 "hide": 2,
@@ -1817,7 +1817,7 @@
1817 },
1818 "datasource": {
1819 "type": "elasticsearch",
1820 - "uid": "wazuh_datasource_uid"
1820 + "uid": "replace_datasource_uid"
1821 },
1822 "definition": "{ \"find\": \"terms\", \"field\": \"parent_process_cmd_line\", \"query\": \"rule_group3:sysmon_event1\"}",
1823 "hide": 2,
@@ -1843,7 +1843,7 @@
1843 },
1844 "datasource": {
1845 "type": "elasticsearch",
1846 - "uid": "wazuh_datasource_uid"
1846 + "uid": "replace_datasource_uid"
1847 },
1848 "definition": "{ \"find\": \"terms\", \"field\": \"parent_process_id\", \"query\": \"rule_group3:sysmon_event1\"}",
1849 "hide": 2,
@@ -1869,7 +1869,7 @@
1869 },
1870 "datasource": {
1871 "type": "elasticsearch",
1872 - "uid": "wazuh_datasource_uid"
1872 + "uid": "replace_datasource_uid"
1873 },
1874 "definition": "{ \"find\": \"terms\", \"field\": \"parent_process_image\", \"query\": \"rule_group3:sysmon_event1\"}",
1875 "hide": 2,
@@ -1895,7 +1895,7 @@
1895 },
1896 "datasource": {
1897 "type": "elasticsearch",
1898 - "uid": "wazuh_datasource_uid"
1898 + "uid": "replace_datasource_uid"
1899 },
1900 "definition": "{ \"find\": \"terms\", \"field\": \"process_image\", \"query\": \"rule_group3:sysmon_event1\"}",
1901 "hide": 2,
@@ -1921,7 +1921,7 @@
1921 },
1922 "datasource": {
1923 "type": "elasticsearch",
1924 - "uid": "wazuh_datasource_uid"
1924 + "uid": "replace_datasource_uid"
1925 },
1926 "definition": "{ \"find\": \"terms\", \"field\": \"process_cmd_line\", \"query\": \"rule_group3:sysmon_event1\"}",
1927 "hide": 2,
@@ -1947,7 +1947,7 @@
1947 },
1948 "datasource": {
1949 "type": "elasticsearch",
1950 - "uid": "wazuh_datasource_uid"
1950 + "uid": "replace_datasource_uid"
1951 },
1952 "definition": "{ \"find\": \"terms\", \"field\": \"process_id\", \"query\": \"rule_group3:sysmon_event1\"}",
1953 "hide": 2,
backend/app/connectors/grafana/dashboards/Wazuh/edr_system_security_audit.json
+15 -15
@@ -43,7 +43,7 @@
43 {
44 "datasource": {
45 "type": "elasticsearch",
46 - "uid": "wazuh_datasource_uid"
46 + "uid": "replace_datasource_uid"
47 },
48 "fieldConfig": {
49 "defaults": {
@@ -127,7 +127,7 @@
127 {
128 "datasource": {
129 "type": "elasticsearch",
130 - "uid": "wazuh_datasource_uid"
130 + "uid": "replace_datasource_uid"
131 },
132 "fieldConfig": {
133 "defaults": {
@@ -268,7 +268,7 @@
268 {
269 "datasource": {
270 "type": "elasticsearch",
271 - "uid": "wazuh_datasource_uid"
271 + "uid": "replace_datasource_uid"
272 },
273 "fieldConfig": {
274 "defaults": {
@@ -433,7 +433,7 @@
433 {
434 "datasource": {
435 "type": "elasticsearch",
436 - "uid": "wazuh_datasource_uid"
436 + "uid": "replace_datasource_uid"
437 },
438 "fieldConfig": {
439 "defaults": {
@@ -684,7 +684,7 @@
684 "dashes": false,
685 "datasource": {
686 "type": "elasticsearch",
687 - "uid": "wazuh_datasource_uid"
687 + "uid": "replace_datasource_uid"
688 },
689 "fieldConfig": {
690 "defaults": {
@@ -805,7 +805,7 @@
805 {
806 "datasource": {
807 "type": "elasticsearch",
808 - "uid": "wazuh_datasource_uid"
808 + "uid": "replace_datasource_uid"
809 },
810 "fieldConfig": {
811 "defaults": {
@@ -1033,7 +1033,7 @@
1033 ],
1034 "datasource": {
1035 "type": "elasticsearch",
1036 - "uid": "wazuh_datasource_uid"
1036 + "uid": "replace_datasource_uid"
1037 },
1038 "metrics": [
1039 {
@@ -1056,7 +1056,7 @@
1056 {
1057 "datasource": {
1058 "type": "elasticsearch",
1059 - "uid": "wazuh_datasource_uid"
1059 + "uid": "replace_datasource_uid"
1060 },
1061 "fieldConfig": {
1062 "defaults": {
@@ -1288,7 +1288,7 @@
1288 ],
1289 "datasource": {
1290 "type": "elasticsearch",
1291 - "uid": "wazuh_datasource_uid"
1291 + "uid": "replace_datasource_uid"
1292 },
1293 "metrics": [
1294 {
@@ -1323,7 +1323,7 @@
1323 {
1324 "datasource": {
1325 "type": "elasticsearch",
1326 - "uid": "wazuh_datasource_uid"
1326 + "uid": "replace_datasource_uid"
1327 },
1328 "fieldConfig": {
1329 "defaults": {
@@ -1582,7 +1582,7 @@
1582 ],
1583 "datasource": {
1584 "type": "elasticsearch",
1585 - "uid": "wazuh_datasource_uid"
1585 + "uid": "replace_datasource_uid"
1586 },
1587 "metrics": [
1588 {
@@ -1605,7 +1605,7 @@
1605 {
1606 "datasource": {
1607 "type": "elasticsearch",
1608 - "uid": "wazuh_datasource_uid"
1608 + "uid": "replace_datasource_uid"
1609 },
1610 "fieldConfig": {
1611 "defaults": {
@@ -1790,7 +1790,7 @@
1790 "bucketAggs": [],
1791 "datasource": {
1792 "type": "elasticsearch",
1793 - "uid": "wazuh_datasource_uid"
1793 + "uid": "replace_datasource_uid"
1794 },
1795 "metrics": [
1796 {
@@ -1868,7 +1868,7 @@
1868 {
1869 "datasource": {
1870 "type": "elasticsearch",
1871 - "uid": "wazuh_datasource_uid"
1871 + "uid": "replace_datasource_uid"
1872 },
1873 "filters": [],
1874 "hide": 0,
@@ -1885,7 +1885,7 @@
1885 },
1886 "datasource": {
1887 "type": "elasticsearch",
1888 - "uid": "wazuh_datasource_uid"
1888 + "uid": "replace_datasource_uid"
1889 },
1890 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_groups:rootcheck OR rule_groups:oscap OR rule_groups:sca\"}",
1891 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_system_vulnerabilities.json
+38 -38
@@ -42,7 +42,7 @@
42 {
43 "datasource": {
44 "type": "elasticsearch",
45 - "uid": "wazuh_datasource_uid"
45 + "uid": "replace_datasource_uid"
46 },
47 "gridPos": {
48 "h": 1,
@@ -57,7 +57,7 @@
57 {
58 "datasource": {
59 "type": "elasticsearch",
60 - "uid": "wazuh_datasource_uid"
60 + "uid": "replace_datasource_uid"
61 },
62 "fieldConfig": {
63 "defaults": {
@@ -123,7 +123,7 @@
123 ],
124 "datasource": {
125 "type": "elasticsearch",
126 - "uid": "wazuh_datasource_uid"
126 + "uid": "replace_datasource_uid"
127 },
128 "metrics": [
129 {
@@ -144,7 +144,7 @@
144 "columns": [],
145 "datasource": {
146 "type": "elasticsearch",
147 - "uid": "wazuh_datasource_uid"
147 + "uid": "replace_datasource_uid"
148 },
149 "fontSize": "100%",
150 "gridPos": {
@@ -229,7 +229,7 @@
229 "columns": [],
230 "datasource": {
231 "type": "elasticsearch",
232 - "uid": "wazuh_datasource_uid"
232 + "uid": "replace_datasource_uid"
233 },
234 "fontSize": "100%",
235 "gridPos": {
@@ -313,7 +313,7 @@
313 {
314 "datasource": {
315 "type": "elasticsearch",
316 - "uid": "wazuh_datasource_uid"
316 + "uid": "replace_datasource_uid"
317 },
318 "fieldConfig": {
319 "defaults": {
@@ -460,7 +460,7 @@
460 ],
461 "datasource": {
462 "type": "elasticsearch",
463 - "uid": "wazuh_datasource_uid"
463 + "uid": "replace_datasource_uid"
464 },
465 "metrics": [
466 {
@@ -499,7 +499,7 @@
499 {
500 "datasource": {
501 "type": "elasticsearch",
502 - "uid": "wazuh_datasource_uid"
502 + "uid": "replace_datasource_uid"
503 },
504 "fieldConfig": {
505 "defaults": {
@@ -571,7 +571,7 @@
571 ],
572 "datasource": {
573 "type": "elasticsearch",
574 - "uid": "wazuh_datasource_uid"
574 + "uid": "replace_datasource_uid"
575 },
576 "metrics": [
577 {
@@ -593,7 +593,7 @@
593 {
594 "datasource": {
595 "type": "elasticsearch",
596 - "uid": "wazuh_datasource_uid"
596 + "uid": "replace_datasource_uid"
597 },
598 "fieldConfig": {
599 "defaults": {
@@ -746,7 +746,7 @@
746 {
747 "datasource": {
748 "type": "elasticsearch",
749 - "uid": "wazuh_datasource_uid"
749 + "uid": "replace_datasource_uid"
750 },
751 "fieldConfig": {
752 "defaults": {
@@ -939,7 +939,7 @@
939 ],
940 "datasource": {
941 "type": "elasticsearch",
942 - "uid": "wazuh_datasource_uid"
942 + "uid": "replace_datasource_uid"
943 },
944 "metrics": [
945 {
@@ -975,7 +975,7 @@
975 "collapsed": false,
976 "datasource": {
977 "type": "elasticsearch",
978 - "uid": "wazuh_datasource_uid"
978 + "uid": "replace_datasource_uid"
979 },
980 "gridPos": {
981 "h": 1,
@@ -991,7 +991,7 @@
991 {
992 "datasource": {
993 "type": "elasticsearch",
994 - "uid": "wazuh_datasource_uid"
994 + "uid": "replace_datasource_uid"
995 },
996 "fieldConfig": {
997 "defaults": {
@@ -1219,7 +1219,7 @@
1219 {
1220 "datasource": {
1221 "type": "elasticsearch",
1222 - "uid": "wazuh_datasource_uid"
1222 + "uid": "replace_datasource_uid"
1223 },
1224 "fieldConfig": {
1225 "defaults": {
@@ -1318,7 +1318,7 @@
1318 ],
1319 "datasource": {
1320 "type": "elasticsearch",
1321 - "uid": "wazuh_datasource_uid"
1321 + "uid": "replace_datasource_uid"
1322 },
1323 "metrics": [
1324 {
@@ -1337,7 +1337,7 @@
1337 {
1338 "datasource": {
1339 "type": "elasticsearch",
1340 - "uid": "wazuh_datasource_uid"
1340 + "uid": "replace_datasource_uid"
1341 },
1342 "fieldConfig": {
1343 "defaults": {
@@ -1595,7 +1595,7 @@
1595 "bucketAggs": [],
1596 "datasource": {
1597 "type": "elasticsearch",
1598 - "uid": "wazuh_datasource_uid"
1598 + "uid": "replace_datasource_uid"
1599 },
1600 "metrics": [
1601 {
@@ -1635,7 +1635,7 @@
1635 {
1636 "datasource": {
1637 "type": "elasticsearch",
1638 - "uid": "wazuh_datasource_uid"
1638 + "uid": "replace_datasource_uid"
1639 },
1640 "fieldConfig": {
1641 "defaults": {
@@ -1889,7 +1889,7 @@
1889 "bucketAggs": [],
1890 "datasource": {
1891 "type": "elasticsearch",
1892 - "uid": "wazuh_datasource_uid"
1892 + "uid": "replace_datasource_uid"
1893 },
1894 "metrics": [
1895 {
@@ -1932,7 +1932,7 @@
1932 "collapsed": true,
1933 "datasource": {
1934 "type": "elasticsearch",
1935 - "uid": "wazuh_datasource_uid"
1935 + "uid": "replace_datasource_uid"
1936 },
1937 "gridPos": {
1938 "h": 1,
@@ -1945,7 +1945,7 @@
1945 {
1946 "datasource": {
1947 "type": "elasticsearch",
1948 - "uid": "wazuh_datasource_uid"
1948 + "uid": "replace_datasource_uid"
1949 },
1950 "fieldConfig": {
1951 "defaults": {
@@ -2011,7 +2011,7 @@
2011 ],
2012 "datasource": {
2013 "type": "elasticsearch",
2014 - "uid": "wazuh_datasource_uid"
2014 + "uid": "replace_datasource_uid"
2015 },
2016 "metrics": [
2017 {
@@ -2032,7 +2032,7 @@
2032 "columns": [],
2033 "datasource": {
2034 "type": "elasticsearch",
2035 - "uid": "wazuh_datasource_uid"
2035 + "uid": "replace_datasource_uid"
2036 },
2037 "fontSize": "100%",
2038 "gridPos": {
@@ -2102,7 +2102,7 @@
2102 ],
2103 "datasource": {
2104 "type": "elasticsearch",
2105 - "uid": "wazuh_datasource_uid"
2105 + "uid": "replace_datasource_uid"
2106 },
2107 "metrics": [
2108 {
@@ -2123,7 +2123,7 @@
2123 {
2124 "datasource": {
2125 "type": "elasticsearch",
2126 - "uid": "wazuh_datasource_uid"
2126 + "uid": "replace_datasource_uid"
2127 },
2128 "fieldConfig": {
2129 "defaults": {
@@ -2287,7 +2287,7 @@
2287 ],
2288 "datasource": {
2289 "type": "elasticsearch",
2290 - "uid": "wazuh_datasource_uid"
2290 + "uid": "replace_datasource_uid"
2291 },
2292 "metrics": [
2293 {
@@ -2317,7 +2317,7 @@
2317 {
2318 "datasource": {
2319 "type": "elasticsearch",
2320 - "uid": "wazuh_datasource_uid"
2320 + "uid": "replace_datasource_uid"
2321 },
2322 "fieldConfig": {
2323 "defaults": {
@@ -2481,7 +2481,7 @@
2481 ],
2482 "datasource": {
2483 "type": "elasticsearch",
2484 - "uid": "wazuh_datasource_uid"
2484 + "uid": "replace_datasource_uid"
2485 },
2486 "metrics": [
2487 {
@@ -2511,7 +2511,7 @@
2511 {
2512 "datasource": {
2513 "type": "elasticsearch",
2514 - "uid": "wazuh_datasource_uid"
2514 + "uid": "replace_datasource_uid"
2515 },
2516 "fieldConfig": {
2517 "defaults": {
@@ -2583,7 +2583,7 @@
2583 ],
2584 "datasource": {
2585 "type": "elasticsearch",
2586 - "uid": "wazuh_datasource_uid"
2586 + "uid": "replace_datasource_uid"
2587 },
2588 "metrics": [
2589 {
@@ -2605,7 +2605,7 @@
2605 {
2606 "datasource": {
2607 "type": "elasticsearch",
2608 - "uid": "wazuh_datasource_uid"
2608 + "uid": "replace_datasource_uid"
2609 },
2610 "fieldConfig": {
2611 "defaults": {
@@ -2772,7 +2772,7 @@
2772 ],
2773 "datasource": {
2774 "type": "elasticsearch",
2775 - "uid": "wazuh_datasource_uid"
2775 + "uid": "replace_datasource_uid"
2776 },
2777 "metrics": [
2778 {
@@ -2797,7 +2797,7 @@
2797 "collapsed": true,
2798 "datasource": {
2799 "type": "elasticsearch",
2800 - "uid": "wazuh_datasource_uid"
2800 + "uid": "replace_datasource_uid"
2801 },
2802 "gridPos": {
2803 "h": 1,
@@ -2810,7 +2810,7 @@
2810 {
2811 "datasource": {
2812 "type": "elasticsearch",
2813 - "uid": "wazuh_datasource_uid"
2813 + "uid": "replace_datasource_uid"
2814 },
2815 "fieldConfig": {
2816 "defaults": {
@@ -2991,7 +2991,7 @@
2991 "bucketAggs": [],
2992 "datasource": {
2993 "type": "elasticsearch",
2994 - "uid": "wazuh_datasource_uid"
2994 + "uid": "replace_datasource_uid"
2995 },
2996 "metrics": [
2997 {
@@ -3076,7 +3076,7 @@
3076 {
3077 "datasource": {
3078 "type": "elasticsearch",
3079 - "uid": "wazuh_datasource_uid"
3079 + "uid": "replace_datasource_uid"
3080 },
3081 "filters": [],
3082 "hide": 0,
@@ -3093,7 +3093,7 @@
3093 },
3094 "datasource": {
3095 "type": "elasticsearch",
3096 - "uid": "wazuh_datasource_uid"
3096 + "uid": "replace_datasource_uid"
3097 },
3098 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"rule_groups:vulnerability-detector\"}",
3099 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_users_and_groups.json
+36 -36
@@ -54,7 +54,7 @@
54 {
55 "datasource": {
56 "type": "elasticsearch",
57 - "uid": "wazuh_datasource_uid"
57 + "uid": "replace_datasource_uid"
58 },
59 "fieldConfig": {
60 "defaults": {
@@ -110,7 +110,7 @@
110 ],
111 "datasource": {
112 "type": "elasticsearch",
113 - "uid": "wazuh_datasource_uid"
113 + "uid": "replace_datasource_uid"
114 },
115 "metrics": [
116 {
@@ -130,7 +130,7 @@
130 {
131 "datasource": {
132 "type": "elasticsearch",
133 - "uid": "wazuh_datasource_uid"
133 + "uid": "replace_datasource_uid"
134 },
135 "fieldConfig": {
136 "defaults": {
@@ -215,7 +215,7 @@
215 ],
216 "datasource": {
217 "type": "elasticsearch",
218 - "uid": "wazuh_datasource_uid"
218 + "uid": "replace_datasource_uid"
219 },
220 "metrics": [
221 {
@@ -247,7 +247,7 @@
247 {
248 "datasource": {
249 "type": "elasticsearch",
250 - "uid": "wazuh_datasource_uid"
250 + "uid": "replace_datasource_uid"
251 },
252 "fieldConfig": {
253 "defaults": {
@@ -303,7 +303,7 @@
303 ],
304 "datasource": {
305 "type": "elasticsearch",
306 - "uid": "wazuh_datasource_uid"
306 + "uid": "replace_datasource_uid"
307 },
308 "metrics": [
309 {
@@ -323,7 +323,7 @@
323 {
324 "datasource": {
325 "type": "elasticsearch",
326 - "uid": "wazuh_datasource_uid"
326 + "uid": "replace_datasource_uid"
327 },
328 "fieldConfig": {
329 "defaults": {
@@ -408,7 +408,7 @@
408 ],
409 "datasource": {
410 "type": "elasticsearch",
411 - "uid": "wazuh_datasource_uid"
411 + "uid": "replace_datasource_uid"
412 },
413 "metrics": [
414 {
@@ -440,7 +440,7 @@
440 {
441 "datasource": {
442 "type": "elasticsearch",
443 - "uid": "wazuh_datasource_uid"
443 + "uid": "replace_datasource_uid"
444 },
445 "fieldConfig": {
446 "defaults": {
@@ -496,7 +496,7 @@
496 ],
497 "datasource": {
498 "type": "elasticsearch",
499 - "uid": "wazuh_datasource_uid"
499 + "uid": "replace_datasource_uid"
500 },
501 "metrics": [
502 {
@@ -516,7 +516,7 @@
516 {
517 "datasource": {
518 "type": "elasticsearch",
519 - "uid": "wazuh_datasource_uid"
519 + "uid": "replace_datasource_uid"
520 },
521 "fieldConfig": {
522 "defaults": {
@@ -601,7 +601,7 @@
601 ],
602 "datasource": {
603 "type": "elasticsearch",
604 - "uid": "wazuh_datasource_uid"
604 + "uid": "replace_datasource_uid"
605 },
606 "metrics": [
607 {
@@ -632,7 +632,7 @@
632 {
633 "datasource": {
634 "type": "elasticsearch",
635 - "uid": "wazuh_datasource_uid"
635 + "uid": "replace_datasource_uid"
636 },
637 "fieldConfig": {
638 "defaults": {
@@ -688,7 +688,7 @@
688 ],
689 "datasource": {
690 "type": "elasticsearch",
691 - "uid": "wazuh_datasource_uid"
691 + "uid": "replace_datasource_uid"
692 },
693 "metrics": [
694 {
@@ -708,7 +708,7 @@
708 {
709 "datasource": {
710 "type": "elasticsearch",
711 - "uid": "wazuh_datasource_uid"
711 + "uid": "replace_datasource_uid"
712 },
713 "fieldConfig": {
714 "defaults": {
@@ -798,7 +798,7 @@
798 ],
799 "datasource": {
800 "type": "elasticsearch",
801 - "uid": "wazuh_datasource_uid"
801 + "uid": "replace_datasource_uid"
802 },
803 "metrics": [
804 {
@@ -830,7 +830,7 @@
830 {
831 "datasource": {
832 "type": "elasticsearch",
833 - "uid": "wazuh_datasource_uid"
833 + "uid": "replace_datasource_uid"
834 },
835 "fieldConfig": {
836 "defaults": {
@@ -886,7 +886,7 @@
886 ],
887 "datasource": {
888 "type": "elasticsearch",
889 - "uid": "wazuh_datasource_uid"
889 + "uid": "replace_datasource_uid"
890 },
891 "metrics": [
892 {
@@ -906,7 +906,7 @@
906 {
907 "datasource": {
908 "type": "elasticsearch",
909 - "uid": "wazuh_datasource_uid"
909 + "uid": "replace_datasource_uid"
910 },
911 "fieldConfig": {
912 "defaults": {
@@ -1019,7 +1019,7 @@
1019 ],
1020 "datasource": {
1021 "type": "elasticsearch",
1022 - "uid": "wazuh_datasource_uid"
1022 + "uid": "replace_datasource_uid"
1023 },
1024 "metrics": [
1025 {
@@ -1052,7 +1052,7 @@
1052 {
1053 "datasource": {
1054 "type": "elasticsearch",
1055 - "uid": "wazuh_datasource_uid"
1055 + "uid": "replace_datasource_uid"
1056 },
1057 "fieldConfig": {
1058 "defaults": {
@@ -1207,7 +1207,7 @@
1207 "bucketAggs": [],
1208 "datasource": {
1209 "type": "elasticsearch",
1210 - "uid": "wazuh_datasource_uid"
1210 + "uid": "replace_datasource_uid"
1211 },
1212 "metrics": [
1213 {
@@ -1501,7 +1501,7 @@
1501 {
1502 "datasource": {
1503 "type": "elasticsearch",
1504 - "uid": "wazuh_datasource_uid"
1504 + "uid": "replace_datasource_uid"
1505 },
1506 "fieldConfig": {
1507 "defaults": {
@@ -1555,7 +1555,7 @@
1555 ],
1556 "datasource": {
1557 "type": "elasticsearch",
1558 - "uid": "wazuh_datasource_uid"
1558 + "uid": "replace_datasource_uid"
1559 },
1560 "metrics": [
1561 {
@@ -1575,7 +1575,7 @@
1575 {
1576 "datasource": {
1577 "type": "elasticsearch",
1578 - "uid": "wazuh_datasource_uid"
1578 + "uid": "replace_datasource_uid"
1579 },
1580 "fieldConfig": {
1581 "defaults": {
@@ -1664,7 +1664,7 @@
1664 ],
1665 "datasource": {
1666 "type": "elasticsearch",
1667 - "uid": "wazuh_datasource_uid"
1667 + "uid": "replace_datasource_uid"
1668 },
1669 "metrics": [
1670 {
@@ -1696,7 +1696,7 @@
1696 {
1697 "datasource": {
1698 "type": "elasticsearch",
1699 - "uid": "wazuh_datasource_uid"
1699 + "uid": "replace_datasource_uid"
1700 },
1701 "fieldConfig": {
1702 "defaults": {
@@ -1751,7 +1751,7 @@
1751 ],
1752 "datasource": {
1753 "type": "elasticsearch",
1754 - "uid": "wazuh_datasource_uid"
1754 + "uid": "replace_datasource_uid"
1755 },
1756 "metrics": [
1757 {
@@ -1771,7 +1771,7 @@
1771 {
1772 "datasource": {
1773 "type": "elasticsearch",
1774 - "uid": "wazuh_datasource_uid"
1774 + "uid": "replace_datasource_uid"
1775 },
1776 "fieldConfig": {
1777 "defaults": {
@@ -1860,7 +1860,7 @@
1860 ],
1861 "datasource": {
1862 "type": "elasticsearch",
1863 - "uid": "wazuh_datasource_uid"
1863 + "uid": "replace_datasource_uid"
1864 },
1865 "metrics": [
1866 {
@@ -1892,7 +1892,7 @@
1892 {
1893 "datasource": {
1894 "type": "elasticsearch",
1895 - "uid": "wazuh_datasource_uid"
1895 + "uid": "replace_datasource_uid"
1896 },
1897 "fieldConfig": {
1898 "defaults": {
@@ -1997,7 +1997,7 @@
1997 ],
1998 "datasource": {
1999 "type": "elasticsearch",
2000 - "uid": "wazuh_datasource_uid"
2000 + "uid": "replace_datasource_uid"
2001 },
2002 "metrics": [
2003 {
@@ -2030,7 +2030,7 @@
2030 {
2031 "datasource": {
2032 "type": "elasticsearch",
2033 - "uid": "wazuh_datasource_uid"
2033 + "uid": "replace_datasource_uid"
2034 },
2035 "fieldConfig": {
2036 "defaults": {
@@ -2184,7 +2184,7 @@
2184 "bucketAggs": [],
2185 "datasource": {
2186 "type": "elasticsearch",
2187 - "uid": "wazuh_datasource_uid"
2187 + "uid": "replace_datasource_uid"
2188 },
2189 "metrics": [
2190 {
@@ -2472,7 +2472,7 @@
2472 {
2473 "datasource": {
2474 "type": "elasticsearch",
2475 - "uid": "wazuh_datasource_uid"
2475 + "uid": "replace_datasource_uid"
2476 },
2477 "filters": [],
2478 "hide": 0,
@@ -2489,7 +2489,7 @@
2489 },
2490 "datasource": {
2491 "type": "elasticsearch",
2492 - "uid": "wazuh_datasource_uid"
2492 + "uid": "replace_datasource_uid"
2493 },
2494 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"(rule_group2:windows_system OR rule_group2:windows_application OR rule_group2:windows_security OR rule_group3:policy_changed)\"}",
2495 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_wazuh_inventory.json
+21 -21
@@ -59,7 +59,7 @@
59 {
60 "datasource": {
61 "type": "elasticsearch",
62 - "uid": "wazuh_datasource_uid"
62 + "uid": "replace_datasource_uid"
63 },
64 "fieldConfig": {
65 "defaults": {
@@ -126,7 +126,7 @@
126 ],
127 "datasource": {
128 "type": "elasticsearch",
129 - "uid": "wazuh_datasource_uid"
129 + "uid": "replace_datasource_uid"
130 },
131 "metrics": [
132 {
@@ -146,7 +146,7 @@
146 {
147 "datasource": {
148 "type": "elasticsearch",
149 - "uid": "wazuh_datasource_uid"
149 + "uid": "replace_datasource_uid"
150 },
151 "fieldConfig": {
152 "defaults": {
@@ -213,7 +213,7 @@
213 ],
214 "datasource": {
215 "type": "elasticsearch",
216 - "uid": "wazuh_datasource_uid"
216 + "uid": "replace_datasource_uid"
217 },
218 "metrics": [
219 {
@@ -233,7 +233,7 @@
233 {
234 "datasource": {
235 "type": "elasticsearch",
236 - "uid": "wazuh_datasource_uid"
236 + "uid": "replace_datasource_uid"
237 },
238 "fieldConfig": {
239 "defaults": {
@@ -300,7 +300,7 @@
300 ],
301 "datasource": {
302 "type": "elasticsearch",
303 - "uid": "wazuh_datasource_uid"
303 + "uid": "replace_datasource_uid"
304 },
305 "metrics": [
306 {
@@ -320,7 +320,7 @@
320 {
321 "datasource": {
322 "type": "elasticsearch",
323 - "uid": "wazuh_datasource_uid"
323 + "uid": "replace_datasource_uid"
324 },
325 "fieldConfig": {
326 "defaults": {
@@ -387,7 +387,7 @@
387 ],
388 "datasource": {
389 "type": "elasticsearch",
390 - "uid": "wazuh_datasource_uid"
390 + "uid": "replace_datasource_uid"
391 },
392 "metrics": [
393 {
@@ -407,7 +407,7 @@
407 {
408 "datasource": {
409 "type": "elasticsearch",
410 - "uid": "wazuh_datasource_uid"
410 + "uid": "replace_datasource_uid"
411 },
412 "fieldConfig": {
413 "defaults": {
@@ -474,7 +474,7 @@
474 ],
475 "datasource": {
476 "type": "elasticsearch",
477 - "uid": "wazuh_datasource_uid"
477 + "uid": "replace_datasource_uid"
478 },
479 "metrics": [
480 {
@@ -494,7 +494,7 @@
494 {
495 "datasource": {
496 "type": "elasticsearch",
497 - "uid": "wazuh_datasource_uid"
497 + "uid": "replace_datasource_uid"
498 },
499 "fieldConfig": {
500 "defaults": {
@@ -721,7 +721,7 @@
721 ],
722 "datasource": {
723 "type": "elasticsearch",
724 - "uid": "wazuh_datasource_uid"
724 + "uid": "replace_datasource_uid"
725 },
726 "metrics": [
727 {
@@ -741,7 +741,7 @@
741 {
742 "datasource": {
743 "type": "elasticsearch",
744 - "uid": "wazuh_datasource_uid"
744 + "uid": "replace_datasource_uid"
745 },
746 "fieldConfig": {
747 "defaults": {
@@ -979,7 +979,7 @@
979 ],
980 "datasource": {
981 "type": "elasticsearch",
982 - "uid": "wazuh_datasource_uid"
982 + "uid": "replace_datasource_uid"
983 },
984 "metrics": [
985 {
@@ -1014,7 +1014,7 @@
1014 {
1015 "datasource": {
1016 "type": "elasticsearch",
1017 - "uid": "wazuh_datasource_uid"
1017 + "uid": "replace_datasource_uid"
1018 },
1019 "fieldConfig": {
1020 "defaults": {
@@ -1252,7 +1252,7 @@
1252 ],
1253 "datasource": {
1254 "type": "elasticsearch",
1255 - "uid": "wazuh_datasource_uid"
1255 + "uid": "replace_datasource_uid"
1256 },
1257 "metrics": [
1258 {
@@ -1288,7 +1288,7 @@
1288 {
1289 "datasource": {
1290 "type": "elasticsearch",
1291 - "uid": "wazuh_datasource_uid"
1291 + "uid": "replace_datasource_uid"
1292 },
1293 "fieldConfig": {
1294 "defaults": {
@@ -1526,7 +1526,7 @@
1526 ],
1527 "datasource": {
1528 "type": "elasticsearch",
1529 - "uid": "wazuh_datasource_uid"
1529 + "uid": "replace_datasource_uid"
1530 },
1531 "metrics": [
1532 {
@@ -1562,7 +1562,7 @@
1562 {
1563 "datasource": {
1564 "type": "elasticsearch",
1565 - "uid": "wazuh_datasource_uid"
1565 + "uid": "replace_datasource_uid"
1566 },
1567 "fieldConfig": {
1568 "defaults": {
@@ -1789,7 +1789,7 @@
1789 "bucketAggs": [],
1790 "datasource": {
1791 "type": "elasticsearch",
1792 - "uid": "wazuh_datasource_uid"
1792 + "uid": "replace_datasource_uid"
1793 },
1794 "metrics": [
1795 {
@@ -2017,7 +2017,7 @@
2017 {
2018 "datasource": {
2019 "type": "elasticsearch",
2020 - "uid": "wazuh_datasource_uid"
2020 + "uid": "replace_datasource_uid"
2021 },
2022 "filters": [],
2023 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/edr_windows_event_logs.json
+67 -67
@@ -44,7 +44,7 @@
44 "collapsed": true,
45 "datasource": {
46 "type": "elasticsearch",
47 - "uid": "wazuh_datasource_uid"
47 + "uid": "replace_datasource_uid"
48 },
49 "gridPos": {
50 "h": 1,
@@ -57,7 +57,7 @@
57 {
58 "datasource": {
59 "type": "elasticsearch",
60 - "uid": "wazuh_datasource_uid"
60 + "uid": "replace_datasource_uid"
61 },
62 "fieldConfig": {
63 "defaults": {
@@ -140,7 +140,7 @@
140 {
141 "datasource": {
142 "type": "elasticsearch",
143 - "uid": "wazuh_datasource_uid"
143 + "uid": "replace_datasource_uid"
144 },
145 "fieldConfig": {
146 "defaults": {
@@ -402,7 +402,7 @@
402 {
403 "datasource": {
404 "type": "elasticsearch",
405 - "uid": "wazuh_datasource_uid"
405 + "uid": "replace_datasource_uid"
406 },
407 "fieldConfig": {
408 "defaults": {
@@ -582,7 +582,7 @@
582 {
583 "datasource": {
584 "type": "elasticsearch",
585 - "uid": "wazuh_datasource_uid"
585 + "uid": "replace_datasource_uid"
586 },
587 "fieldConfig": {
588 "defaults": {
@@ -680,7 +680,7 @@
680 "dashes": false,
681 "datasource": {
682 "type": "elasticsearch",
683 - "uid": "wazuh_datasource_uid"
683 + "uid": "replace_datasource_uid"
684 },
685 "fill": 1,
686 "fillGradient": 0,
@@ -792,7 +792,7 @@
792 {
793 "datasource": {
794 "type": "elasticsearch",
795 - "uid": "wazuh_datasource_uid"
795 + "uid": "replace_datasource_uid"
796 },
797 "fieldConfig": {
798 "defaults": {
@@ -1161,7 +1161,7 @@
1161 "collapsed": true,
1162 "datasource": {
1163 "type": "elasticsearch",
1164 - "uid": "wazuh_datasource_uid"
1164 + "uid": "replace_datasource_uid"
1165 },
1166 "gridPos": {
1167 "h": 1,
@@ -1174,7 +1174,7 @@
1174 {
1175 "datasource": {
1176 "type": "elasticsearch",
1177 - "uid": "wazuh_datasource_uid"
1177 + "uid": "replace_datasource_uid"
1178 },
1179 "fieldConfig": {
1180 "defaults": {
@@ -1257,7 +1257,7 @@
1257 {
1258 "datasource": {
1259 "type": "elasticsearch",
1260 - "uid": "wazuh_datasource_uid"
1260 + "uid": "replace_datasource_uid"
1261 },
1262 "fieldConfig": {
1263 "defaults": {
@@ -1519,7 +1519,7 @@
1519 {
1520 "datasource": {
1521 "type": "elasticsearch",
1522 - "uid": "wazuh_datasource_uid"
1522 + "uid": "replace_datasource_uid"
1523 },
1524 "fieldConfig": {
1525 "defaults": {
@@ -1699,7 +1699,7 @@
1699 {
1700 "datasource": {
1701 "type": "elasticsearch",
1702 - "uid": "wazuh_datasource_uid"
1702 + "uid": "replace_datasource_uid"
1703 },
1704 "fieldConfig": {
1705 "defaults": {
@@ -1797,7 +1797,7 @@
1797 "dashes": false,
1798 "datasource": {
1799 "type": "elasticsearch",
1800 - "uid": "wazuh_datasource_uid"
1800 + "uid": "replace_datasource_uid"
1801 },
1802 "fill": 1,
1803 "fillGradient": 0,
@@ -1909,7 +1909,7 @@
1909 {
1910 "datasource": {
1911 "type": "elasticsearch",
1912 - "uid": "wazuh_datasource_uid"
1912 + "uid": "replace_datasource_uid"
1913 },
1914 "fieldConfig": {
1915 "defaults": {
@@ -2279,7 +2279,7 @@
2279 "collapsed": true,
2280 "datasource": {
2281 "type": "elasticsearch",
2282 - "uid": "wazuh_datasource_uid"
2282 + "uid": "replace_datasource_uid"
2283 },
2284 "gridPos": {
2285 "h": 1,
@@ -2292,7 +2292,7 @@
2292 {
2293 "datasource": {
2294 "type": "elasticsearch",
2295 - "uid": "wazuh_datasource_uid"
2295 + "uid": "replace_datasource_uid"
2296 },
2297 "fieldConfig": {
2298 "defaults": {
@@ -2358,7 +2358,7 @@
2358 ],
2359 "datasource": {
2360 "type": "elasticsearch",
2361 - "uid": "wazuh_datasource_uid"
2361 + "uid": "replace_datasource_uid"
2362 },
2363 "metrics": [
2364 {
@@ -2379,7 +2379,7 @@
2379 {
2380 "datasource": {
2381 "type": "elasticsearch",
2382 - "uid": "wazuh_datasource_uid"
2382 + "uid": "replace_datasource_uid"
2383 },
2384 "fieldConfig": {
2385 "defaults": {
@@ -2609,7 +2609,7 @@
2609 ],
2610 "datasource": {
2611 "type": "elasticsearch",
2612 - "uid": "wazuh_datasource_uid"
2612 + "uid": "replace_datasource_uid"
2613 },
2614 "metrics": [
2615 {
@@ -2630,7 +2630,7 @@
2630 {
2631 "datasource": {
2632 "type": "elasticsearch",
2633 - "uid": "wazuh_datasource_uid"
2633 + "uid": "replace_datasource_uid"
2634 },
2635 "fieldConfig": {
2636 "defaults": {
@@ -2715,7 +2715,7 @@
2715 ],
2716 "datasource": {
2717 "type": "elasticsearch",
2718 - "uid": "wazuh_datasource_uid"
2718 + "uid": "replace_datasource_uid"
2719 },
2720 "metrics": [
2721 {
@@ -2736,7 +2736,7 @@
2736 {
2737 "datasource": {
2738 "type": "elasticsearch",
2739 - "uid": "wazuh_datasource_uid"
2739 + "uid": "replace_datasource_uid"
2740 },
2741 "fieldConfig": {
2742 "defaults": {
@@ -2799,7 +2799,7 @@
2799 ],
2800 "datasource": {
2801 "type": "elasticsearch",
2802 - "uid": "wazuh_datasource_uid"
2802 + "uid": "replace_datasource_uid"
2803 },
2804 "metrics": [
2805 {
@@ -2824,7 +2824,7 @@
2824 "dashes": false,
2825 "datasource": {
2826 "type": "elasticsearch",
2827 - "uid": "wazuh_datasource_uid"
2827 + "uid": "replace_datasource_uid"
2828 },
2829 "fill": 1,
2830 "fillGradient": 0,
@@ -2892,7 +2892,7 @@
2892 ],
2893 "datasource": {
2894 "type": "elasticsearch",
2895 - "uid": "wazuh_datasource_uid"
2895 + "uid": "replace_datasource_uid"
2896 },
2897 "metrics": [
2898 {
@@ -2940,7 +2940,7 @@
2940 {
2941 "datasource": {
2942 "type": "elasticsearch",
2943 - "uid": "wazuh_datasource_uid"
2943 + "uid": "replace_datasource_uid"
2944 },
2945 "fieldConfig": {
2946 "defaults": {
@@ -3140,7 +3140,7 @@
3140 ],
3141 "datasource": {
3142 "type": "elasticsearch",
3143 - "uid": "wazuh_datasource_uid"
3143 + "uid": "replace_datasource_uid"
3144 },
3145 "metrics": [
3146 {
@@ -3161,7 +3161,7 @@
3161 {
3162 "datasource": {
3163 "type": "elasticsearch",
3164 - "uid": "wazuh_datasource_uid"
3164 + "uid": "replace_datasource_uid"
3165 },
3166 "fieldConfig": {
3167 "defaults": {
@@ -3224,7 +3224,7 @@
3224 ],
3225 "datasource": {
3226 "type": "elasticsearch",
3227 - "uid": "wazuh_datasource_uid"
3227 + "uid": "replace_datasource_uid"
3228 },
3229 "metrics": [
3230 {
@@ -3245,7 +3245,7 @@
3245 {
3246 "datasource": {
3247 "type": "elasticsearch",
3248 - "uid": "wazuh_datasource_uid"
3248 + "uid": "replace_datasource_uid"
3249 },
3250 "fieldConfig": {
3251 "defaults": {
@@ -3334,7 +3334,7 @@
3334 ],
3335 "datasource": {
3336 "type": "elasticsearch",
3337 - "uid": "wazuh_datasource_uid"
3337 + "uid": "replace_datasource_uid"
3338 },
3339 "metrics": [
3340 {
@@ -3355,7 +3355,7 @@
3355 {
3356 "datasource": {
3357 "type": "elasticsearch",
3358 - "uid": "wazuh_datasource_uid"
3358 + "uid": "replace_datasource_uid"
3359 },
3360 "fieldConfig": {
3361 "defaults": {
@@ -3509,7 +3509,7 @@
3509 "bucketAggs": [],
3510 "datasource": {
3511 "type": "elasticsearch",
3512 - "uid": "wazuh_datasource_uid"
3512 + "uid": "replace_datasource_uid"
3513 },
3514 "metrics": [
3515 {
@@ -3790,7 +3790,7 @@
3790 "collapsed": true,
3791 "datasource": {
3792 "type": "elasticsearch",
3793 - "uid": "wazuh_datasource_uid"
3793 + "uid": "replace_datasource_uid"
3794 },
3795 "gridPos": {
3796 "h": 1,
@@ -3803,7 +3803,7 @@
3803 {
3804 "datasource": {
3805 "type": "elasticsearch",
3806 - "uid": "wazuh_datasource_uid"
3806 + "uid": "replace_datasource_uid"
3807 },
3808 "fieldConfig": {
3809 "defaults": {
@@ -3869,7 +3869,7 @@
3869 ],
3870 "datasource": {
3871 "type": "elasticsearch",
3872 - "uid": "wazuh_datasource_uid"
3872 + "uid": "replace_datasource_uid"
3873 },
3874 "metrics": [
3875 {
@@ -3890,7 +3890,7 @@
3890 {
3891 "datasource": {
3892 "type": "elasticsearch",
3893 - "uid": "wazuh_datasource_uid"
3893 + "uid": "replace_datasource_uid"
3894 },
3895 "fieldConfig": {
3896 "defaults": {
@@ -4090,7 +4090,7 @@
4090 ],
4091 "datasource": {
4092 "type": "elasticsearch",
4093 - "uid": "wazuh_datasource_uid"
4093 + "uid": "replace_datasource_uid"
4094 },
4095 "metrics": [
4096 {
@@ -4111,7 +4111,7 @@
4111 {
4112 "datasource": {
4113 "type": "elasticsearch",
4114 - "uid": "wazuh_datasource_uid"
4114 + "uid": "replace_datasource_uid"
4115 },
4116 "fieldConfig": {
4117 "defaults": {
@@ -4188,7 +4188,7 @@
4188 ],
4189 "datasource": {
4190 "type": "elasticsearch",
4191 - "uid": "wazuh_datasource_uid"
4191 + "uid": "replace_datasource_uid"
4192 },
4193 "metrics": [
4194 {
@@ -4209,7 +4209,7 @@
4209 {
4210 "datasource": {
4211 "type": "elasticsearch",
4212 - "uid": "wazuh_datasource_uid"
4212 + "uid": "replace_datasource_uid"
4213 },
4214 "fieldConfig": {
4215 "defaults": {
@@ -4286,7 +4286,7 @@
4286 ],
4287 "datasource": {
4288 "type": "elasticsearch",
4289 - "uid": "wazuh_datasource_uid"
4289 + "uid": "replace_datasource_uid"
4290 },
4291 "metrics": [
4292 {
@@ -4307,7 +4307,7 @@
4307 {
4308 "datasource": {
4309 "type": "elasticsearch",
4310 - "uid": "wazuh_datasource_uid"
4310 + "uid": "replace_datasource_uid"
4311 },
4312 "fieldConfig": {
4313 "defaults": {
@@ -4384,7 +4384,7 @@
4384 ],
4385 "datasource": {
4386 "type": "elasticsearch",
4387 - "uid": "wazuh_datasource_uid"
4387 + "uid": "replace_datasource_uid"
4388 },
4389 "metrics": [
4390 {
@@ -4409,7 +4409,7 @@
4409 "dashes": false,
4410 "datasource": {
4411 "type": "elasticsearch",
4412 - "uid": "wazuh_datasource_uid"
4412 + "uid": "replace_datasource_uid"
4413 },
4414 "fill": 1,
4415 "fillGradient": 0,
@@ -4477,7 +4477,7 @@
4477 ],
4478 "datasource": {
4479 "type": "elasticsearch",
4480 - "uid": "wazuh_datasource_uid"
4480 + "uid": "replace_datasource_uid"
4481 },
4482 "metrics": [
4483 {
@@ -4525,7 +4525,7 @@
4525 {
4526 "datasource": {
4527 "type": "elasticsearch",
4528 - "uid": "wazuh_datasource_uid"
4528 + "uid": "replace_datasource_uid"
4529 },
4530 "fieldConfig": {
4531 "defaults": {
@@ -4679,7 +4679,7 @@
4679 "bucketAggs": [],
4680 "datasource": {
4681 "type": "elasticsearch",
4682 - "uid": "wazuh_datasource_uid"
4682 + "uid": "replace_datasource_uid"
4683 },
4684 "metrics": [
4685 {
@@ -4931,7 +4931,7 @@
4931 "collapsed": true,
4932 "datasource": {
4933 "type": "elasticsearch",
4934 - "uid": "wazuh_datasource_uid"
4934 + "uid": "replace_datasource_uid"
4935 },
4936 "gridPos": {
4937 "h": 1,
@@ -4944,7 +4944,7 @@
4944 {
4945 "datasource": {
4946 "type": "elasticsearch",
4947 - "uid": "wazuh_datasource_uid"
4947 + "uid": "replace_datasource_uid"
4948 },
4949 "fieldConfig": {
4950 "defaults": {
@@ -5010,7 +5010,7 @@
5010 ],
5011 "datasource": {
5012 "type": "elasticsearch",
5013 - "uid": "wazuh_datasource_uid"
5013 + "uid": "replace_datasource_uid"
5014 },
5015 "metrics": [
5016 {
@@ -5031,7 +5031,7 @@
5031 {
5032 "datasource": {
5033 "type": "elasticsearch",
5034 - "uid": "wazuh_datasource_uid"
5034 + "uid": "replace_datasource_uid"
5035 },
5036 "fieldConfig": {
5037 "defaults": {
@@ -5246,7 +5246,7 @@
5246 ],
5247 "datasource": {
5248 "type": "elasticsearch",
5249 - "uid": "wazuh_datasource_uid"
5249 + "uid": "replace_datasource_uid"
5250 },
5251 "metrics": [
5252 {
@@ -5267,7 +5267,7 @@
5267 {
5268 "datasource": {
5269 "type": "elasticsearch",
5270 - "uid": "wazuh_datasource_uid"
5270 + "uid": "replace_datasource_uid"
5271 },
5272 "fieldConfig": {
5273 "defaults": {
@@ -5497,7 +5497,7 @@
5497 ],
5498 "datasource": {
5499 "type": "elasticsearch",
5500 - "uid": "wazuh_datasource_uid"
5500 + "uid": "replace_datasource_uid"
5501 },
5502 "metrics": [
5503 {
@@ -5518,7 +5518,7 @@
5518 {
5519 "datasource": {
5520 "type": "elasticsearch",
5521 - "uid": "wazuh_datasource_uid"
5521 + "uid": "replace_datasource_uid"
5522 },
5523 "fieldConfig": {
5524 "defaults": {
@@ -5607,7 +5607,7 @@
5607 ],
5608 "datasource": {
5609 "type": "elasticsearch",
5610 - "uid": "wazuh_datasource_uid"
5610 + "uid": "replace_datasource_uid"
5611 },
5612 "metrics": [
5613 {
@@ -5628,7 +5628,7 @@
5628 {
5629 "datasource": {
5630 "type": "elasticsearch",
5631 - "uid": "wazuh_datasource_uid"
5631 + "uid": "replace_datasource_uid"
5632 },
5633 "fieldConfig": {
5634 "defaults": {
@@ -5794,7 +5794,7 @@
5794 "bucketAggs": [],
5795 "datasource": {
5796 "type": "elasticsearch",
5797 - "uid": "wazuh_datasource_uid"
5797 + "uid": "replace_datasource_uid"
5798 },
5799 "metrics": [
5800 {
@@ -6062,7 +6062,7 @@
6062 "collapsed": true,
6063 "datasource": {
6064 "type": "elasticsearch",
6065 - "uid": "wazuh_datasource_uid"
6065 + "uid": "replace_datasource_uid"
6066 },
6067 "gridPos": {
6068 "h": 1,
@@ -6075,7 +6075,7 @@
6075 {
6076 "datasource": {
6077 "type": "elasticsearch",
6078 - "uid": "wazuh_datasource_uid"
6078 + "uid": "replace_datasource_uid"
6079 },
6080 "fieldConfig": {
6081 "defaults": {
@@ -6158,7 +6158,7 @@
6158 {
6159 "datasource": {
6160 "type": "elasticsearch",
6161 - "uid": "wazuh_datasource_uid"
6161 + "uid": "replace_datasource_uid"
6162 },
6163 "fieldConfig": {
6164 "defaults": {
@@ -6285,7 +6285,7 @@
6285 {
6286 "datasource": {
6287 "type": "elasticsearch",
6288 - "uid": "wazuh_datasource_uid"
6288 + "uid": "replace_datasource_uid"
6289 },
6290 "fieldConfig": {
6291 "defaults": {
@@ -6427,7 +6427,7 @@
6427 {
6428 "datasource": {
6429 "type": "elasticsearch",
6430 - "uid": "wazuh_datasource_uid"
6430 + "uid": "replace_datasource_uid"
6431 },
6432 "fieldConfig": {
6433 "defaults": {
@@ -6545,7 +6545,7 @@
6545 {
6546 "datasource": {
6547 "type": "elasticsearch",
6548 - "uid": "wazuh_datasource_uid"
6548 + "uid": "replace_datasource_uid"
6549 },
6550 "fieldConfig": {
6551 "defaults": {
@@ -7097,7 +7097,7 @@
7097 {
7098 "datasource": {
7099 "type": "elasticsearch",
7100 - "uid": "wazuh_datasource_uid"
7100 + "uid": "replace_datasource_uid"
7101 },
7102 "filters": [],
7103 "hide": 0,
@@ -7114,7 +7114,7 @@
7114 },
7115 "datasource": {
7116 "type": "elasticsearch",
7117 - "uid": "wazuh_datasource_uid"
7117 + "uid": "replace_datasource_uid"
7118 },
7119 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"(rule_group2:windows_system OR rule_group2:windows_application OR rule_group2:windows_security OR rule_group2:windows_logonsessions OR rule_group3:policy_changed OR rule_group4:software_policy)\"}",
7120 "hide": 0,
backend/app/connectors/grafana/dashboards/Wazuh/summary.json
+21 -21
@@ -42,7 +42,7 @@
42 {
43 "datasource": {
44 "type": "elasticsearch",
45 - "uid": "wazuh_datasource_uid"
45 + "uid": "replace_datasource_uid"
46 },
47 "fieldConfig": {
48 "defaults": {
@@ -124,7 +124,7 @@
124 {
125 "datasource": {
126 "type": "elasticsearch",
127 - "uid": "wazuh_datasource_uid"
127 + "uid": "replace_datasource_uid"
128 },
129 "fieldConfig": {
130 "defaults": {
@@ -328,7 +328,7 @@
328 {
329 "datasource": {
330 "type": "elasticsearch",
331 - "uid": "wazuh_datasource_uid"
331 + "uid": "replace_datasource_uid"
332 },
333 "gridPos": {
334 "h": 14,
@@ -353,7 +353,7 @@
353 "bucketAggs": [],
354 "datasource": {
355 "type": "elasticsearch",
356 - "uid": "wazuh_datasource_uid"
356 + "uid": "replace_datasource_uid"
357 },
358 "metrics": [
359 {
@@ -410,7 +410,7 @@
410 {
411 "datasource": {
412 "type": "elasticsearch",
413 - "uid": "wazuh_datasource_uid"
413 + "uid": "replace_datasource_uid"
414 },
415 "fieldConfig": {
416 "defaults": {
@@ -505,7 +505,7 @@
505 {
506 "datasource": {
507 "type": "elasticsearch",
508 - "uid": "wazuh_datasource_uid"
508 + "uid": "replace_datasource_uid"
509 },
510 "fieldConfig": {
511 "defaults": {
@@ -682,7 +682,7 @@
682 {
683 "datasource": {
684 "type": "elasticsearch",
685 - "uid": "wazuh_datasource_uid"
685 + "uid": "replace_datasource_uid"
686 },
687 "fieldConfig": {
688 "defaults": {
@@ -769,7 +769,7 @@
769 {
770 "datasource": {
771 "type": "elasticsearch",
772 - "uid": "wazuh_datasource_uid"
772 + "uid": "replace_datasource_uid"
773 },
774 "fieldConfig": {
775 "defaults": {
@@ -868,7 +868,7 @@
868 ],
869 "datasource": {
870 "type": "elasticsearch",
871 - "uid": "wazuh_datasource_uid"
871 + "uid": "replace_datasource_uid"
872 },
873 "metrics": [
874 {
@@ -888,7 +888,7 @@
888 {
889 "datasource": {
890 "type": "elasticsearch",
891 - "uid": "wazuh_datasource_uid"
891 + "uid": "replace_datasource_uid"
892 },
893 "fieldConfig": {
894 "defaults": {
@@ -972,7 +972,7 @@
972 {
973 "datasource": {
974 "type": "elasticsearch",
975 - "uid": "wazuh_datasource_uid"
975 + "uid": "replace_datasource_uid"
976 },
977 "fieldConfig": {
978 "defaults": {
@@ -1222,7 +1222,7 @@
1222 {
1223 "datasource": {
1224 "type": "elasticsearch",
1225 - "uid": "wazuh_datasource_uid"
1225 + "uid": "replace_datasource_uid"
1226 },
1227 "fieldConfig": {
1228 "defaults": {
@@ -1321,7 +1321,7 @@
1321 ],
1322 "datasource": {
1323 "type": "elasticsearch",
1324 - "uid": "wazuh_datasource_uid"
1324 + "uid": "replace_datasource_uid"
1325 },
1326 "metrics": [
1327 {
@@ -1340,7 +1340,7 @@
1340 {
1341 "datasource": {
1342 "type": "elasticsearch",
1343 - "uid": "wazuh_datasource_uid"
1343 + "uid": "replace_datasource_uid"
1344 },
1345 "fieldConfig": {
1346 "defaults": {
@@ -1869,7 +1869,7 @@
1869 {
1870 "datasource": {
1871 "type": "elasticsearch",
1872 - "uid": "wazuh_datasource_uid"
1872 + "uid": "replace_datasource_uid"
1873 },
1874 "fieldConfig": {
1875 "defaults": {
@@ -1968,7 +1968,7 @@
1968 ],
1969 "datasource": {
1970 "type": "elasticsearch",
1971 - "uid": "wazuh_datasource_uid"
1971 + "uid": "replace_datasource_uid"
1972 },
1973 "metrics": [
1974 {
@@ -1988,7 +1988,7 @@
1988 {
1989 "datasource": {
1990 "type": "elasticsearch",
1991 - "uid": "wazuh_datasource_uid"
1991 + "uid": "replace_datasource_uid"
1992 },
1993 "fieldConfig": {
1994 "defaults": {
@@ -2288,7 +2288,7 @@
2288 "bucketAggs": [],
2289 "datasource": {
2290 "type": "elasticsearch",
2291 - "uid": "wazuh_datasource_uid"
2291 + "uid": "replace_datasource_uid"
2292 },
2293 "metrics": [
2294 {
@@ -2812,7 +2812,7 @@
2812 {
2813 "datasource": {
2814 "type": "elasticsearch",
2815 - "uid": "wazuh_datasource_uid"
2815 + "uid": "replace_datasource_uid"
2816 },
2817 "filters": [],
2818 "hide": 0,
@@ -2829,7 +2829,7 @@
2829 },
2830 "datasource": {
2831 "type": "elasticsearch",
2832 - "uid": "wazuh_datasource_uid"
2832 + "uid": "replace_datasource_uid"
2833 },
2834 "definition": "{ \"find\": \"terms\", \"field\": \"agent_name\", \"query\": \"\"}",
2835 "hide": 0,
@@ -2856,7 +2856,7 @@
2856 },
2857 "datasource": {
2858 "type": "elasticsearch",
2859 - "uid": "wazuh_datasource_uid"
2859 + "uid": "replace_datasource_uid"
2860 },
2861 "definition": "{ \"find\": \"terms\", \"field\": \"rule_level\", \"query\": \"\"}",
2862 "hide": 0,
backend/app/connectors/grafana/services/dashboards.py
+1 -1
@@ -40,7 +40,7 @@ def load_dashboard_json(dashboard_info: tuple, datasource_uid: str) -> dict:
40 raise HTTPException(status_code=500, detail="Error decoding JSON from file")
41
42
43 -def replace_uid_value(obj, new_value, key_to_replace="uid", old_value="wazuh_datasource_uid"):
43 +def replace_uid_value(obj, new_value, key_to_replace="uid", old_value="replace_datasource_uid"):
44 if isinstance(obj, dict):
45 for k, v in obj.items():
46 if k == key_to_replace and v == old_value:
backend/app/connectors/services.py
+8
@@ -33,6 +33,7 @@ from app.connectors.wazuh_manager.utils.universal import verify_wazuh_manager_co
33
34 # from app.db.db_session import engine # Import the shared engine
35 from app.db.db_session import get_session
36 +from app.utils import verify_wazuh_worker_provisioning_connection
37
38 UPLOAD_FOLDER = "file-store"
39 UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), UPLOAD_FOLDER)
@@ -105,6 +106,12 @@ class GrafanaService(ConnectorServiceInterface):
106 return await verify_grafana_connection(connector.connector_name)
107
108
109 +# Wazuh Worker Provisioning Service
110 +class WazuhWorkerProvisioningService(ConnectorServiceInterface):
111 + async def verify_authentication(self, connector: ConnectorResponse) -> Optional[ConnectorResponse]:
112 + return await verify_wazuh_worker_provisioning_connection(connector.connector_name)
113 +
114 +
115 # Factory function to create a service instance based on connector name
116 def get_connector_service(connector_name: str) -> Type[ConnectorServiceInterface]:
117 service_map = {
@@ -118,6 +125,7 @@ def get_connector_service(connector_name: str) -> Type[ConnectorServiceInterface
125 "Sublime": SublimeService,
126 "InfluxDB": InfluxDBService,
127 "Grafana": GrafanaService,
128 + "Wazuh Worker Provisioning": WazuhWorkerProvisioningService,
129 }
130 return service_map.get(connector_name, None)
131
backend/app/customer_provisioning/routes/decommission.py new
+59
@@ -0,0 +1,59 @@
1 +from fastapi import APIRouter
2 +from fastapi import Body
3 +from fastapi import Depends
4 +from fastapi import HTTPException
5 +from fastapi import Security
6 +from loguru import logger
7 +from sqlalchemy.ext.asyncio import AsyncSession
8 +from sqlalchemy.future import select
9 +
10 +from app.auth.utils import AuthHandler
11 +from app.customer_provisioning.schema.decommission import DecommissionCustomerResponse
12 +from app.customer_provisioning.services.decommission import decomission_wazuh_customer
13 +from app.db.db_session import get_session
14 +from app.db.universal_models import Customers
15 +from app.db.universal_models import CustomersMeta
16 +
17 +# App specific imports
18 +
19 +
20 +customer_decommissioning_router = APIRouter()
21 +
22 +
23 +async def check_customermeta_exists(customer_name: str, session: AsyncSession = Depends(get_session)) -> 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.
29 + session (AsyncSession, optional): The database session. Defaults to Depends(get_session).
30 +
31 + Returns:
32 + CustomersMeta: The customer object if found.
33 +
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))
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.")
43 +
44 + return customer_meta
45 +
46 +
47 +@customer_decommissioning_router.post(
48 + "/decommission",
49 + response_model=DecommissionCustomerResponse,
50 + description="Decommission Customer",
51 + dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
52 +)
53 +async def decommission_customer_route(
54 + _customer: CustomersMeta = Depends(check_customermeta_exists),
55 + session: AsyncSession = Depends(get_session),
56 +):
57 + logger.info("Decommissioning customer")
58 + customer_decommission = await decomission_wazuh_customer(_customer, session=session)
59 + return customer_decommission
backend/app/customer_provisioning/routes/provision.py
+4 -11
@@ -1,10 +1,4 @@
1 -import json
2 -import os
3 -from pathlib import Path
4 -from typing import List
5 -
1 from fastapi import APIRouter
7 -from fastapi import BackgroundTasks
2 from fastapi import Body
3 from fastapi import Depends
4 from fastapi import HTTPException
@@ -14,9 +8,9 @@ from sqlalchemy.ext.asyncio import AsyncSession
8 from sqlalchemy.future import select
9
10 from app.auth.utils import AuthHandler
17 -from app.connectors.services import ConnectorServices
11 +from app.customer_provisioning.schema.provision import CustomerProvisionResponse
12 from app.customer_provisioning.schema.provision import ProvisionNewCustomer
19 -from app.customer_provisioning.services.provision_wazuh import provision_wazuh_customer
13 +from app.customer_provisioning.services.provision import provision_wazuh_customer
14 from app.db.db_session import get_session
15 from app.db.universal_models import Customers
16
@@ -39,7 +33,7 @@ async def check_customer_exists(customer_name: str, session: AsyncSession = Depe
33
34 @customer_provisioning_router.post(
35 "/provision",
42 - # response_model=GrafanaDashboardResponse,
36 + response_model=CustomerProvisionResponse,
37 description="Provision New Customer",
38 dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
39 )
@@ -50,5 +44,4 @@ async def provision_customer_route(
44 ):
45 logger.info("Provisioning new customer")
46 customer_provision = await provision_wazuh_customer(request, session=session)
53 -
54 - return {"message": "Provisioning new customer"}
47 + return customer_provision
backend/app/customer_provisioning/schema/decommission.py new
+21
@@ -0,0 +1,21 @@
1 +from typing import List
2 +
3 +from pydantic import BaseModel
4 +from pydantic import Field
5 +
6 +
7 +class DecommissionedData(BaseModel):
8 + agents_deleted: List[str] = Field(..., example=["agent1", "agent2"], description="List of agents deleted")
9 + groups_deleted: List[str] = Field(..., example=["group1", "group2"], description="List of groups deleted")
10 + stream_deleted: str = Field(..., example="stream1", description="Stream deleted")
11 + index_deleted: str = Field(..., example="index1", description="Index deleted")
12 +
13 +
14 +class DecommissionCustomerResponse(BaseModel):
15 + message: str = Field(
16 + ...,
17 + example="Customer decommissioned successfully",
18 + description="Message indicating the customer was decommissioned successfully",
19 + )
20 + success: bool = Field(..., example=True, description="Whether the customer was decommissioned successfully or not")
21 + decomissioned_data: DecommissionedData = Field(..., description="Data from the decomissioning process")
backend/app/customer_provisioning/schema/grafana.py new
+115
@@ -0,0 +1,115 @@
1 +from datetime import datetime
2 +from typing import Dict
3 +
4 +from pydantic import BaseModel
5 +from pydantic import Field
6 +
7 +
8 +# ! Organization ! #
9 +class GrafanaOrganizationCreation(BaseModel):
10 + message: str = Field(..., description="Message detailing the outcome of the request")
11 + orgId: int = Field(..., description="ID of the created organization")
12 +
13 +
14 +# ! Data Source ! #
15 +class GrafanaSecureJsonData(BaseModel):
16 + basicAuthPassword: str = Field(..., alias="basicAuthPassword")
17 +
18 +
19 +class GrafanaJsonData(BaseModel):
20 + database: str = Field(..., alias="database")
21 + flavor: str = Field(..., alias="flavor")
22 + version: str = Field(..., alias="version")
23 + includeFrozen: bool = Field(False, alias="includeFrozen")
24 + logLevelField: str = Field(..., alias="logLevelField")
25 + logMessageField: str = Field(..., alias="logMessageField")
26 + maxConcurrentShardRequests: int = Field(5, alias="maxConcurrentShardRequests")
27 + timeField: str = Field(..., alias="timeField")
28 + tlsSkipVerify: bool = Field(True, alias="tlsSkipVerify")
29 +
30 +
31 +class GrafanaDatasource(BaseModel):
32 + name: str
33 + type: str
34 + typeName: str = Field(..., alias="typeName")
35 + access: str
36 + url: str
37 + database: str
38 + basicAuth: bool = Field(True, alias="basicAuth")
39 + basicAuthUser: str = Field(..., alias="basicAuthUser")
40 + secureJsonData: GrafanaSecureJsonData
41 + isDefault: bool = Field(False, alias="isDefault")
42 + jsonData: GrafanaJsonData
43 + readOnly: bool = Field(True, alias="readOnly")
44 +
45 +
46 +# ! Datasource Creation Response! #
47 +class DataSourceCreationJsonData(BaseModel):
48 + database: str = Field(..., alias="database")
49 + flavor: str = Field(..., alias="flavor")
50 + includeFrozen: bool = Field(..., alias="includeFrozen")
51 + logLevelField: str = Field(..., alias="logLevelField")
52 + logMessageField: str = Field(..., alias="logMessageField")
53 + maxConcurrentShardRequests: int = Field(..., alias="maxConcurrentShardRequests")
54 + timeField: str = Field(..., alias="timeField")
55 + tlsSkipVerify: bool = Field(..., alias="tlsSkipVerify")
56 + version: str
57 +
58 +
59 +class DataSourceCreationSecureJsonFields(BaseModel):
60 + basicAuthPassword: bool = Field(..., alias="basicAuthPassword")
61 +
62 +
63 +class DataSourceCreationDatasource(BaseModel):
64 + id: int
65 + uid: str
66 + orgId: int = Field(..., alias="orgId")
67 + name: str
68 + type: str
69 + typeLogoUrl: str = Field(..., alias="typeLogoUrl")
70 + access: str
71 + url: str
72 + user: str
73 + database: str
74 + basicAuth: bool = Field(..., alias="basicAuth")
75 + basicAuthUser: str = Field(..., alias="basicAuthUser")
76 + withCredentials: bool = Field(..., alias="withCredentials")
77 + isDefault: bool = Field(..., alias="isDefault")
78 + jsonData: DataSourceCreationJsonData
79 + secureJsonFields: DataSourceCreationSecureJsonFields = Field(..., alias="secureJsonFields")
80 + version: int
81 + readOnly: bool = Field(..., alias="readOnly")
82 +
83 +
84 +class GrafanaDataSourceCreationResponse(BaseModel):
85 + datasource: DataSourceCreationDatasource
86 + id: int
87 + message: str
88 + name: str
89 +
90 +
91 +# ! Folder Creation Response! #
92 +class GrafanaFolderCreationResponse(BaseModel):
93 + id: int
94 + uid: str
95 + title: str
96 + url: str
97 + hasAcl: bool = Field(..., alias="hasAcl")
98 + canSave: bool = Field(..., alias="canSave")
99 + canEdit: bool = Field(..., alias="canEdit")
100 + canAdmin: bool = Field(..., alias="canAdmin")
101 + canDelete: bool = Field(..., alias="canDelete")
102 + createdBy: str = Field(..., alias="createdBy")
103 + created: datetime
104 + updatedBy: str = Field(..., alias="updatedBy")
105 + updated: datetime
106 + version: int
107 +
108 +
109 +# ! OpenSearch Version ! #
110 +class NodeInfo(BaseModel):
111 + version: str
112 +
113 +
114 +class NodesVersionResponse(BaseModel):
115 + nodes: Dict[str, NodeInfo]
backend/app/customer_provisioning/schema/graylog.py new
+158
@@ -0,0 +1,158 @@
1 +from typing import List
2 +from typing import Optional
3 +
4 +from pydantic import BaseModel
5 +from pydantic import Field
6 +
7 +
8 +#! INDEX SETS !#
9 +class TimeBasedRotationStrategyConfig(BaseModel):
10 + type: str
11 + rotation_period: Optional[str] = None
12 +
13 +
14 +class TimeBasedRetentionStrategyConfig(BaseModel):
15 + type: str
16 + max_number_of_indices: Optional[int] = None
17 +
18 +
19 +class TimeBasedIndexSet(BaseModel):
20 + title: str
21 + description: str
22 + index_prefix: str
23 + rotation_strategy_class: str
24 + rotation_strategy: TimeBasedRotationStrategyConfig
25 + retention_strategy_class: str
26 + retention_strategy: TimeBasedRetentionStrategyConfig
27 + creation_date: str
28 + index_analyzer: str
29 + shards: int
30 + replicas: int
31 + index_optimization_max_num_segments: int
32 + index_optimization_disabled: bool
33 + writable: bool
34 + field_type_refresh_interval: int
35 +
36 + class Config:
37 + schema_extra = {
38 + "example": {
39 + "title": "Wazuh - Example Company",
40 + "description": "Wazuh - Example Company",
41 + "index_prefix": "wazuh-examplecode",
42 + "rotation_strategy_class": "org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategy",
43 + "rotation_strategy": {
44 + "type": "org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategyConfig",
45 + "max_size": 2684354560,
46 + },
47 + "retention_strategy_class": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy",
48 + "retention_strategy": {
49 + "type": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig",
50 + "max_number_of_indices": 20,
51 + },
52 + "creation_date": "2021-01-01T00:00:00.000Z",
53 + "index_analyzer": "standard",
54 + "shards": 1,
55 + "replicas": 0,
56 + "index_optimization_max_num_segments": 1,
57 + "index_optimization_disabled": False,
58 + "writable": True,
59 + "field_type_refresh_interval": 5000,
60 + },
61 + }
62 +
63 +
64 +class RotationStrategyConfig(BaseModel):
65 + type: str
66 + rotation_period: str = Field(..., alias="rotation_period")
67 + max_rotation_period: Optional[str] = Field(None, alias="max_rotation_period")
68 + rotate_empty_index_set: bool = Field(..., alias="rotate_empty_index_set")
69 +
70 +
71 +class RetentionStrategyConfig(BaseModel):
72 + type: str
73 + max_number_of_indices: int = Field(..., alias="max_number_of_indices")
74 +
75 +
76 +class GraylogIndexSetData(BaseModel):
77 + id: str
78 + title: str
79 + description: str
80 + can_be_default: bool = Field(..., alias="can_be_default")
81 + index_prefix: str = Field(..., alias="index_prefix")
82 + shards: int
83 + replicas: int
84 + rotation_strategy_class: str = Field(..., alias="rotation_strategy_class")
85 + rotation_strategy: RotationStrategyConfig
86 + retention_strategy_class: str = Field(..., alias="retention_strategy_class")
87 + retention_strategy: RetentionStrategyConfig
88 + creation_date: str = Field(..., alias="creation_date")
89 + index_analyzer: str = Field(..., alias="index_analyzer")
90 + index_optimization_max_num_segments: int = Field(..., alias="index_optimization_max_num_segments")
91 + index_optimization_disabled: bool = Field(..., alias="index_optimization_disabled")
92 + field_type_refresh_interval: int = Field(..., alias="field_type_refresh_interval")
93 + index_template_type: Optional[str] = Field(None, alias="index_template_type")
94 + default: bool
95 + writable: bool
96 +
97 +
98 +class GraylogIndexSetCreationResponse(BaseModel):
99 + data: GraylogIndexSetData
100 + success: bool
101 + message: str
102 +
103 +
104 +# ! STREAMS ! #
105 +class StreamRule(BaseModel):
106 + field: str
107 + type: int
108 + inverted: bool
109 + value: str
110 +
111 +
112 +class WazuhEventStream(BaseModel):
113 + title: str = Field(..., description="Title of the stream")
114 + description: str = Field(..., description="Description of the stream")
115 + index_set_id: str = Field(..., description="ID of the associated index set")
116 + rules: List[StreamRule] = Field(..., description="List of rules for the stream")
117 + matching_type: str = Field(..., description="Matching type for the rules")
118 + remove_matches_from_default_stream: bool = Field(..., description="Whether to remove matches from the default stream")
119 + content_pack: Optional[str] = Field(None, description="Associated content pack, if any")
120 +
121 + class Config:
122 + schema_extra = {
123 + "example": {
124 + "title": "WAZUH EVENTS CUSTOMERS - Example Company",
125 + "description": "WAZUH EVENTS CUSTOMERS - Example Company",
126 + "index_set_id": "12345",
127 + "rules": [{"field": "agent_labels_customer", "type": 1, "inverted": False, "value": "ExampleCode"}],
128 + "matching_type": "AND",
129 + "remove_matches_from_default_stream": True,
130 + "content_pack": None,
131 + },
132 + }
133 +
134 +
135 +class StreamData(BaseModel):
136 + stream_id: str = Field(..., description="ID of the created stream")
137 +
138 +
139 +class StreamCreationResponse(BaseModel):
140 + data: StreamData
141 + success: bool = Field(..., description="Indicates if the request was successful")
142 + message: str = Field(..., description="A message detailing the outcome of the request")
143 +
144 +
145 +class StreamAndPipelineData(BaseModel):
146 + stream_id: str = Field(..., description="ID of the stream")
147 + pipeline_ids: List[str] = Field(..., description="List of pipeline IDs connected to the stream")
148 +
149 +
150 +class StreamConnectionToPipelineRequest(BaseModel):
151 + stream_id: str = Field(..., description="ID of the stream to connect")
152 + pipeline_ids: List[str] = Field(..., description="List of pipeline IDs to connect to the stream")
153 +
154 +
155 +class StreamConnectionToPipelineResponse(BaseModel):
156 + data: StreamAndPipelineData
157 + success: bool = Field(..., description="Indicates if the request was successful")
158 + message: str = Field(..., description="A message detailing the outcome of the request")
backend/app/customer_provisioning/schema/provision.py
+14 -276
@@ -1,7 +1,5 @@
1 import re
2 -from datetime import datetime
2 from enum import Enum
4 -from typing import Dict
3 from typing import List
4 from typing import Optional
5
@@ -10,6 +8,7 @@ from pydantic import Field
8 from pydantic import validator
9
10 from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
11 +from app.db.universal_models import CustomersMeta
12
13
14 class CustomerSubsctipion(Enum):
@@ -34,10 +33,17 @@ class ProvisionNewCustomer(BaseModel):
33 example=["Wazuh", "Office365"],
34 description="List of subscriptions for the customer",
35 )
37 - dashboards_to_include: DashboardProvisionRequest = Field(..., description="Dashboards to include in the customer's Grafana instance")
36 + dashboards_to_include: DashboardProvisionRequest = Field(
37 + "EDR_DLL_SIDE_LOADING",
38 + description="Dashboards to include in the customer's Grafana instance",
39 + )
40 wazuh_auth_password: str = Field(..., description="Password for the Wazuh API user")
41 wazuh_registration_port: str = Field(..., description="Port for the Wazuh registration service")
42 wazuh_logs_port: str = Field(..., description="Port for the Wazuh logs service")
43 + wazuh_api_port: str = Field(..., description="Port for the Wazuh API service")
44 + wazuh_cluster_name: str = Field(..., description="Name of the Wazuh cluster")
45 + wazuh_cluster_key: str = Field(..., description="Password for the Wazuh cluster")
46 + wazuh_master_ip: str = Field(..., description="IP address of the Wazuh master")
47
48 @validator("customer_index_name")
49 def validate_customer_index_name(cls, v):
@@ -58,276 +64,8 @@ class CustomerProvisionMeta(BaseModel):
64 grafana_edr_folder_id: int
65
66
61 -class WazuhAgentsTemplatePaths(Enum):
62 - LINUX_AGENT = ("templates", "linux_agent.conf")
63 - WINDOWS_AGENT = ("templates", "windows_agent.conf")
64 - MAC_AGENT = ("templates", "mac_agent.conf")
65 -
66 -
67 -####################################### ! GRAYLOG PROVISIONING ! #########################
68 -
69 -
70 -#! INDEX SETS !#
71 -class TimeBasedRotationStrategyConfig(BaseModel):
72 - type: str
73 - rotation_period: Optional[str] = None
74 -
75 -
76 -class TimeBasedRetentionStrategyConfig(BaseModel):
77 - type: str
78 - max_number_of_indices: Optional[int] = None
79 -
80 -
81 -class TimeBasedIndexSet(BaseModel):
82 - title: str
83 - description: str
84 - index_prefix: str
85 - rotation_strategy_class: str
86 - rotation_strategy: TimeBasedRotationStrategyConfig
87 - retention_strategy_class: str
88 - retention_strategy: TimeBasedRetentionStrategyConfig
89 - creation_date: str
90 - index_analyzer: str
91 - shards: int
92 - replicas: int
93 - index_optimization_max_num_segments: int
94 - index_optimization_disabled: bool
95 - writable: bool
96 - field_type_refresh_interval: int
97 -
98 - class Config:
99 - schema_extra = {
100 - "example": {
101 - "title": "Wazuh - Example Company",
102 - "description": "Wazuh - Example Company",
103 - "index_prefix": "wazuh-examplecode",
104 - "rotation_strategy_class": "org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategy",
105 - "rotation_strategy": {
106 - "type": "org.graylog2.indexer.rotation.strategies.SizeBasedRotationStrategyConfig",
107 - "max_size": 2684354560,
108 - },
109 - "retention_strategy_class": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy",
110 - "retention_strategy": {
111 - "type": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig",
112 - "max_number_of_indices": 20,
113 - },
114 - "creation_date": "2021-01-01T00:00:00.000Z",
115 - "index_analyzer": "standard",
116 - "shards": 1,
117 - "replicas": 0,
118 - "index_optimization_max_num_segments": 1,
119 - "index_optimization_disabled": False,
120 - "writable": True,
121 - "field_type_refresh_interval": 5000,
122 - },
123 - }
124 -
125 -
126 -class RotationStrategyConfig(BaseModel):
127 - type: str
128 - rotation_period: str = Field(..., alias="rotation_period")
129 - max_rotation_period: Optional[str] = Field(None, alias="max_rotation_period")
130 - rotate_empty_index_set: bool = Field(..., alias="rotate_empty_index_set")
131 -
132 -
133 -class RetentionStrategyConfig(BaseModel):
134 - type: str
135 - max_number_of_indices: int = Field(..., alias="max_number_of_indices")
136 -
137 -
138 -class GraylogIndexSetData(BaseModel):
139 - id: str
140 - title: str
141 - description: str
142 - can_be_default: bool = Field(..., alias="can_be_default")
143 - index_prefix: str = Field(..., alias="index_prefix")
144 - shards: int
145 - replicas: int
146 - rotation_strategy_class: str = Field(..., alias="rotation_strategy_class")
147 - rotation_strategy: RotationStrategyConfig
148 - retention_strategy_class: str = Field(..., alias="retention_strategy_class")
149 - retention_strategy: RetentionStrategyConfig
150 - creation_date: str = Field(..., alias="creation_date")
151 - index_analyzer: str = Field(..., alias="index_analyzer")
152 - index_optimization_max_num_segments: int = Field(..., alias="index_optimization_max_num_segments")
153 - index_optimization_disabled: bool = Field(..., alias="index_optimization_disabled")
154 - field_type_refresh_interval: int = Field(..., alias="field_type_refresh_interval")
155 - index_template_type: Optional[str] = Field(None, alias="index_template_type")
156 - default: bool
157 - writable: bool
158 -
159 -
160 -class GraylogIndexSetCreationResponse(BaseModel):
161 - data: GraylogIndexSetData
162 - success: bool
163 - message: str
164 -
165 -
166 -# ! STREAMS ! #
167 -class StreamRule(BaseModel):
168 - field: str
169 - type: int
170 - inverted: bool
171 - value: str
172 -
173 -
174 -class WazuhEventStream(BaseModel):
175 - title: str = Field(..., description="Title of the stream")
176 - description: str = Field(..., description="Description of the stream")
177 - index_set_id: str = Field(..., description="ID of the associated index set")
178 - rules: List[StreamRule] = Field(..., description="List of rules for the stream")
179 - matching_type: str = Field(..., description="Matching type for the rules")
180 - remove_matches_from_default_stream: bool = Field(..., description="Whether to remove matches from the default stream")
181 - content_pack: Optional[str] = Field(None, description="Associated content pack, if any")
182 -
183 - class Config:
184 - schema_extra = {
185 - "example": {
186 - "title": "WAZUH EVENTS CUSTOMERS - Example Company",
187 - "description": "WAZUH EVENTS CUSTOMERS - Example Company",
188 - "index_set_id": "12345",
189 - "rules": [{"field": "agent_labels_customer", "type": 1, "inverted": False, "value": "ExampleCode"}],
190 - "matching_type": "AND",
191 - "remove_matches_from_default_stream": True,
192 - "content_pack": None,
193 - },
194 - }
195 -
196 -
197 -class StreamData(BaseModel):
198 - stream_id: str = Field(..., description="ID of the created stream")
199 -
200 -
201 -class StreamCreationResponse(BaseModel):
202 - data: StreamData
203 - success: bool = Field(..., description="Indicates if the request was successful")
204 - message: str = Field(..., description="A message detailing the outcome of the request")
205 -
206 -
207 -class StreamAndPipelineData(BaseModel):
208 - stream_id: str = Field(..., description="ID of the stream")
209 - pipeline_ids: List[str] = Field(..., description="List of pipeline IDs connected to the stream")
210 -
211 -
212 -class StreamConnectionToPipelineRequest(BaseModel):
213 - stream_id: str = Field(..., description="ID of the stream to connect")
214 - pipeline_ids: List[str] = Field(..., description="List of pipeline IDs to connect to the stream")
215 -
216 -
217 -class StreamConnectionToPipelineResponse(BaseModel):
218 - data: StreamAndPipelineData
219 - success: bool = Field(..., description="Indicates if the request was successful")
220 - message: str = Field(..., description="A message detailing the outcome of the request")
221 -
222 -
223 -####################################### ! GRAFANA PROVISIONING ! #########################
224 -
225 -
226 -# ! Organization ! #
227 -class GrafanaOrganizationCreation(BaseModel):
228 - message: str = Field(..., description="Message detailing the outcome of the request")
229 - orgId: int = Field(..., description="ID of the created organization")
230 -
231 -
232 -# ! Data Source ! #
233 -class GrafanaSecureJsonData(BaseModel):
234 - basicAuthPassword: str = Field(..., alias="basicAuthPassword")
235 -
236 -
237 -class GrafanaJsonData(BaseModel):
238 - database: str = Field(..., alias="database")
239 - flavor: str = Field(..., alias="flavor")
240 - version: str = Field(..., alias="version")
241 - includeFrozen: bool = Field(False, alias="includeFrozen")
242 - logLevelField: str = Field(..., alias="logLevelField")
243 - logMessageField: str = Field(..., alias="logMessageField")
244 - maxConcurrentShardRequests: int = Field(5, alias="maxConcurrentShardRequests")
245 - timeField: str = Field(..., alias="timeField")
246 - tlsSkipVerify: bool = Field(True, alias="tlsSkipVerify")
247 -
248 -
249 -class GrafanaDatasource(BaseModel):
250 - name: str
251 - type: str
252 - typeName: str = Field(..., alias="typeName")
253 - access: str
254 - url: str
255 - database: str
256 - basicAuth: bool = Field(True, alias="basicAuth")
257 - basicAuthUser: str = Field(..., alias="basicAuthUser")
258 - secureJsonData: GrafanaSecureJsonData
259 - isDefault: bool = Field(False, alias="isDefault")
260 - jsonData: GrafanaJsonData
261 - readOnly: bool = Field(True, alias="readOnly")
262 -
263 -
264 -# ! Datasource Creation Response! #
265 -class DataSourceCreationJsonData(BaseModel):
266 - database: str = Field(..., alias="database")
267 - flavor: str = Field(..., alias="flavor")
268 - includeFrozen: bool = Field(..., alias="includeFrozen")
269 - logLevelField: str = Field(..., alias="logLevelField")
270 - logMessageField: str = Field(..., alias="logMessageField")
271 - maxConcurrentShardRequests: int = Field(..., alias="maxConcurrentShardRequests")
272 - timeField: str = Field(..., alias="timeField")
273 - tlsSkipVerify: bool = Field(..., alias="tlsSkipVerify")
274 - version: str
275 -
276 -
277 -class DataSourceCreationSecureJsonFields(BaseModel):
278 - basicAuthPassword: bool = Field(..., alias="basicAuthPassword")
279 -
280 -
281 -class DataSourceCreationDatasource(BaseModel):
282 - id: int
283 - uid: str
284 - orgId: int = Field(..., alias="orgId")
285 - name: str
286 - type: str
287 - typeLogoUrl: str = Field(..., alias="typeLogoUrl")
288 - access: str
289 - url: str
290 - user: str
291 - database: str
292 - basicAuth: bool = Field(..., alias="basicAuth")
293 - basicAuthUser: str = Field(..., alias="basicAuthUser")
294 - withCredentials: bool = Field(..., alias="withCredentials")
295 - isDefault: bool = Field(..., alias="isDefault")
296 - jsonData: DataSourceCreationJsonData
297 - secureJsonFields: DataSourceCreationSecureJsonFields = Field(..., alias="secureJsonFields")
298 - version: int
299 - readOnly: bool = Field(..., alias="readOnly")
300 -
301 -
302 -class GrafanaDataSourceCreationResponse(BaseModel):
303 - datasource: DataSourceCreationDatasource
304 - id: int
305 - message: str
306 - name: str
307 -
308 -
309 -# ! Folder Creation Response! #
310 -class GrafanaFolderCreationResponse(BaseModel):
311 - id: int
312 - uid: str
313 - title: str
314 - url: str
315 - hasAcl: bool = Field(..., alias="hasAcl")
316 - canSave: bool = Field(..., alias="canSave")
317 - canEdit: bool = Field(..., alias="canEdit")
318 - canAdmin: bool = Field(..., alias="canAdmin")
319 - canDelete: bool = Field(..., alias="canDelete")
320 - createdBy: str = Field(..., alias="createdBy")
321 - created: datetime
322 - updatedBy: str = Field(..., alias="updatedBy")
323 - updated: datetime
324 - version: int
325 -
326 -
327 -# ! OpenSearch Version ! #
328 -class NodeInfo(BaseModel):
329 - version: str
330 -
331 -
332 -class NodesVersionResponse(BaseModel):
333 - nodes: Dict[str, NodeInfo]
67 +class CustomerProvisionResponse(BaseModel):
68 + message: str = Field(..., description="Message indicating the status of the customer provisioning process")
69 + success: bool = Field(..., description="Whether the customer provisioning process was successful or not")
70 + customer_meta: CustomersMeta = Field(..., description="Customer meta data for the newly provisioned customer")
71 + wazuh_worker_provisioned: Optional[bool] = Field(None, description="Whether the Wazuh worker was provisioned successfully")
backend/app/customer_provisioning/schema/wazuh_manager.py new
+7
@@ -0,0 +1,7 @@
1 +from enum import Enum
2 +
3 +
4 +class WazuhAgentsTemplatePaths(Enum):
5 + LINUX_AGENT = ("templates", "linux_agent.conf")
6 + WINDOWS_AGENT = ("templates", "windows_agent.conf")
7 + MAC_AGENT = ("templates", "mac_agent.conf")
backend/app/customer_provisioning/schema/wazuh_worker.py new
+79
@@ -0,0 +1,79 @@
1 +from pydantic import BaseModel
2 +from pydantic import Field
3 +
4 +
5 +class ProvisionWorkerRequest(BaseModel):
6 + customer_name: str = Field(
7 + ...,
8 + example="SOCFortress",
9 + description="The name of the customer",
10 + )
11 + wazuh_auth_password: str = Field(
12 + ...,
13 + example="password",
14 + description="The password for the Wazuh API user",
15 + )
16 + wazuh_registration_port: str = Field(
17 + ...,
18 + example="1515",
19 + description="The port for the Wazuh registration service",
20 + )
21 + wazuh_logs_port: str = Field(
22 + ...,
23 + example="1514",
24 + description="The port for the Wazuh logs service",
25 + )
26 + wazuh_api_port: str = Field(
27 + ...,
28 + example="55001",
29 + description="The port for the Wazuh API service",
30 + )
31 + wazuh_cluster_name: str = Field(
32 + ...,
33 + example="SOCFortress",
34 + description="The name of the Wazuh cluster",
35 + )
36 + wazuh_cluster_key: str = Field(
37 + ...,
38 + example="password",
39 + description="The password for the Wazuh cluster",
40 + )
41 + wazuh_master_ip: str = Field(
42 + ...,
43 + example="1.1.1.1",
44 + description="The IP address of the Wazuh master",
45 + )
46 +
47 +
48 +class ProvisionWorkerResponse(BaseModel):
49 + success: bool = Field(
50 + ...,
51 + example=True,
52 + description="Whether the worker was provisioned successfully",
53 + )
54 + message: str = Field(
55 + ...,
56 + example="Worker provisioned successfully",
57 + description="The message returned by the API",
58 + )
59 +
60 +
61 +class DecommissionWorkerRequest(BaseModel):
62 + customer_name: str = Field(
63 + ...,
64 + example="SOCFortress",
65 + description="The name of the customer",
66 + )
67 +
68 +
69 +class DecommissionWorkerResponse(BaseModel):
70 + success: bool = Field(
71 + ...,
72 + example=True,
73 + description="Whether the worker was decommissioned successfully",
74 + )
75 + message: str = Field(
76 + ...,
77 + example="Worker decommissioned successfully",
78 + description="The message returned by the API",
79 + )
backend/app/customer_provisioning/services/decommission.py new
+99
@@ -0,0 +1,99 @@
1 +import requests
2 +from fastapi import HTTPException
3 +from loguru import logger
4 +from sqlalchemy.ext.asyncio import AsyncSession
5 +
6 +from app.customer_provisioning.schema.decommission import DecommissionCustomerResponse
7 +from app.customer_provisioning.schema.wazuh_worker import DecommissionWorkerRequest
8 +from app.customer_provisioning.schema.wazuh_worker import DecommissionWorkerResponse
9 +from app.customer_provisioning.services.grafana import delete_grafana_organization
10 +from app.customer_provisioning.services.graylog import delete_index_set
11 +from app.customer_provisioning.services.graylog import delete_stream
12 +from app.customer_provisioning.services.wazuh_manager import delete_wazuh_agents
13 +from app.customer_provisioning.services.wazuh_manager import delete_wazuh_groups
14 +from app.customer_provisioning.services.wazuh_manager import gather_wazuh_agents
15 +from app.db.universal_models import CustomersMeta
16 +from app.utils import get_connector_attribute
17 +
18 +
19 +async def decomission_wazuh_customer(customer_meta: CustomersMeta, session: AsyncSession) -> DecommissionCustomerResponse:
20 + """
21 + Decommissions a Wazuh customer by performing the following steps:
22 + 1. Deletes the Wazuh Agents associated with the customer.
23 + 2. Deletes the Wazuh Group associated with the customer.
24 + 3. Deletes the Graylog Stream associated with the customer.
25 + 4. Deletes the Graylog Index Set associated with the customer.
26 + 5. Deletes the Grafana Organization associated with the customer.
27 + 6. Decommissions the Wazuh Worker associated with the customer.
28 + 7. Deletes the Customer Meta from the session.
29 +
30 + Args:
31 + customer_meta (CustomersMeta): The metadata of the customer to be decommissioned.
32 + session (AsyncSession): The database session.
33 +
34 + Returns:
35 + DecommissionCustomerResponse: The response indicating the success of the decommissioning process and the deleted data.
36 +
37 + """
38 + logger.info(f"Decomissioning customer {customer_meta.customer_name}")
39 +
40 + # Delete the Wazuh Agents
41 + agents = await gather_wazuh_agents(customer_meta.customer_code)
42 + agents_deleted = await delete_wazuh_agents(agents)
43 + logger.info(f"Deleted {agents_deleted} agents for customer {customer_meta.customer_name}")
44 +
45 + # Delete Wazuh Group
46 + groups_deleted = await delete_wazuh_groups(customer_meta.customer_code)
47 +
48 + # Delete Graylog Stream
49 + await delete_stream(customer_meta.customer_meta_graylog_stream)
50 +
51 + # Delete Graylog Index Set
52 + await delete_index_set(customer_meta.customer_meta_graylog_index)
53 +
54 + # Delete Grafana Organization
55 + await delete_grafana_organization(organization_id=int(customer_meta.customer_meta_grafana_org_id))
56 +
57 + # Decommission Wazuh Worker
58 + await decommission_wazuh_worker(request=DecommissionWorkerRequest(customer_name=customer_meta.customer_name), session=session)
59 +
60 + # Delete Customer Meta
61 + await session.delete(customer_meta)
62 + await session.commit()
63 +
64 + return DecommissionCustomerResponse(
65 + message=f"Customer {customer_meta.customer_name} decomissioned successfully.",
66 + success=True,
67 + decomissioned_data={
68 + "agents_deleted": agents_deleted,
69 + "groups_deleted": groups_deleted,
70 + "stream_deleted": customer_meta.customer_meta_graylog_stream,
71 + "index_deleted": customer_meta.customer_meta_graylog_index,
72 + },
73 + )
74 +
75 +
76 +######### ! Decommission Wazuh Worker ! ############
77 +async def decommission_wazuh_worker(request: DecommissionWorkerRequest, session: AsyncSession) -> DecommissionWorkerResponse:
78 + """
79 + Decomissions a Wazuh worker.
80 +
81 + Args:
82 + request (DecommissionWorkerRequest): The request object containing the necessary information for provisioning.
83 + session (AsyncSession): The async session object for making HTTP requests.
84 +
85 + Returns:
86 + ProvisionWorkerResponse: The response object indicating the success or failure of the provisioning operation.
87 + """
88 + logger.info(f"Decommissioning Wazuh worker {request}")
89 + api_endpoint = await get_connector_attribute(connector_id=14, column_name="connector_url", session=session)
90 + # Send the POST request to the Wazuh worker
91 + response = requests.post(
92 + url=f"{api_endpoint}/provision_worker/decommission",
93 + json=request.dict(),
94 + )
95 + # Check the response status code
96 + if response.status_code != 200:
97 + return DecommissionWorkerResponse(success=False, message=f"Failed to provision Wazuh worker: {response.text}")
98 + # Return the response
99 + return DecommissionWorkerResponse(success=True, message=f"Wazuh worker provisioned successfully")
backend/app/customer_provisioning/services/grafana.py new
+150
@@ -0,0 +1,150 @@
1 +from fastapi import HTTPException
2 +from loguru import logger
3 +from sqlalchemy.ext.asyncio import AsyncSession
4 +
5 +from app.connectors.grafana.utils.universal import create_grafana_client
6 +from app.connectors.wazuh_indexer.utils.universal import create_wazuh_indexer_client
7 +from app.customer_provisioning.schema.grafana import GrafanaDatasource
8 +from app.customer_provisioning.schema.grafana import GrafanaDataSourceCreationResponse
9 +from app.customer_provisioning.schema.grafana import GrafanaFolderCreationResponse
10 +from app.customer_provisioning.schema.grafana import GrafanaOrganizationCreation
11 +from app.customer_provisioning.schema.grafana import NodesVersionResponse
12 +from app.customer_provisioning.schema.provision import ProvisionNewCustomer
13 +from app.utils import get_connector_attribute
14 +
15 +
16 +################# ! GRAFANA PROVISIONING ! #################
17 +async def create_grafana_organization(request: ProvisionNewCustomer) -> GrafanaOrganizationCreation:
18 + """
19 + Creates a Grafana organization for a customer.
20 +
21 + Args:
22 + request (ProvisionNewCustomer): The request object containing customer information.
23 +
24 + Returns:
25 + GrafanaOrganizationCreation: The created Grafana organization.
26 +
27 + """
28 + logger.info(f"Creating Grafana organization for customer {request.customer_name}")
29 + grafana_client = await create_grafana_client("Grafana")
30 + results = grafana_client.organization.create_organization(
31 + organization={
32 + "name": request.customer_grafana_org_name,
33 + },
34 + )
35 + return GrafanaOrganizationCreation(**results)
36 +
37 +
38 +async def create_grafana_datasource(
39 + request: ProvisionNewCustomer,
40 + organization_id: int,
41 + session: AsyncSession,
42 +) -> GrafanaDataSourceCreationResponse:
43 + """
44 + Creates a Grafana Wazuh datasource for a new customer using the OpenSearch Data Source.
45 +
46 + Args:
47 + request (ProvisionNewCustomer): The request object containing customer information.
48 + organization_id (int): The ID of the organization to create the datasource for.
49 + session (AsyncSession): The database session.
50 +
51 + Returns:
52 + GrafanaDataSourceCreationResponse: The response object containing the result of the datasource creation.
53 + """
54 + logger.info(f"Creating Grafana datasource")
55 + grafana_client = await create_grafana_client("Grafana")
56 + # Switch to the newly created organization
57 + grafana_client.user.switch_actual_user_organisation(organization_id)
58 + datasource_payload = GrafanaDatasource(
59 + name="WAZUH",
60 + type="grafana-opensearch-datasource",
61 + typeName="OpenSearch",
62 + access="proxy",
63 + url=await get_connector_attribute(connector_id=1, column_name="connector_url", session=session),
64 + database=f"{request.customer_index_name}*",
65 + basicAuth=True,
66 + basicAuthUser=await get_connector_attribute(connector_id=1, column_name="connector_username", session=session),
67 + secureJsonData={
68 + "basicAuthPassword": await get_connector_attribute(connector_id=1, column_name="connector_password", session=session),
69 + },
70 + isDefault=False,
71 + jsonData={
72 + "database": f"{request.customer_index_name}*",
73 + "flavor": "opensearch",
74 + "includeFrozen": False,
75 + "logLevelField": "syslog_level",
76 + "logMessageField": "rule_description",
77 + "maxConcurrentShardRequests": 5,
78 + "pplEnabled": True,
79 + "timeField": "timestamp",
80 + "tlsSkipVerify": True,
81 + "version": await get_opensearch_version(),
82 + },
83 + readOnly=True,
84 + )
85 + results = grafana_client.datasource.create_datasource(
86 + datasource=datasource_payload.dict(),
87 + )
88 + return GrafanaDataSourceCreationResponse(**results)
89 +
90 +
91 +async def create_grafana_folder(organization_id: int, folder_title: str) -> GrafanaFolderCreationResponse:
92 + """
93 + Creates a Grafana folder in the specified organization.
94 +
95 + Args:
96 + organization_id (int): The ID of the organization where the folder will be created.
97 + folder_title (str): The title of the folder.
98 +
99 + Returns:
100 + GrafanaFolderCreationResponse: The response object containing the details of the created folder.
101 + """
102 + logger.info(f"Creating Grafana folder")
103 + grafana_client = await create_grafana_client("Grafana")
104 + # Switch to the newly created organization
105 + grafana_client.user.switch_actual_user_organisation(organization_id)
106 + results = grafana_client.folder.create_folder(
107 + title=folder_title,
108 + )
109 + logger.info(f"Folder creation results: {results}")
110 + return GrafanaFolderCreationResponse(**results)
111 +
112 +
113 +async def get_opensearch_version() -> str:
114 + """
115 + Retrieves the version of OpenSearch.
116 +
117 + Returns:
118 + str: The version of OpenSearch.
119 +
120 + Raises:
121 + HTTPException: If the OpenSearch version cannot be retrieved.
122 + """
123 + logger.info("Getting OpenSearch version")
124 + opensearch_client = await create_wazuh_indexer_client("Wazuh-Indexer")
125 +
126 + # Retrieve version information
127 + version_response = opensearch_client.nodes.info(node_id="_local", filter_path=["nodes.*.version"])
128 +
129 + # Parse the response to get the first version found
130 + nodes_version_response = NodesVersionResponse(**version_response)
131 + for node_id, node_info in nodes_version_response.nodes.items():
132 + return node_info.version
133 +
134 + # If no version is found, raise an exception
135 + raise HTTPException(status_code=500, detail=f"Failed to retrieve OpenSearch version.")
136 +
137 +
138 +################# ! GRAFANA DECOMISSIONING ! #################
139 +async def delete_grafana_organization(organization_id: int):
140 + """
141 + Deletes a Grafana organization.
142 +
143 + Args:
144 + organization_id (int): The ID of the organization to delete.
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}")
150 + return organization_deleted
backend/app/customer_provisioning/services/graylog.py new
+240
@@ -0,0 +1,240 @@
1 +import json
2 +from datetime import datetime
3 +
4 +from fastapi import HTTPException
5 +from loguru import logger
6 +
7 +from app.connectors.graylog.services.pipelines import get_pipelines
8 +from app.connectors.graylog.utils.universal import send_delete_request
9 +from app.connectors.graylog.utils.universal import send_post_request
10 +from app.customer_provisioning.schema.graylog import GraylogIndexSetCreationResponse
11 +from app.customer_provisioning.schema.graylog import StreamConnectionToPipelineRequest
12 +from app.customer_provisioning.schema.graylog import StreamConnectionToPipelineResponse
13 +from app.customer_provisioning.schema.graylog import StreamCreationResponse
14 +from app.customer_provisioning.schema.graylog import TimeBasedIndexSet
15 +from app.customer_provisioning.schema.graylog import WazuhEventStream
16 +from app.customer_provisioning.schema.provision import ProvisionNewCustomer
17 +
18 +
19 +######### ! GRAYLOG PROVISIONING ! ############
20 +# ! INDEX SETS ! #
21 +def build_index_set_config(request: ProvisionNewCustomer) -> TimeBasedIndexSet:
22 + """
23 + Build the configuration for a time-based index set.
24 +
25 + Args:
26 + request (ProvisionNewCustomer): The request object containing customer information.
27 +
28 + Returns:
29 + TimeBasedIndexSet: The configured time-based index set.
30 + """
31 + return TimeBasedIndexSet(
32 + title=f"Wazuh - {request.customer_name}",
33 + description=f"Wazuh - {request.customer_name}",
34 + index_prefix=request.customer_index_name,
35 + rotation_strategy_class="org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategy",
36 + rotation_strategy={
37 + "type": "org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategyConfig",
38 + "rotation_period": "P1D",
39 + "rotate_empty_index_set": False,
40 + "max_rotation_period": None,
41 + },
42 + retention_strategy_class="org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy",
43 + retention_strategy={
44 + "type": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig",
45 + "max_number_of_indices": request.hot_data_retention,
46 + },
47 + creation_date=datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
48 + index_analyzer="standard",
49 + shards=request.index_shards,
50 + replicas=request.index_replicas,
51 + index_optimization_max_num_segments=1,
52 + index_optimization_disabled=False,
53 + writable=True,
54 + field_type_refresh_interval=5000,
55 + )
56 +
57 +
58 +# Function to send the POST request and handle the response
59 +async def send_index_set_creation_request(index_set: TimeBasedIndexSet) -> GraylogIndexSetCreationResponse:
60 + """
61 + Sends a request to create an index set in Graylog.
62 +
63 + Args:
64 + index_set (TimeBasedIndexSet): The index set to be created.
65 +
66 + Returns:
67 + GraylogIndexSetCreationResponse: The response from Graylog after creating the index set.
68 + """
69 + json_index_set = json.dumps(index_set.dict())
70 + logger.info(f"json_index_set set: {json_index_set}")
71 + response_json = await send_post_request(endpoint="/api/system/indices/index_sets", data=index_set.dict())
72 + return GraylogIndexSetCreationResponse(**response_json)
73 +
74 +
75 +# Refactored create_index_set function
76 +async def create_index_set(request: ProvisionNewCustomer) -> GraylogIndexSetCreationResponse:
77 + """
78 + Creates an index set for a new customer.
79 +
80 + Args:
81 + request (ProvisionNewCustomer): The request object containing the customer information.
82 +
83 + Returns:
84 + GraylogIndexSetCreationResponse: The response object containing the result of the index set creation.
85 + """
86 + logger.info(f"Creating index set for customer {request.customer_name}")
87 + index_set_config = build_index_set_config(request)
88 + return await send_index_set_creation_request(index_set_config)
89 +
90 +
91 +# Function to extract index set ID
92 +def extract_index_set_id(response: GraylogIndexSetCreationResponse) -> str:
93 + """
94 + Extracts the index set ID from the given GraylogIndexSetCreationResponse object.
95 +
96 + Args:
97 + response (GraylogIndexSetCreationResponse): The GraylogIndexSetCreationResponse object.
98 +
99 + Returns:
100 + str: The index set ID extracted from the response.
101 + """
102 + return response.data.id
103 +
104 +
105 +# ! Event STREAMS ! #
106 +# Function to create event stream configuration
107 +def build_event_stream_config(request: ProvisionNewCustomer, index_set_id: str) -> WazuhEventStream:
108 + """
109 + Build the configuration for a Wazuh event stream.
110 +
111 + Args:
112 + request (ProvisionNewCustomer): The request object containing customer information.
113 + index_set_id (str): The ID of the index set.
114 +
115 + Returns:
116 + WazuhEventStream: The configured Wazuh event stream.
117 + """
118 + return WazuhEventStream(
119 + title=f"WAZUH EVENTS CUSTOMERS - {request.customer_name}",
120 + description=f"WAZUH EVENTS CUSTOMERS - {request.customer_name}",
121 + index_set_id=index_set_id,
122 + rules=[
123 + {
124 + "field": "agent_labels_customer",
125 + "type": 1,
126 + "inverted": False,
127 + "value": request.customer_code,
128 + },
129 + ],
130 + matching_type="AND",
131 + remove_matches_from_default_stream=True,
132 + content_pack=None,
133 + )
134 +
135 +
136 +async def send_event_stream_creation_request(event_stream: WazuhEventStream) -> StreamCreationResponse:
137 + """
138 + Sends a request to create an event stream.
139 +
140 + Args:
141 + event_stream (WazuhEventStream): The event stream to be created.
142 +
143 + Returns:
144 + StreamCreationResponse: The response containing the created event stream.
145 + """
146 + json_event_stream = json.dumps(event_stream.dict())
147 + logger.info(f"json_event_stream set: {json_event_stream}")
148 + response_json = await send_post_request(endpoint="/api/streams", data=event_stream.dict())
149 + return StreamCreationResponse(**response_json)
150 +
151 +
152 +async def create_event_stream(request: ProvisionNewCustomer, index_set_id: str):
153 + """
154 + Creates an event stream for a customer.
155 +
156 + Args:
157 + request (ProvisionNewCustomer): The request object containing customer information.
158 + index_set_id (str): The ID of the index set.
159 +
160 + Returns:
161 + The result of the event stream creation request.
162 + """
163 + logger.info(f"Creating event stream for customer {request.customer_name}")
164 + event_stream_config = build_event_stream_config(request, index_set_id)
165 + return await send_event_stream_creation_request(event_stream_config)
166 +
167 +
168 +# ! PIPELINES ! #
169 +# Function to get pipeline ID
170 +async def get_pipeline_id(subscription: str) -> str:
171 + """
172 + Retrieves the pipeline ID for a given subscription.
173 +
174 + Args:
175 + subscription (str): The subscription name.
176 +
177 + Returns:
178 + str: The pipeline ID.
179 +
180 + Raises:
181 + HTTPException: If the pipeline ID cannot be retrieved.
182 + """
183 + logger.info(f"Getting pipeline ID for subscription {subscription}")
184 + pipelines_response = await get_pipelines()
185 + if pipelines_response.success:
186 + for pipeline in pipelines_response.pipelines:
187 + if subscription.lower() in pipeline.description.lower():
188 + return [pipeline.id]
189 + logger.error(f"Failed to get pipeline ID for subscription {subscription}")
190 + raise HTTPException(status_code=500, detail=f"Failed to get pipeline ID for subscription {subscription}")
191 + else:
192 + logger.error(f"Failed to get pipelines: {pipelines_response.message}")
193 + raise HTTPException(status_code=500, detail=f"Failed to get pipelines: {pipelines_response.message}")
194 +
195 +
196 +async def connect_stream_to_pipeline(stream_and_pipeline: StreamConnectionToPipelineRequest):
197 + """
198 + Connects a stream to a pipeline.
199 +
200 + Args:
201 + stream_and_pipeline (StreamConnectionToPipelineRequest): The request object containing the stream ID and pipeline IDs.
202 +
203 + Returns:
204 + StreamConnectionToPipelineResponse: The response object containing the connection details.
205 + """
206 + logger.info(f"Connecting stream {stream_and_pipeline.stream_id} to pipeline {stream_and_pipeline.pipeline_ids}")
207 + response_json = await send_post_request(endpoint="/api/system/pipelines/connections/to_stream", data=stream_and_pipeline.dict())
208 + logger.info(f"Response: {response_json}")
209 + return StreamConnectionToPipelineResponse(**response_json)
210 +
211 +
212 +######### ! GRAYLOG DECOMISSIONGING ! ############
213 +async def delete_stream(stream_id: str):
214 + """
215 + Deletes a stream.
216 +
217 + Args:
218 + stream_id (str): The ID of the stream to be deleted.
219 +
220 + Returns:
221 + The result of the stream deletion request.
222 + """
223 + logger.info(f"Deleting stream {stream_id}")
224 + response = await send_delete_request(endpoint=f"/api/streams/{stream_id}")
225 + return response
226 +
227 +
228 +async def delete_index_set(index_set_id: str):
229 + """
230 + Deletes an index set.
231 +
232 + Args:
233 + index_set_id (str): The ID of the index set to be deleted.
234 +
235 + Returns:
236 + The result of the index set deletion request.
237 + """
238 + logger.info(f"Deleting index set {index_set_id}")
239 + response = await send_delete_request(endpoint=f"/api/system/indices/index_sets/{index_set_id}")
240 + return response
backend/app/customer_provisioning/services/provision.py new
+158
@@ -0,0 +1,158 @@
1 +import requests
2 +from fastapi import HTTPException
3 +from loguru import logger
4 +from sqlalchemy.ext.asyncio import AsyncSession
5 +
6 +from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
7 +from app.connectors.grafana.services.dashboards import provision_dashboards
8 +from app.connectors.graylog.services.management import start_stream
9 +from app.customer_provisioning.schema.graylog import StreamConnectionToPipelineRequest
10 +from app.customer_provisioning.schema.provision import CustomerProvisionMeta
11 +from app.customer_provisioning.schema.provision import CustomerProvisionResponse
12 +from app.customer_provisioning.schema.provision import ProvisionNewCustomer
13 +from app.customer_provisioning.schema.wazuh_worker import ProvisionWorkerRequest
14 +from app.customer_provisioning.schema.wazuh_worker import ProvisionWorkerResponse
15 +from app.customer_provisioning.services.grafana import create_grafana_datasource
16 +from app.customer_provisioning.services.grafana import create_grafana_folder
17 +from app.customer_provisioning.services.grafana import create_grafana_organization
18 +from app.customer_provisioning.services.graylog import connect_stream_to_pipeline
19 +from app.customer_provisioning.services.graylog import create_event_stream
20 +from app.customer_provisioning.services.graylog import create_index_set
21 +from app.customer_provisioning.services.graylog import get_pipeline_id
22 +from app.customer_provisioning.services.wazuh_manager import apply_group_configurations
23 +from app.customer_provisioning.services.wazuh_manager import create_wazuh_groups
24 +from app.db.universal_models import CustomersMeta
25 +from app.utils import get_connector_attribute
26 +
27 +
28 +# ! MAIN FUNCTION ! #
29 +async def provision_wazuh_customer(request: ProvisionNewCustomer, session: AsyncSession) -> CustomerProvisionResponse:
30 + """
31 + This function is the main function for provisioning a new customer for their Wazuh instance.
32 + It will call all the other functions to provision the customer.
33 +
34 + Args:
35 + request (ProvisionNewCustomer): The request body from the API endpoint
36 + session (AsyncSession): The database session
37 +
38 + Raises:
39 + HTTPException: If the stream fails to start
40 + """
41 + logger.info(f"Provisioning new customer {request}")
42 + # Initialize an empty dictionary to store the meta data
43 + provision_meta_data = {}
44 + provision_meta_data["index_set_id"] = (await create_index_set(request)).data.id
45 + provision_meta_data["stream_id"] = (await create_event_stream(request, provision_meta_data["index_set_id"])).data.stream_id
46 + provision_meta_data["pipeline_ids"] = await get_pipeline_id(subscription="Wazuh")
47 + stream_and_pipeline = StreamConnectionToPipelineRequest(
48 + stream_id=provision_meta_data["stream_id"],
49 + pipeline_ids=provision_meta_data["pipeline_ids"],
50 + )
51 + await connect_stream_to_pipeline(stream_and_pipeline)
52 + if await start_stream(stream_id=provision_meta_data["stream_id"]) is False:
53 + raise HTTPException(status_code=500, detail=f"Failed to start stream {provision_meta_data['stream_id']}")
54 + await create_wazuh_groups(request)
55 + await apply_group_configurations(request)
56 + provision_meta_data["grafana_organization_id"] = (await create_grafana_organization(request)).orgId
57 + provision_meta_data["wazuh_datasource_uid"] = (
58 + await create_grafana_datasource(request=request, organization_id=provision_meta_data["grafana_organization_id"], session=session)
59 + ).datasource.uid
60 + provision_meta_data["grafana_edr_folder_id"] = (
61 + await create_grafana_folder(organization_id=provision_meta_data["grafana_organization_id"], folder_title="EDR")
62 + ).id
63 + await provision_dashboards(
64 + DashboardProvisionRequest(
65 + dashboards=request.dashboards_to_include.dashboards,
66 + organizationId=provision_meta_data["grafana_organization_id"],
67 + folderId=provision_meta_data["grafana_edr_folder_id"],
68 + datasourceUid=provision_meta_data["wazuh_datasource_uid"],
69 + ),
70 + )
71 +
72 + customer_provision_meta = CustomerProvisionMeta(**provision_meta_data)
73 + customer_meta = await update_customer_meta_table(request, customer_provision_meta, session)
74 +
75 + provision_worker = await provision_wazuh_worker(
76 + ProvisionWorkerRequest(
77 + customer_name=request.customer_name,
78 + wazuh_auth_password=request.wazuh_auth_password,
79 + wazuh_registration_port=request.wazuh_registration_port,
80 + wazuh_logs_port=request.wazuh_logs_port,
81 + wazuh_api_port=request.wazuh_api_port,
82 + wazuh_cluster_name=request.wazuh_cluster_name,
83 + wazuh_cluster_key=request.wazuh_cluster_key,
84 + wazuh_master_ip=request.wazuh_master_ip,
85 + ),
86 + session,
87 + )
88 +
89 + if provision_worker.success is False:
90 + return CustomerProvisionResponse(
91 + message=f"Customer {request.customer_name} provisioned successfully, but the Wazuh worker failed to provision",
92 + success=True,
93 + customer_meta=customer_meta.dict(),
94 + wazuh_worker_provisioned=False,
95 + )
96 +
97 + return CustomerProvisionResponse(
98 + message=f"Customer {request.customer_name} provisioned successfully",
99 + success=True,
100 + customer_meta=customer_meta.dict(),
101 + )
102 +
103 +
104 +######### ! Update CustomerMeta Table ! ############
105 +async def update_customer_meta_table(request: ProvisionNewCustomer, customer_meta: CustomerProvisionMeta, session: AsyncSession):
106 + """
107 + Update the customer meta table with the provided information.
108 +
109 + Args:
110 + request (ProvisionNewCustomer): The request object containing customer information.
111 + customer_meta (CustomerProvisionMeta): The customer meta object containing additional information.
112 + session (AsyncSession): The database session.
113 +
114 + Returns:
115 + CustomerProvisionMeta: The updated customer meta object.
116 + """
117 + logger.info(f"Updating customer meta table for customer {request.customer_name}")
118 + customer_meta = CustomersMeta(
119 + customer_code=request.customer_code,
120 + customer_name=request.customer_name,
121 + customer_meta_graylog_index=customer_meta.index_set_id,
122 + customer_meta_graylog_stream=customer_meta.stream_id,
123 + customer_meta_grafana_org_id=customer_meta.grafana_organization_id,
124 + customer_meta_wazuh_group=request.customer_code,
125 + customer_meta_index_retention=str(request.hot_data_retention),
126 + customer_meta_wazuh_registration_port=request.wazuh_registration_port,
127 + customer_meta_wazuh_log_ingestion_port=request.wazuh_logs_port,
128 + customer_meta_wazuh_auth_password=request.wazuh_auth_password,
129 + )
130 + session.add(customer_meta)
131 + await session.commit()
132 + return customer_meta
133 +
134 +
135 +######### ! Provision Wazuh Worker ! ############
136 +async def provision_wazuh_worker(request: ProvisionWorkerRequest, session: AsyncSession) -> ProvisionWorkerResponse:
137 + """
138 + Provisions a Wazuh worker.
139 +
140 + Args:
141 + request (ProvisionWorkerRequest): The request object containing the necessary information for provisioning.
142 + session (AsyncSession): The async session object for making HTTP requests.
143 +
144 + Returns:
145 + ProvisionWorkerResponse: The response object indicating the success or failure of the provisioning operation.
146 + """
147 + logger.info(f"Provisioning Wazuh worker {request}")
148 + api_endpoint = await get_connector_attribute(connector_id=14, column_name="connector_url", session=session)
149 + # Send the POST request to the Wazuh worker
150 + response = requests.post(
151 + url=f"{api_endpoint}/provision_worker",
152 + json=request.dict(),
153 + )
154 + # Check the response status code
155 + if response.status_code != 200:
156 + return ProvisionWorkerResponse(success=False, message=f"Failed to provision Wazuh worker: {response.text}")
157 + # Return the response
158 + return ProvisionWorkerResponse(success=True, message=f"Wazuh worker provisioned successfully")
backend/app/customer_provisioning/services/provision_wazuh.py deleted
-358
@@ -1,358 +0,0 @@
1 -import json
2 -from datetime import datetime
3 -from pathlib import Path
4 -
5 -from fastapi import HTTPException
6 -from loguru import logger
7 -from sqlalchemy.ext.asyncio import AsyncSession
8 -
9 -from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
10 -from app.connectors.grafana.services.dashboards import provision_dashboards
11 -from app.connectors.grafana.utils.universal import create_grafana_client
12 -from app.connectors.graylog.services.management import start_stream
13 -from app.connectors.graylog.services.pipelines import get_pipelines
14 -from app.connectors.graylog.utils.universal import send_post_request
15 -from app.connectors.wazuh_indexer.utils.universal import create_wazuh_indexer_client
16 -from app.connectors.wazuh_manager.utils.universal import (
17 - send_post_request as send_wazuh_post_request,
18 -)
19 -from app.connectors.wazuh_manager.utils.universal import (
20 - send_put_request as send_wazuh_put_request,
21 -)
22 -from app.customer_provisioning.schema.provision import CustomerProvisionMeta
23 -from app.customer_provisioning.schema.provision import GrafanaDatasource
24 -from app.customer_provisioning.schema.provision import GrafanaDataSourceCreationResponse
25 -from app.customer_provisioning.schema.provision import GrafanaFolderCreationResponse
26 -from app.customer_provisioning.schema.provision import GrafanaOrganizationCreation
27 -from app.customer_provisioning.schema.provision import GraylogIndexSetCreationResponse
28 -from app.customer_provisioning.schema.provision import NodesVersionResponse
29 -from app.customer_provisioning.schema.provision import ProvisionNewCustomer
30 -from app.customer_provisioning.schema.provision import StreamConnectionToPipelineRequest
31 -from app.customer_provisioning.schema.provision import (
32 - StreamConnectionToPipelineResponse,
33 -)
34 -from app.customer_provisioning.schema.provision import StreamCreationResponse
35 -from app.customer_provisioning.schema.provision import TimeBasedIndexSet
36 -from app.customer_provisioning.schema.provision import WazuhAgentsTemplatePaths
37 -from app.customer_provisioning.schema.provision import WazuhEventStream
38 -from app.db.universal_models import CustomersMeta
39 -from app.utils import get_connector_attribute
40 -
41 -
42 -######### ! GRAYLOG PROVISIONING ! ############
43 -# ! INDEX SETS ! #
44 -# Function to create index set configuration
45 -def build_index_set_config(request: ProvisionNewCustomer) -> TimeBasedIndexSet:
46 - return TimeBasedIndexSet(
47 - title=f"Wazuh - {request.customer_name}",
48 - description=f"Wazuh - {request.customer_name}",
49 - index_prefix=request.customer_index_name,
50 - rotation_strategy_class="org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategy",
51 - rotation_strategy={
52 - "type": "org.graylog2.indexer.rotation.strategies.TimeBasedRotationStrategyConfig",
53 - "rotation_period": "P1D",
54 - "rotate_empty_index_set": False,
55 - "max_rotation_period": None,
56 - },
57 - retention_strategy_class="org.graylog2.indexer.retention.strategies.DeletionRetentionStrategy",
58 - retention_strategy={
59 - "type": "org.graylog2.indexer.retention.strategies.DeletionRetentionStrategyConfig",
60 - "max_number_of_indices": request.hot_data_retention,
61 - },
62 - creation_date=datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
63 - index_analyzer="standard",
64 - shards=request.index_shards,
65 - replicas=request.index_replicas,
66 - index_optimization_max_num_segments=1,
67 - index_optimization_disabled=False,
68 - writable=True,
69 - field_type_refresh_interval=5000,
70 - )
71 -
72 -
73 -# Function to send the POST request and handle the response
74 -async def send_index_set_creation_request(index_set: TimeBasedIndexSet) -> GraylogIndexSetCreationResponse:
75 - json_index_set = json.dumps(index_set.dict())
76 - logger.info(f"json_index_set set: {json_index_set}")
77 - response_json = await send_post_request(endpoint="/api/system/indices/index_sets", data=index_set.dict())
78 - return GraylogIndexSetCreationResponse(**response_json)
79 -
80 -
81 -# Refactored create_index_set function
82 -async def create_index_set(request: ProvisionNewCustomer) -> GraylogIndexSetCreationResponse:
83 - logger.info(f"Creating index set for customer {request.customer_name}")
84 - index_set_config = build_index_set_config(request)
85 - return await send_index_set_creation_request(index_set_config)
86 -
87 -
88 -# Function to extract index set ID
89 -def extract_index_set_id(response: GraylogIndexSetCreationResponse) -> str:
90 - return response.data.id
91 -
92 -
93 -# ! Event STREAMS ! #
94 -# Function to create event stream configuration
95 -def build_event_stream_config(request: ProvisionNewCustomer, index_set_id: str) -> WazuhEventStream:
96 - return WazuhEventStream(
97 - title=f"WAZUH EVENTS CUSTOMERS - {request.customer_name}",
98 - description=f"WAZUH EVENTS CUSTOMERS - {request.customer_name}",
99 - index_set_id=index_set_id,
100 - rules=[
101 - {
102 - "field": "agent_labels_customer",
103 - "type": 1,
104 - "inverted": False,
105 - "value": request.customer_code,
106 - },
107 - ],
108 - matching_type="AND",
109 - remove_matches_from_default_stream=True,
110 - content_pack=None,
111 - )
112 -
113 -
114 -async def send_event_stream_creation_request(event_stream: WazuhEventStream) -> StreamCreationResponse:
115 - json_event_stream = json.dumps(event_stream.dict())
116 - logger.info(f"json_event_stream set: {json_event_stream}")
117 - response_json = await send_post_request(endpoint="/api/streams", data=event_stream.dict())
118 - return StreamCreationResponse(**response_json)
119 -
120 -
121 -async def create_event_stream(request: ProvisionNewCustomer, index_set_id: str):
122 - logger.info(f"Creating event stream for customer {request.customer_name}")
123 - event_stream_config = build_event_stream_config(request, index_set_id)
124 - return await send_event_stream_creation_request(event_stream_config)
125 -
126 -
127 -# ! PIPELINES ! #
128 -# Function to get pipeline ID
129 -async def get_pipeline_id(subscription: str) -> str:
130 - logger.info(f"Getting pipeline ID for subscription {subscription}")
131 - pipelines_response = await get_pipelines()
132 - if pipelines_response.success:
133 - for pipeline in pipelines_response.pipelines:
134 - if subscription.lower() in pipeline.description.lower():
135 - return [pipeline.id]
136 - logger.error(f"Failed to get pipeline ID for subscription {subscription}")
137 - raise HTTPException(status_code=500, detail=f"Failed to get pipeline ID for subscription {subscription}")
138 - else:
139 - logger.error(f"Failed to get pipelines: {pipelines_response.message}")
140 - raise HTTPException(status_code=500, detail=f"Failed to get pipelines: {pipelines_response.message}")
141 -
142 -
143 -async def connect_stream_to_pipeline(stream_and_pipeline: StreamConnectionToPipelineRequest):
144 - logger.info(f"Connecting stream {stream_and_pipeline.stream_id} to pipeline {stream_and_pipeline.pipeline_ids}")
145 - response_json = await send_post_request(endpoint="/api/system/pipelines/connections/to_stream", data=stream_and_pipeline.dict())
146 - logger.info(f"Response: {response_json}")
147 - return StreamConnectionToPipelineResponse(**response_json)
148 -
149 -
150 -######### ! WAZUH MANAGER PROVISIONING ! ############
151 -# Function to generate group codes
152 -def generate_group_code(group, customer_code):
153 - return f"{group}_{customer_code}"
154 -
155 -
156 -# Separate function for sending POST requests to Wazuh
157 -async def create_wazuh_group(group_code):
158 - endpoint = "groups"
159 - data = {"group_id": group_code}
160 - return await send_wazuh_post_request(endpoint=endpoint, data=data)
161 -
162 -
163 -# Main function to create Wazuh groups
164 -async def create_wazuh_groups(request: ProvisionNewCustomer):
165 - logger.info(f"Creating Wazuh groups for customer {request.customer_name} with code {request.customer_code}")
166 -
167 - wazuh_groups = ["Linux", "Windows", "Mac"] # This list can be moved to a config file or a global variable
168 -
169 - for group in wazuh_groups:
170 - group_code = generate_group_code(group, request.customer_code)
171 - logger.info(f"Creating group with code {group_code}")
172 - try:
173 - response = await create_wazuh_group(group_code)
174 - logger.info(f"Response for {group_code}: {response}")
175 - except Exception as e:
176 - logger.error(f"Error creating group {group_code}: {e}")
177 -
178 -
179 -# Function to get the template file path
180 -def get_template_path(template_info: WazuhAgentsTemplatePaths) -> Path:
181 - folder_name, file_name = template_info.value
182 - current_file = Path(__file__) # Path to the current file
183 - base_dir = current_file.parent.parent # Move up two levels to the base directory
184 - return base_dir / folder_name / file_name
185 -
186 -
187 -# Function to update Wazuh group configuration
188 -async def configure_wazuh_group(group_code, template_path):
189 - logger.info(f"Configuring Wazuh group {group_code}")
190 -
191 - # Read the contents of the template file
192 - with open(template_path, "r") as template_file:
193 - config_template = template_file.read()
194 -
195 - # Replace placeholder with the customer code
196 - group_config = config_template.replace("REPLACE", group_code.split("_")[-1])
197 -
198 - # Make the API request to update the group configuration
199 - return await send_wazuh_put_request(endpoint=f"groups/{group_code}/configuration", data=group_config, xml_data=True)
200 -
201 -
202 -# Function to apply configurations for all groups
203 -async def apply_group_configurations(request: ProvisionNewCustomer):
204 - logger.info(f"Applying configurations for Wazuh groups for customer {request.customer_name} with code {request.customer_code}")
205 -
206 - group_templates = {
207 - "Linux": WazuhAgentsTemplatePaths.LINUX_AGENT,
208 - "Windows": WazuhAgentsTemplatePaths.WINDOWS_AGENT,
209 - "Mac": WazuhAgentsTemplatePaths.MAC_AGENT,
210 - }
211 -
212 - for group, template in group_templates.items():
213 - group_code = f"{group}_{request.customer_code}"
214 - template_path = get_template_path(template)
215 - try:
216 - await configure_wazuh_group(group_code, template_path)
217 - except Exception as e:
218 - logger.error(f"Error configuring group {group_code}: {e}")
219 -
220 -
221 -######### ! Grafana PROVISIONING ! ############
222 -async def create_grafana_organization(request: ProvisionNewCustomer) -> GrafanaOrganizationCreation:
223 - logger.info(f"Creating Grafana organization for customer {request.customer_name}")
224 - grafana_client = await create_grafana_client("Grafana")
225 - results = grafana_client.organization.create_organization(
226 - organization={
227 - "name": request.customer_grafana_org_name,
228 - },
229 - )
230 - return GrafanaOrganizationCreation(**results)
231 -
232 -
233 -async def create_grafana_datasource(
234 - request: ProvisionNewCustomer,
235 - organization_id: int,
236 - session: AsyncSession,
237 -) -> GrafanaDataSourceCreationResponse:
238 - logger.info(f"Creating Grafana datasource")
239 - grafana_client = await create_grafana_client("Grafana")
240 - # Switch to the newly created organization
241 - grafana_client.user.switch_actual_user_organisation(organization_id)
242 - datasource_payload = GrafanaDatasource(
243 - name="WAZUH TEST",
244 - type="grafana-opensearch-datasource",
245 - typeName="OpenSearch",
246 - access="proxy",
247 - url=await get_connector_attribute(connector_id=1, column_name="connector_url", session=session),
248 - database=f"{request.customer_index_name}*",
249 - basicAuth=True,
250 - basicAuthUser=await get_connector_attribute(connector_id=1, column_name="connector_username", session=session),
251 - secureJsonData={
252 - "basicAuthPassword": await get_connector_attribute(connector_id=1, column_name="connector_password", session=session),
253 - },
254 - isDefault=False,
255 - jsonData={
256 - "database": f"{request.customer_index_name}*",
257 - "flavor": "opensearch",
258 - "includeFrozen": False,
259 - "logLevelField": "syslog_level",
260 - "logMessageField": "rule_description",
261 - "maxConcurrentShardRequests": 5,
262 - "pplEnabled": True,
263 - "timeField": "timestamp",
264 - "tlsSkipVerify": True,
265 - "version": await get_opensearch_version(),
266 - },
267 - readOnly=True,
268 - )
269 - results = grafana_client.datasource.create_datasource(
270 - datasource=datasource_payload.dict(),
271 - )
272 - return GrafanaDataSourceCreationResponse(**results)
273 -
274 -
275 -async def create_grafana_folder(organization_id: int, folder_title: str) -> GrafanaFolderCreationResponse:
276 - logger.info(f"Creating Grafana folder")
277 - grafana_client = await create_grafana_client("Grafana")
278 - # Switch to the newly created organization
279 - grafana_client.user.switch_actual_user_organisation(organization_id)
280 - results = grafana_client.folder.create_folder(
281 - title=folder_title,
282 - )
283 - logger.info(f"Folder creation results: {results}")
284 - return GrafanaFolderCreationResponse(**results)
285 -
286 -
287 -async def get_opensearch_version() -> str:
288 - logger.info("Getting OpenSearch version")
289 - opensearch_client = await create_wazuh_indexer_client("Wazuh-Indexer")
290 -
291 - # Retrieve version information
292 - version_response = opensearch_client.nodes.info(node_id="_local", filter_path=["nodes.*.version"])
293 -
294 - # Parse the response to get the first version found
295 - nodes_version_response = NodesVersionResponse(**version_response)
296 - for node_id, node_info in nodes_version_response.nodes.items():
297 - return node_info.version
298 -
299 - # If no version is found, raise an exception
300 - raise HTTPException(status_code=500, detail=f"Failed to retrieve OpenSearch version.")
301 -
302 -
303 -######### ! Update CustomerMeta Table ! ############
304 -async def update_customer_meta_table(request: ProvisionNewCustomer, customer_meta: CustomerProvisionMeta, session: AsyncSession):
305 - logger.info(f"Updating customer meta table for customer {request.customer_name}")
306 - customer_meta = CustomersMeta(
307 - customer_code=request.customer_code,
308 - customer_name=request.customer_name,
309 - customer_meta_graylog_index=customer_meta.index_set_id,
310 - customer_meta_graylog_stream=customer_meta.stream_id,
311 - customer_meta_grafana_org_id=customer_meta.grafana_organization_id,
312 - customer_meta_wazuh_group=request.customer_code,
313 - customer_meta_index_retention=str(request.hot_data_retention),
314 - customer_meta_wazuh_registration_port=request.wazuh_registration_port,
315 - customer_meta_wazuh_log_ingestion_port=request.wazuh_logs_port,
316 - customer_meta_wazuh_auth_password=request.wazuh_auth_password,
317 - )
318 - session.add(customer_meta)
319 - await session.commit()
320 -
321 -
322 -# ! MAIN FUNCTION ! #
323 -async def provision_wazuh_customer(request: ProvisionNewCustomer, session: AsyncSession):
324 - logger.info(f"Provisioning new customer {request}")
325 - # Initialize an empty dictionary to store the meta data
326 - provision_meta_data = {}
327 - provision_meta_data["index_set_id"] = (await create_index_set(request)).data.id
328 - provision_meta_data["stream_id"] = (await create_event_stream(request, provision_meta_data["index_set_id"])).data.stream_id
329 - provision_meta_data["pipeline_ids"] = await get_pipeline_id(subscription="Wazuh")
330 - stream_and_pipeline = StreamConnectionToPipelineRequest(
331 - stream_id=provision_meta_data["stream_id"],
332 - pipeline_ids=provision_meta_data["pipeline_ids"],
333 - )
334 - await connect_stream_to_pipeline(stream_and_pipeline)
335 - if await start_stream(stream_id=provision_meta_data["stream_id"]) is False:
336 - raise HTTPException(status_code=500, detail=f"Failed to start stream {provision_meta_data['stream_id']}")
337 - await create_wazuh_groups(request)
338 - await apply_group_configurations(request)
339 - provision_meta_data["grafana_organization_id"] = (await create_grafana_organization(request)).orgId
340 - provision_meta_data["wazuh_datasource_uid"] = (
341 - await create_grafana_datasource(request=request, organization_id=provision_meta_data["grafana_organization_id"], session=session)
342 - ).datasource.uid
343 - provision_meta_data["grafana_edr_folder_id"] = (
344 - await create_grafana_folder(organization_id=provision_meta_data["grafana_organization_id"], folder_title="EDR")
345 - ).id
346 - await provision_dashboards(
347 - DashboardProvisionRequest(
348 - dashboards=request.dashboards_to_include.dashboards,
349 - organizationId=provision_meta_data["grafana_organization_id"],
350 - folderId=provision_meta_data["grafana_edr_folder_id"],
351 - datasourceUid=provision_meta_data["wazuh_datasource_uid"],
352 - ),
353 - )
354 -
355 - customer_provision_meta = CustomerProvisionMeta(**provision_meta_data)
356 - await update_customer_meta_table(request, customer_provision_meta, session)
357 -
358 - return {"message": "Provisioning new customer"}
backend/app/customer_provisioning/services/wazuh_manager.py new
+180
@@ -0,0 +1,180 @@
1 +from pathlib import Path
2 +from typing import List
3 +
4 +from loguru import logger
5 +
6 +from app.agents.wazuh.schema.agents import WazuhAgent
7 +from app.agents.wazuh.schema.agents import WazuhAgentsList
8 +from app.connectors.wazuh_manager.utils.universal import (
9 + send_delete_request as send_wazuh_delete_request,
10 +)
11 +from app.connectors.wazuh_manager.utils.universal import (
12 + send_get_request as send_wazuh_get_request,
13 +)
14 +from app.connectors.wazuh_manager.utils.universal import (
15 + send_post_request as send_wazuh_post_request,
16 +)
17 +from app.connectors.wazuh_manager.utils.universal import (
18 + send_put_request as send_wazuh_put_request,
19 +)
20 +from app.customer_provisioning.schema.provision import ProvisionNewCustomer
21 +from app.customer_provisioning.schema.wazuh_manager import WazuhAgentsTemplatePaths
22 +
23 +
24 +######### ! WAZUH MANAGER PROVISIONING ! ############
25 +# Function to generate group codes
26 +def generate_group_code(group, customer_code):
27 + return f"{group}_{customer_code}"
28 +
29 +
30 +# Separate function for sending POST requests to Wazuh
31 +async def create_wazuh_group(group_code):
32 + endpoint = "groups"
33 + data = {"group_id": group_code}
34 + return await send_wazuh_post_request(endpoint=endpoint, data=data)
35 +
36 +
37 +# Main function to create Wazuh groups
38 +async def create_wazuh_groups(request: ProvisionNewCustomer):
39 + logger.info(f"Creating Wazuh groups for customer {request.customer_name} with code {request.customer_code}")
40 +
41 + wazuh_groups = ["Linux", "Windows", "Mac"] # This list can be moved to a config file or a global variable
42 +
43 + for group in wazuh_groups:
44 + group_code = generate_group_code(group, request.customer_code)
45 + logger.info(f"Creating group with code {group_code}")
46 + try:
47 + response = await create_wazuh_group(group_code)
48 + logger.info(f"Response for {group_code}: {response}")
49 + except Exception as e:
50 + logger.error(f"Error creating group {group_code}: {e}")
51 +
52 +
53 +# Function to get the template file path
54 +def get_template_path(template_info: WazuhAgentsTemplatePaths) -> Path:
55 + folder_name, file_name = template_info.value
56 + current_file = Path(__file__) # Path to the current file
57 + base_dir = current_file.parent.parent # Move up two levels to the base directory
58 + return base_dir / folder_name / file_name
59 +
60 +
61 +# Function to update Wazuh group configuration
62 +async def configure_wazuh_group(group_code, template_path):
63 + logger.info(f"Configuring Wazuh group {group_code}")
64 +
65 + # Read the contents of the template file
66 + with open(template_path, "r") as template_file:
67 + config_template = template_file.read()
68 +
69 + # Replace placeholder with the customer code
70 + group_config = config_template.replace("REPLACE", group_code.split("_")[-1])
71 +
72 + # Make the API request to update the group configuration
73 + return await send_wazuh_put_request(endpoint=f"groups/{group_code}/configuration", data=group_config, xml_data=True)
74 +
75 +
76 +# Function to apply configurations for all groups
77 +async def apply_group_configurations(request: ProvisionNewCustomer):
78 + logger.info(f"Applying configurations for Wazuh groups for customer {request.customer_name} with code {request.customer_code}")
79 +
80 + group_templates = {
81 + "Linux": WazuhAgentsTemplatePaths.LINUX_AGENT,
82 + "Windows": WazuhAgentsTemplatePaths.WINDOWS_AGENT,
83 + "Mac": WazuhAgentsTemplatePaths.MAC_AGENT,
84 + }
85 +
86 + for group, template in group_templates.items():
87 + group_code = f"{group}_{request.customer_code}"
88 + template_path = get_template_path(template)
89 + try:
90 + await configure_wazuh_group(group_code, template_path)
91 + except Exception as e:
92 + logger.error(f"Error configuring group {group_code}: {e}")
93 +
94 +
95 +######### ! WAZUH MANAGER DECOMISSIONING ! ############
96 +
97 +
98 +async def get_agent_ids(group_code: str) -> List[str]:
99 + try:
100 + response = await send_wazuh_get_request(endpoint="agents", params={"group": group_code})
101 + logger.info(f"Response for {group_code}: {response}")
102 +
103 + # Extracting agents from the nested response
104 + agents_data = response.get("data", {}).get("data", {}).get("affected_items", [])
105 +
106 + agent_ids = [agent.get("id") for agent in agents_data]
107 + return agent_ids
108 + except Exception as e:
109 + logger.error(f"Error getting agents for group {group_code}: {e}")
110 + return []
111 +
112 +
113 +async def gather_wazuh_agents(customer_meta_wazuh_group: str):
114 + # Append the Group Templates from the WazuhAgentsTemplatePaths Enum
115 + wazuh_groups = ["Linux", "Windows", "Mac"]
116 +
117 + # Initialize an empty list to store the agents
118 + agents = []
119 +
120 + # Loop through the groups and get the agent IDs for each group and append them to the list
121 + for group in wazuh_groups:
122 + group_code = generate_group_code(group, customer_meta_wazuh_group)
123 + logger.info(f"Getting agents for group {group_code}")
124 + agent_ids = await get_agent_ids(group_code)
125 + agents.extend(agent_ids)
126 +
127 + return agents
128 +
129 +
130 +async def delete_wazuh_agents(agent_ids: List[str]):
131 + # Initialize an empty list to store the agents
132 + agents = []
133 +
134 + # Loop through the groups and get the agent IDs for each group and append them to the list
135 + for agent_id in agent_ids:
136 + logger.info(f"Deleting agent {agent_id}")
137 + try:
138 + response = await send_wazuh_delete_request(
139 + endpoint=f"agents",
140 + params={
141 + "older_than": "0s",
142 + "agents_list": agent_id,
143 + "status": "all",
144 + },
145 + )
146 + logger.info(f"Response for {agent_id}: {response}")
147 + except Exception as e:
148 + logger.error(f"Error deleting agent {agent_id}: {e}")
149 + continue
150 +
151 + agents.append(agent_id)
152 +
153 + return agents
154 +
155 +
156 +async def delete_wazuh_groups(customer_meta_wazuh_group: str):
157 + wazuh_groups = ["Linux", "Windows", "Mac"]
158 +
159 + # Initialize an empty list to store the groups deleted
160 + groups_deleted = []
161 +
162 + # Loop through the groups and get the agent IDs for each group and append them to the list
163 + for group in wazuh_groups:
164 + group_code = generate_group_code(group, customer_meta_wazuh_group)
165 + logger.info(f"Deleting group {group_code}")
166 + try:
167 + response = await send_wazuh_delete_request(
168 + endpoint=f"groups",
169 + params={
170 + "groups_list": group_code,
171 + },
172 + )
173 + logger.info(f"Response for {group_code}: {response}")
174 + except Exception as e:
175 + logger.error(f"Error deleting group {group_code}: {e}")
176 + continue
177 +
178 + groups_deleted.append(group_code)
179 +
180 + return groups_deleted
backend/app/db/db_populate.py
+11 -1
@@ -136,7 +136,7 @@ async def add_connectors_if_not_exist(session: AsyncSession):
136 "connector_url": "http://ashwzhma.socfortress.local:8086",
137 "connector_username": None,
138 "connector_password": None,
139 - "connector_api_key": "23PySXxdhw7hUgwOCjEfUhSLL32A41GBZwflP1k0XFQbL64q4rfju23uc_elokQ0546Cp-s25DnVRj8urQmt5w==",
139 + "connector_api_key": "DDMsDZzI1xRHYxQT60fNZ_2zZtCnAKq04GmqEF3prLJOIw5iNzEtlXkui1a5Y6d5_eWf1nomug9FmE0ue1J5iQ==",
140 "connector_configured": True,
141 "connector_accepts_api_key": True,
142 "connector_extra_data": "telegraf",
@@ -151,6 +151,16 @@ async def add_connectors_if_not_exist(session: AsyncSession):
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://192.168.200.220: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 + },
164 ]
165
166 for connector_data in connector_list:
backend/app/middleware/exception_handlers.py
+30 -56
@@ -1,59 +1,3 @@
1 -# from fastapi import HTTPException
2 -# from fastapi import Request
3 -# from fastapi.exceptions import RequestValidationError
4 -# from fastapi.responses import JSONResponse
5 -# from sqlmodel import Session
6 -
7 -# from app.auth.utils import AuthHandler
8 -# from app.db.db_session import engine
9 -# from app.utils import ErrorType
10 -# from app.utils import Logger
11 -# from app.utils import ValidationErrorItem
12 -# from app.utils import ValidationErrorResponse
13 -
14 -
15 -# # Utility function to get user_id from request
16 -# async def get_user_id_from_request(request: Request, session, logger_instance):
17 -# return await logger_instance.get_user_id_from_request(request)
18 -
19 -
20 -# async def custom_http_exception_handler(request: Request, exc: HTTPException):
21 -# with Session(engine) as session:
22 -# logger_instance = Logger(session, AuthHandler())
23 -# user_id = await get_user_id_from_request(request, session, logger_instance)
24 -# await logger_instance.log_error(user_id, request, exc.detail)
25 -
26 -# return JSONResponse(
27 -# status_code=exc.status_code,
28 -# content={
29 -# "success": False,
30 -# "message": exc.detail,
31 -# },
32 -# )
33 -
34 -
35 -# async def validation_exception_handler(request: Request, exc: RequestValidationError):
36 -# errors = exc.errors()
37 -# details = []
38 -
39 -# for error in errors:
40 -# field = error["loc"][-1]
41 -# error_type = ErrorType(error["type"])
42 -# details.append(ValidationErrorItem(field=field, error_type=error_type))
43 -
44 -# main_message = details[0].message if details else "Validation Error"
45 -
46 -# with Session(engine) as session:
47 -# logger_instance = Logger(session, AuthHandler())
48 -# user_id = await get_user_id_from_request(request, session, logger_instance)
49 -# await logger_instance.log_error(user_id, request, main_message)
50 -
51 -# return JSONResponse(
52 -# status_code=422,
53 -# content=ValidationErrorResponse(message=main_message, details=details).dict(),
54 -# )
55 -
56 -# ! With Async
1 from fastapi import HTTPException
2 from fastapi import Request
3 from fastapi.exceptions import RequestValidationError
@@ -75,6 +19,16 @@ async def get_user_id_from_request(request: Request, logger_instance):
19
20
21 async def custom_http_exception_handler(request: Request, exc: HTTPException):
22 + """
23 + Custom exception handler for handling HTTP exceptions.
24 +
25 + Args:
26 + request (Request): The incoming request object.
27 + exc (HTTPException): The raised HTTP exception.
28 +
29 + Returns:
30 + JSONResponse: The JSON response containing the error details.
31 + """
32 async with AsyncSession(async_engine) as session: # Use AsyncSession
33 logger_instance = Logger(session, AuthHandler())
34 user_id = await get_user_id_from_request(request, logger_instance)
@@ -91,6 +45,16 @@ async def custom_http_exception_handler(request: Request, exc: HTTPException):
45
46
47 async def validation_exception_handler(request: Request, exc: RequestValidationError):
48 + """
49 + Handles validation exceptions and logs the error.
50 +
51 + Args:
52 + request (Request): The incoming request.
53 + exc (RequestValidationError): The validation exception.
54 +
55 + Returns:
56 + JSONResponse: The JSON response with the validation error details.
57 + """
58 errors = exc.errors()
59 details = []
60
@@ -114,6 +78,16 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
78
79
80 async def value_error_handler(request: Request, exc: ValueError):
81 + """
82 + Handles the ValueError exception and logs the error message.
83 +
84 + Args:
85 + request (Request): The incoming request object.
86 + exc (ValueError): The ValueError exception object.
87 +
88 + Returns:
89 + JSONResponse: The response containing the error message.
90 + """
91 error_message = str(exc)
92
93 async with AsyncSession(async_engine) as session:
backend/app/routers/customer_provisioning.py
+4
@@ -1,5 +1,8 @@
1 from fastapi import APIRouter
2
3 +from app.customer_provisioning.routes.decommission import (
4 + customer_decommissioning_router,
5 +)
6 from app.customer_provisioning.routes.provision import customer_provisioning_router
7
8 # Instantiate the APIRouter
@@ -7,3 +10,4 @@ router = APIRouter()
10
11 # Include the Shuffle related routes
12 router.include_router(customer_provisioning_router, prefix="/customer_provisioning", tags=["Customer Provisioning"])
13 +router.include_router(customer_decommissioning_router, prefix="/customer_provisioning", tags=["Customer Provisioning"])
backend/app/routers/threat_intel.py new
+9
@@ -0,0 +1,9 @@
1 +from fastapi import APIRouter
2 +
3 +from app.threat_intel.routes.socfortress import threat_intel_socfortress_router
4 +
5 +# Instantiate the APIRouter
6 +router = APIRouter()
7 +
8 +# Include the Threat Intel related routes
9 +router.include_router(threat_intel_socfortress_router, prefix="/threat_intel", tags=["Threat Intel"])
backend/app/threat_intel/routes/socfortress.py new
+59
@@ -0,0 +1,59 @@
1 +from fastapi import APIRouter
2 +from fastapi import Body
3 +from fastapi import Depends
4 +from fastapi import HTTPException
5 +from fastapi import Security
6 +from loguru import logger
7 +from sqlalchemy.ext.asyncio import AsyncSession
8 +from sqlalchemy.future import select
9 +
10 +from app.auth.utils import AuthHandler
11 +from app.db.db_session import get_session
12 +from app.db.universal_models import Customers
13 +from app.db.universal_models import CustomersMeta
14 +from app.threat_intel.schema.socfortress import IoCResponse
15 +from app.threat_intel.schema.socfortress import SocfortressThreatIntelRequest
16 +from app.threat_intel.services.socfortress import socfortress_threat_intel_lookup
17 +from app.utils import get_connector_attribute
18 +
19 +# App specific imports
20 +
21 +threat_intel_socfortress_router = APIRouter()
22 +
23 +
24 +async def ensure_api_key_exists(session: AsyncSession = Depends(get_session)) -> bool:
25 + """
26 + Ensures that the SocFortress API key exists in the database.
27 +
28 + Args:
29 + session (AsyncSession): The database session.
30 +
31 + Raises:
32 + HTTPException: Raised if the SocFortress API key is not found.
33 +
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)
38 + # Close the session
39 + await session.close()
40 + if not api_key:
41 + raise HTTPException(status_code=500, detail="SocFortress API key not found in the database.")
42 + return True
43 +
44 +
45 +@threat_intel_socfortress_router.post(
46 + "/socfortress",
47 + response_model=IoCResponse,
48 + description="SocFortress Threat Intel",
49 + dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))],
50 +)
51 +async def threat_intel_socfortress(
52 + request: SocfortressThreatIntelRequest,
53 + session: AsyncSession = Depends(get_session),
54 + _key_exists: bool = Depends(ensure_api_key_exists),
55 +):
56 + logger.info("Running SOCFortress Threat Intel")
57 +
58 + socfortress_lookup = await socfortress_threat_intel_lookup(request, session=session)
59 + return socfortress_lookup
backend/app/threat_intel/schema/socfortress.py new
+42
@@ -0,0 +1,42 @@
1 +from typing import List
2 +from typing import Optional
3 +
4 +from pydantic import BaseModel
5 +from pydantic import Field
6 +
7 +
8 +class SocfortressThreatIntelRequest(BaseModel):
9 + ioc_value: str
10 + customer_code: Optional[str] = Field("socfortress_copilot", description="The customer code for the customer")
11 +
12 +
13 +class IoCMapping(BaseModel):
14 + comment: Optional[str] = Field(None, description="Comment about the IOCs")
15 + ioc_source: str = Field("SOCFortress Threat Intel", description="Identifier for the source of the IOC")
16 + report_url: Optional[str] = Field(None, description="URL for the related report")
17 + score: Optional[int] = Field(
18 + None,
19 + description="Score indicating the severity or importance",
20 + )
21 + timestamp: Optional[str] = Field(None, description="Timestamp for the data")
22 + type: Optional[str] = Field(
23 + None,
24 + description="Type of indicator, e.g., Domain-Name",
25 + )
26 + value: Optional[str] = Field(None, description="The actual value of the indicator")
27 + virustotal_url: Optional[str] = Field(
28 + None,
29 + description="URL to the VirusTotal report",
30 + )
31 +
32 + def to_dict(self):
33 + return self.dict()
34 +
35 +
36 +class IoCResponse(BaseModel):
37 + data: Optional[IoCMapping] = Field(None, description="The data for the IoC")
38 + success: bool = Field(..., description="Indicates if it was successful")
39 + message: Optional[str] = Field(None, description="Message about the IoC")
40 +
41 + def to_dict(self):
42 + return self.dict()
backend/app/threat_intel/services/socfortress.py new
+97
@@ -0,0 +1,97 @@
1 +import httpx
2 +from fastapi import APIRouter
3 +from fastapi import Body
4 +from fastapi import Depends
5 +from fastapi import HTTPException
6 +from fastapi import Security
7 +from loguru import logger
8 +from sqlalchemy.ext.asyncio import AsyncSession
9 +from sqlalchemy.future import select
10 +
11 +from app.threat_intel.schema.socfortress import IoCMapping
12 +from app.threat_intel.schema.socfortress import IoCResponse
13 +from app.threat_intel.schema.socfortress import SocfortressThreatIntelRequest
14 +from app.utils import get_connector_attribute
15 +
16 +
17 +async def get_socfortress_threat_intel_attributes(column_name: str, session: AsyncSession) -> str:
18 + """
19 + Gets the SocFortress Threat Intel attribute from the database.
20 +
21 + Args:
22 + column_name (str): The column name of the SocFortress Threat Intel attribute.
23 + session (AsyncSession): The database session.
24 +
25 + Raises:
26 + HTTPException: Raised if the SocFortress Threat Intel Attribute is not found.
27 +
28 + Returns:
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)
33 + # Close the session
34 + await session.close()
35 + if not attribute_value:
36 + raise HTTPException(status_code=500, detail="SocFortress Threat Intel attributes not found in the database.")
37 + return attribute_value
38 +
39 +
40 +async def invoke_socfortress_threat_intel_api(api_key: str, url: str, request: SocfortressThreatIntelRequest) -> dict:
41 + """
42 + Invokes the Socfortress Threat Intel API with the provided API key, URL, and request parameters.
43 +
44 + Args:
45 + api_key (str): The API key for authentication.
46 + url (str): The URL of the Socfortress Threat Intel API.
47 + request (SocfortressThreatIntelRequest): The request object containing the IOC value and customer code.
48 +
49 + Returns:
50 + dict: The JSON response from the Socfortress Threat Intel API.
51 +
52 + Raises:
53 + httpx.HTTPStatusError: If the API request fails with a non-successful status code.
54 + """
55 + headers = {"module-version": "your_module_version", "x-api-key": api_key}
56 + params = {"value": f"{request.ioc_value}&customer_code={request.customer_code}"}
57 + logger.info(f"Invoking Socfortress Threat Intel API with params: {params}")
58 + async with httpx.AsyncClient() as client:
59 + response = await client.get(url, headers=headers, params=params)
60 + return response.json()
61 +
62 +
63 +async def get_ioc_response(request: SocfortressThreatIntelRequest, session: AsyncSession) -> IoCResponse:
64 + """
65 + Retrieves IoC response from Socfortress Threat Intel API.
66 +
67 + Args:
68 + request (SocfortressThreatIntelRequest): The request object containing the IoC data.
69 + session (AsyncSession): The async session object for making HTTP requests.
70 +
71 + Returns:
72 + IoCResponse: The response object containing the IoC data and success status.
73 + """
74 + api_key = await get_socfortress_threat_intel_attributes("connector_api_key", session)
75 + url = await get_socfortress_threat_intel_attributes("connector_url", session)
76 + response_data = await invoke_socfortress_threat_intel_api(api_key, url, request)
77 +
78 + # Using .get() with default values
79 + data = response_data.get("data", {})
80 + success = response_data.get("success", False)
81 + message = response_data.get("message", "No message provided")
82 +
83 + return IoCResponse(data=IoCMapping(**data), success=success, message=message)
84 +
85 +
86 +async def socfortress_threat_intel_lookup(request: SocfortressThreatIntelRequest, session: AsyncSession) -> IoCResponse:
87 + """
88 + Performs a threat intelligence lookup using the Socfortress service.
89 +
90 + Args:
91 + request (SocfortressThreatIntelRequest): The request object containing the IoC to lookup.
92 + session (AsyncSession): The async session object for making HTTP requests.
93 +
94 + Returns:
95 + IoCResponse: The response object containing the threat intelligence information.
96 + """
97 + return await get_ioc_response(request, session)
backend/app/utils.py
+45
@@ -2,10 +2,12 @@ from datetime import datetime
2 from datetime import timedelta
3 from enum import Enum
4 from typing import Any
5 +from typing import Dict
6 from typing import List
7 from typing import Optional
8 from typing import Union
9
10 +import requests
11 from fastapi import APIRouter
12 from fastapi import Depends
13 from fastapi import HTTPException
@@ -21,9 +23,11 @@ from sqlalchemy.future import select
23
24 from app.auth.services.universal import find_user
25 from app.auth.utils import AuthHandler
26 +from app.connectors.utils import get_connector_info_from_db
27 from app.db.all_models import Connectors
28 from app.db.db_session import Session
29 from app.db.db_session import engine
30 +from app.db.db_session import get_db_session
31 from app.db.db_session import get_session
32 from app.db.universal_models import LogEntry
33
@@ -464,3 +468,44 @@ async def get_connector_attribute(connector_id: int, column_name: str, session:
468 if connector:
469 return getattr(connector, column_name, None)
470 return None
471 +
472 +
473 +################## ! Wazuh Worker Provisioning App ! ##################
474 +################## ! https://github.com/socfortress/Customer-Provisioning-Worker ! ##################
475 +async def verify_wazuh_worker_provisioning_healtcheck(attributes: Dict[str, Any]) -> Dict[str, Any]:
476 + """
477 + Verifies the connection to Wazuh Worker Provisioning service.
478 +
479 + Returns:
480 + dict: A dictionary containing 'connectionSuccessful' status.
481 + """
482 + logger.info(f"Verifying the wazuh-worker provisioning connection to {attributes['connector_url']}")
483 +
484 + try:
485 + wazuh_worker_provisioning_healthcheck = requests.get(
486 + f"{attributes['connector_url']}/healthcheck",
487 + verify=False,
488 + )
489 +
490 + if wazuh_worker_provisioning_healthcheck.status_code == 200:
491 + return {"connectionSuccessful": True, "message": "Wazuh Worker Provisioning healthcheck successful"}
492 + else:
493 + logger.error(f"Connection to {attributes['connector_url']} failed with error: {wazuh_worker_provisioning_healthcheck.text}")
494 +
495 + return {"connectionSuccessful": False, "message": f"Connection to {attributes['connector_url']} failed"}
496 + except Exception as e:
497 + logger.error(f"Connection to {attributes['connector_url']} failed with error: {e}")
498 +
499 + return {"connectionSuccessful": False, "message": f"Connection to {attributes['connector_url']} failed with error."}
500 +
501 +
502 +async def verify_wazuh_worker_provisioning_connection(connector_name: str) -> str:
503 + """
504 + Returns the status of the connection to Wazuh Worker Provisioning service.
505 + """
506 + async with get_db_session() as session: # This will correctly enter the context manager
507 + attributes = await get_connector_info_from_db(connector_name, session)
508 + if attributes is None:
509 + logger.error("No Wazuh Worker Provisioning connector found in the database")
510 + return None
511 + return await verify_wazuh_worker_provisioning_healtcheck(attributes)
backend/copilot.py
+2
@@ -33,6 +33,7 @@ from app.routers import logs
33 from app.routers import shuffle
34 from app.routers import smtp
35 from app.routers import sublime
36 +from app.routers import threat_intel
37 from app.routers import velociraptor
38 from app.routers import wazuh_indexer
39 from app.routers import wazuh_manager
@@ -84,6 +85,7 @@ app.include_router(logs.router)
85 app.include_router(influxdb.router)
86 app.include_router(grafana.router)
87 app.include_router(customer_provisioning.router)
88 +app.include_router(threat_intel.router)
89
90
91 @app.on_event("startup")
backend/requirements.in
+1
@@ -10,6 +10,7 @@ elasticsearch7==7.10.1
10 environs
11 fastapi
12 grafana-client
13 +httpx
14 influxdb-client[async]
15 libmagic
16 loguru
package-lock.json
+1465 -1175
@@ -13,48 +13,48 @@
13 "@fontsource/jetbrains-mono": "^5.0.17",
14 "@fontsource/lexend": "^5.0.17",
15 "@fontsource/public-sans": "^5.0.15",
16 - "@fullcalendar/core": "^6.1.9",
17 - "@fullcalendar/daygrid": "^6.1.9",
18 - "@fullcalendar/interaction": "^6.1.9",
19 - "@fullcalendar/list": "^6.1.9",
20 - "@fullcalendar/timegrid": "^6.1.9",
21 - "@fullcalendar/vue3": "^6.1.9",
22 - "@milkdown/core": "^7.3.1",
23 - "@milkdown/ctx": "^7.3.1",
24 - "@milkdown/preset-commonmark": "^7.3.1",
25 - "@milkdown/prose": "^7.3.1",
26 - "@milkdown/theme-nord": "^7.3.1",
27 - "@milkdown/transformer": "^7.3.1",
28 - "@milkdown/vue": "^7.3.1",
16 + "@fullcalendar/core": "^6.1.10",
17 + "@fullcalendar/daygrid": "^6.1.10",
18 + "@fullcalendar/interaction": "^6.1.10",
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",
29 "@popperjs/core": "^2.11.8",
30 "@revolist/revogrid": "^4.7.0-next.4",
31 "@revolist/revogrid-column-numeral": "^1.0.2",
32 "@revolist/vue3-datagrid": "^3.6.17",
33 - "@tiptap/extension-character-count": "^2.1.12",
34 - "@tiptap/extension-highlight": "^2.1.12",
35 - "@tiptap/extension-link": "^2.1.12",
36 - "@tiptap/extension-task-item": "^2.1.12",
37 - "@tiptap/extension-task-list": "^2.1.12",
38 - "@tiptap/extension-text-align": "^2.1.12",
39 - "@tiptap/extension-underline": "^2.1.12",
40 - "@tiptap/pm": "^2.1.12",
41 - "@tiptap/starter-kit": "^2.1.12",
42 - "@tiptap/vue-3": "^2.1.12",
33 + "@tiptap/extension-character-count": "^2.1.13",
34 + "@tiptap/extension-highlight": "^2.1.13",
35 + "@tiptap/extension-link": "^2.1.13",
36 + "@tiptap/extension-task-item": "^2.1.13",
37 + "@tiptap/extension-task-list": "^2.1.13",
38 + "@tiptap/extension-text-align": "^2.1.13",
39 + "@tiptap/extension-underline": "^2.1.13",
40 + "@tiptap/pm": "^2.1.13",
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.6.1",
45 - "@vueuse/core": "^10.6.1",
46 - "apexcharts": "^3.44.0",
44 + "@vueuse/components": "^10.7.0",
45 + "@vueuse/core": "^10.7.0",
46 + "apexcharts": "^3.44.2",
47 "bytes": "^3.1.2",
48 - "chart.js": "^4.4.0",
48 + "chart.js": "^4.4.1",
49 "colord": "^2.9.3",
50 "dayjs": "^1.11.10",
51 "detect-touch-device": "^1.1.6",
52 "echarts": "^5.4.3",
53 "geojson": "^0.5.0",
54 "highlight.js": "^11.9.0",
55 - "jose": "^5.1.1",
55 + "jose": "^5.1.3",
56 "lodash": "^4.17.21",
57 - "maplibre-gl": "^3.6.1",
57 + "maplibre-gl": "^3.6.2",
58 "mitt": "^3.0.1",
59 "naive-ui": "^2.35.0",
60 "password-validator": "^5.3.0",
@@ -65,12 +65,12 @@
65 "shepherd.js": "^11.2.0",
66 "v-calendar": "^3.1.2",
67 "validator": "^13.11.0",
68 - "vue": "^3.3.8",
68 + "vue": "^3.3.10",
69 "vue-advanced-cropper": "^2.8.8",
70 "vue-cal": "^4.8.1",
71 "vue-chartjs": "^5.2.0",
72 "vue-highlight-words": "^3.0.1",
73 - "vue-i18n": "^9.7.0",
73 + "vue-i18n": "^9.8.0",
74 "vue-maplibre-gl": "^3.0.3",
75 "vue-router": "^4.2.5",
76 "vue-sjv": "^0.0.6",
@@ -84,47 +84,47 @@
84 "@css-render/vue3-ssr": "^0.15.12",
85 "@faker-js/faker": "^8.3.1",
86 "@iconify/vue": "^4.1.1",
87 - "@rushstack/eslint-patch": "^1.5.1",
87 + "@rushstack/eslint-patch": "^1.6.0",
88 "@tsconfig/node18": "^18.2.2",
89 "@types/bytes": "^3.1.4",
90 "@types/fs-extra": "^11.0.4",
91 "@types/inquirer": "^9.0.7",
92 "@types/jsdom": "^21.1.6",
93 "@types/lodash": "^4.14.202",
94 - "@types/node": "^20.9.3",
94 + "@types/node": "^20.10.3",
95 "@types/validator": "^13.11.7",
96 - "@vitejs/plugin-vue": "^4.5.0",
96 + "@vitejs/plugin-vue": "^4.5.1",
97 "@vitejs/plugin-vue-jsx": "^3.1.0",
98 "@vue-leaflet/vue-leaflet": "^0.10.1",
99 "@vue/eslint-config-prettier": "^8.0.0",
100 "@vue/eslint-config-typescript": "^12.0.0",
101 - "@vue/test-utils": "^2.4.2",
101 + "@vue/test-utils": "^2.4.3",
102 "@vue/tsconfig": "^0.4.0",
103 "autoprefixer": "^10.4.16",
104 - "cypress": "^13.5.1",
105 - "eslint": "^8.54.0",
104 + "cypress": "^13.6.1",
105 + "eslint": "^8.55.0",
106 "eslint-plugin-cypress": "^2.15.1",
107 - "eslint-plugin-vue": "^9.18.1",
108 - "fs-extra": "^11.1.1",
109 - "jsdom": "^22.1.0",
107 + "eslint-plugin-vue": "^9.19.2",
108 + "fs-extra": "^11.2.0",
109 + "jsdom": "^23.0.1",
110 "json5": "^2.2.3",
111 "leaflet": "^1.9.4",
112 "npm-run-all": "^4.1.5",
113 "picocolors": "^1.0.0",
114 - "postcss": "^8.4.31",
114 + "postcss": "^8.4.32",
115 "prettier": "^3.1.0",
116 "sass": "^1.69.5",
117 "start-server-and-test": "^2.0.3",
118 "tailwind-config-viewer": "^1.7.3",
119 - "tailwindcss": "^3.3.5",
120 - "taze": "^0.12.0",
119 + "tailwindcss": "^3.3.6",
120 + "taze": "^0.13.0",
121 "ts-node": "^10.9.1",
122 "typescript": "~5.3.2",
123 - "unplugin-vue-components": "^0.25.2",
124 - "vite": "^5.0.0",
123 + "unplugin-vue-components": "^0.26.0",
124 + "vite": "^5.0.6",
125 "vite-svg-loader": "^5.1.0",
126 - "vitest": "^0.34.6",
127 - "vue-tsc": "^1.8.22"
126 + "vitest": "^1.0.1",
127 + "vue-tsc": "^1.8.25"
128 },
129 "engines": {
130 "node": ">=16.0.0 <20.5.0"
@@ -173,9 +173,9 @@
173 }
174 },
175 "node_modules/@antfu/ni": {
176 - "version": "0.21.8",
177 - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.8.tgz",
178 - "integrity": "sha512-90X8pU2szlvw0AJo9EZMbYc2eQKkmO7mAdC4tD4r5co2Mm56MT37MIG8EyB7p4WRheuzGxuLDxJ63mF6+Zajiw==",
176 + "version": "0.21.12",
177 + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.12.tgz",
178 + "integrity": "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==",
179 "dev": true,
180 "bin": {
181 "na": "bin/na.mjs",
@@ -521,9 +521,9 @@
521 }
522 },
523 "node_modules/@babel/parser": {
524 - "version": "7.23.4",
525 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz",
526 - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==",
524 + "version": "7.23.5",
525 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
526 + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==",
527 "bin": {
528 "parser": "bin/babel-parser.js"
529 },
@@ -1153,9 +1153,9 @@
1153 }
1154 },
1155 "node_modules/@eslint/eslintrc": {
1156 - "version": "2.1.3",
1157 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
1158 - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
1156 + "version": "2.1.4",
1157 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
1158 + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
1159 "dev": true,
1160 "dependencies": {
1161 "ajv": "^6.12.4",
@@ -1203,9 +1203,9 @@
1203 }
1204 },
1205 "node_modules/@eslint/js": {
1206 - "version": "8.54.0",
1207 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz",
1208 - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==",
1206 + "version": "8.55.0",
1207 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
1208 + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
1209 "dev": true,
1210 "engines": {
1211 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1273,54 +1273,54 @@
1273 "integrity": "sha512-3UKtCVDbwt8FeurOHYBybDzYYJH0peyisGjsQe2aRFR4M693m0DdE3v4BZl+60OjvnXGWhO8O/rmET2kwPF6SQ=="
1274 },
1275 "node_modules/@fullcalendar/core": {
1276 - "version": "6.1.9",
1277 - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.9.tgz",
1278 - "integrity": "sha512-eeG+z9BWerdsU9Ac6j16rpYpPnE0wxtnEHiHrh/u/ADbGTR3hCOjCD9PxQOfhOTHbWOVs7JQunGcksSPu5WZBQ==",
1276 + "version": "6.1.10",
1277 + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.10.tgz",
1278 + "integrity": "sha512-oTXGJSAGpCf1oY+CKp5qYjMHkJCPBkJ3SHitl63n8Q6xKeiwQ4EF6Au451euUovREwJpLmD1AyZrCnWmtB9AVg==",
1279 "dependencies": {
1280 "preact": "~10.12.1"
1281 }
1282 },
1283 "node_modules/@fullcalendar/daygrid": {
1284 - "version": "6.1.9",
1285 - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.9.tgz",
1286 - "integrity": "sha512-o/6joH/7lmVHXAkbaa/tUbzWYnGp/LgfdiFyYPkqQbjKEeivNZWF1WhHqFbhx0zbFONSHtrvkjY2bjr+Ef2quQ==",
1284 + "version": "6.1.10",
1285 + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.10.tgz",
1286 + "integrity": "sha512-Z4GRm1IyHKgxXFTWGcEI0nTsvYOIkpE0aMt3/o3ER2SZkF+hfwcDFhtj0c9+WhMjXFIWYeoTnA9rUOY7Zl/nxA==",
1287 "peerDependencies": {
1288 - "@fullcalendar/core": "~6.1.9"
1288 + "@fullcalendar/core": "~6.1.10"
1289 }
1290 },
1291 "node_modules/@fullcalendar/interaction": {
1292 - "version": "6.1.9",
1293 - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.9.tgz",
1294 - "integrity": "sha512-I3FGnv0kKZpIwujg3HllbKrciNjTqeTYy3oJG226oAn7lV6wnrrDYMmuGmA0jPJAGN46HKrQqKN7ItxQRDec4Q==",
1292 + "version": "6.1.10",
1293 + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.10.tgz",
1294 + "integrity": "sha512-aZRlwCpmDasq2RNeWV0ub20Uevare9Cb6iMlxCacx0fhOC14H28G9d1FsduJIecInL84SPGwt5ItqAYMsWv7zw==",
1295 "peerDependencies": {
1296 - "@fullcalendar/core": "~6.1.9"
1296 + "@fullcalendar/core": "~6.1.10"
1297 }
1298 },
1299 "node_modules/@fullcalendar/list": {
1300 - "version": "6.1.9",
1301 - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.9.tgz",
1302 - "integrity": "sha512-OCKdC1Gz26cJ5QsXdQyXVyzVu23ypT2xzyAR+Wc8jEytcJLWXw2a914m/MVax8n8EHuaIYY2exhsy/eaSU0XNA==",
1300 + "version": "6.1.10",
1301 + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.10.tgz",
1302 + "integrity": "sha512-WE4vuSUCzol4tJd0ZP0cNxeyRPaZcsVVYs2I3qdf3OZQkXwDCdSyWEz0Hluf+XZWcZXt21aEYKlxRjwUpQcf4Q==",
1303 "peerDependencies": {
1304 - "@fullcalendar/core": "~6.1.9"
1304 + "@fullcalendar/core": "~6.1.10"
1305 }
1306 },
1307 "node_modules/@fullcalendar/timegrid": {
1308 - "version": "6.1.9",
1309 - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.9.tgz",
1310 - "integrity": "sha512-le7UV05wVE1Trdr054kgJXTwa+A1pEI8nlCBnPWdcyrL+dTLoPvQ4AWEVCnV7So+4zRYaCqnqGXfCJsj0RQa0g==",
1308 + "version": "6.1.10",
1309 + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.10.tgz",
1310 + "integrity": "sha512-hFKyQXJaPbNyq1reZmvkCmM64O99krHoIcJAbDS+dntCm3FzZUcDtAcRKIbMiantHrezCG/1MEYk3m9e3aKvIQ==",
1311 "dependencies": {
1312 - "@fullcalendar/daygrid": "~6.1.9"
1312 + "@fullcalendar/daygrid": "~6.1.10"
1313 },
1314 "peerDependencies": {
1315 - "@fullcalendar/core": "~6.1.9"
1315 + "@fullcalendar/core": "~6.1.10"
1316 }
1317 },
1318 "node_modules/@fullcalendar/vue3": {
1319 - "version": "6.1.9",
1320 - "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.9.tgz",
1321 - "integrity": "sha512-nuEEb/6uRhD0AH3PzU4Mtod3dD7S729nA1oYorMdCYMgUvXoHJlz2wOKK8w4LGZIn6K2R8Yzo8ol33ElBjHo3A==",
1319 + "version": "6.1.10",
1320 + "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.10.tgz",
1321 + "integrity": "sha512-YMYBQx0TlWNuN4G6ra2dkf5cCF5aVi/2zDLGLvLqe2Nk2o7uNbTkrCSG40061OepWQlJv+hYqm1JukLRmyqi4Q==",
1322 "peerDependencies": {
1323 - "@fullcalendar/core": "~6.1.9",
1323 + "@fullcalendar/core": "~6.1.10",
1324 "vue": "^3.0.11"
1325 }
1326 },
@@ -1403,12 +1403,12 @@
1403 }
1404 },
1405 "node_modules/@intlify/core-base": {
1406 - "version": "9.7.0",
1407 - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.7.0.tgz",
1408 - "integrity": "sha512-1tBnfnCI23jXqGW15cagCjn2GgD487VST1dMG8P5LRzrSfx+kUzqFyTrjMNIwgq1tVaF4HnDpFMUuyrzTLKphw==",
1406 + "version": "9.8.0",
1407 + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.8.0.tgz",
1408 + "integrity": "sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==",
1409 "dependencies": {
1410 - "@intlify/message-compiler": "9.7.0",
1411 - "@intlify/shared": "9.7.0"
1410 + "@intlify/message-compiler": "9.8.0",
1411 + "@intlify/shared": "9.8.0"
1412 },
1413 "engines": {
1414 "node": ">= 16"
@@ -1418,11 +1418,11 @@
1418 }
1419 },
1420 "node_modules/@intlify/message-compiler": {
1421 - "version": "9.7.0",
1422 - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.7.0.tgz",
1423 - "integrity": "sha512-/YdZCio2L2tCM5bZ2eMHbSEIQNPh1QqvZIOLI/yCVKXLscis7O0SsR2nmuU/DfCJ3iSeI8juw82C2wLvfsAeww==",
1421 + "version": "9.8.0",
1422 + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.8.0.tgz",
1423 + "integrity": "sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==",
1424 "dependencies": {
1425 - "@intlify/shared": "9.7.0",
1425 + "@intlify/shared": "9.8.0",
1426 "source-map-js": "^1.0.2"
1427 },
1428 "engines": {
@@ -1433,9 +1433,9 @@
1433 }
1434 },
1435 "node_modules/@intlify/shared": {
1436 - "version": "9.7.0",
1437 - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.7.0.tgz",
1438 - "integrity": "sha512-PUkEuk//YKu4CHS5ah3mNa3XL/+TZj6rAY/6yYN+GCNFd2u+uWUkeuwE4Q6t8dydRWlErOePHHS0KyNoof/oBw==",
1436 + "version": "9.8.0",
1437 + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.8.0.tgz",
1438 + "integrity": "sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ==",
1439 "engines": {
1440 "node": ">= 16"
1441 },
@@ -1739,11 +1739,11 @@
1739 }
1740 },
1741 "node_modules/@milkdown/core": {
1742 - "version": "7.3.1",
1743 - "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.1.tgz",
1744 - "integrity": "sha512-W4wxS87YkXbRMTs9DEWNQWQfbDpfDvJ6EJJA5t/4eMXYymVHEr9h2QsHI23Tiznthgro1X0+kW3nxtfWWHw2xA==",
1742 + "version": "7.3.2",
1743 + "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.2.tgz",
1744 + "integrity": "sha512-FbfFx5GpX7cxbZAyT03Pgnx9tLMrFJJK/RIyShgk5xyVtZGxEwQZ4tTqL280dNmjv5iXCAYz2nG5+8kIKJh4EQ==",
1745 "dependencies": {
1746 - "@milkdown/exception": "7.3.1",
1746 + "@milkdown/exception": "7.3.2",
1747 "remark-parse": "^11.0.0",
1748 "remark-stringify": "^11.0.0",
1749 "tslib": "^2.5.0",
@@ -1756,29 +1756,29 @@
1756 }
1757 },
1758 "node_modules/@milkdown/ctx": {
1759 - "version": "7.3.1",
1760 - "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.1.tgz",
1761 - "integrity": "sha512-Wmf7Bhz8AH2bz4sz38a4DY3jFsDlHaaQ4ZGFi9JzSr1NjFB+2dvc19RYyncF/P14qTwdJc9htzP/HD4mUKlSww==",
1759 + "version": "7.3.2",
1760 + "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.2.tgz",
1761 + "integrity": "sha512-D5bxCWlubfpSlGru58gQd6jBd6a+Gh8vYnWnuozS5NRj9bC2JeBmw92LR52Kxoh7OegiWyKPcXQKEdwU6EKTkg==",
1762 "dependencies": {
1763 - "@milkdown/exception": "7.3.1",
1763 + "@milkdown/exception": "7.3.2",
1764 "tslib": "^2.5.0"
1765 }
1766 },
1767 "node_modules/@milkdown/exception": {
1768 - "version": "7.3.1",
1769 - "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.1.tgz",
1770 - "integrity": "sha512-e2x1h/zE8paoF9ygEbUVZZTNpp1acw6azqExSvL+3myoMgwTsmE/G6oK9YpajY1BfSsLM2J3ii9ByIcsRM6+9w==",
1768 + "version": "7.3.2",
1769 + "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.2.tgz",
1770 + "integrity": "sha512-y46GujvdvlSjeq455VLtVFr3EvRIkseOmQ1cKWMs04HZ06/r/auY2yu/+3ORJ2qQEG1bXoeuTLe4Sq/PgqXSPw==",
1771 "dependencies": {
1772 "tslib": "^2.5.0"
1773 }
1774 },
1775 "node_modules/@milkdown/preset-commonmark": {
1776 - "version": "7.3.1",
1777 - "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.1.tgz",
1778 - "integrity": "sha512-8qiz/jQ4st6Sd3r7wuTSc9XCqsRqcOJFyI3N7Jt6I+Opi/JPE6AXiihsbbfPcN9y4w5w1MuuWH50fq6om5cXXA==",
1776 + "version": "7.3.2",
1777 + "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.2.tgz",
1778 + "integrity": "sha512-gy7Ay1zAHYl07sPraR+tC2bZsw0dyDt+B36QgsIoEpRvKI4LPNSfI+0UuiK0yzKmELsMvMZNu8yxG32q/dtSZA==",
1779 "dependencies": {
1780 - "@milkdown/exception": "7.3.1",
1781 - "@milkdown/utils": "7.3.1",
1780 + "@milkdown/exception": "7.3.2",
1781 + "@milkdown/utils": "7.3.2",
1782 "@sindresorhus/slugify": "^2.2.0",
1783 "remark-inline-links": "^7.0.0",
1784 "tslib": "^2.5.0",
@@ -1792,11 +1792,11 @@
1792 }
1793 },
1794 "node_modules/@milkdown/prose": {
1795 - "version": "7.3.1",
1796 - "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.1.tgz",
1797 - "integrity": "sha512-l9xfPOYDwOnTrTCLYr328pUjg9gwNP5n1CKBVFlpkkGKdDVAfdRsH0QgzNHuw42amwDG+e+uu/s29HGqm9JZog==",
1795 + "version": "7.3.2",
1796 + "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.2.tgz",
1797 + "integrity": "sha512-3CeQ6Z75SL0zSm/fHzbP3e3I2a4+kFbkXI6vreK6AKQeCjYSJ8r/uJLkoDYRmJKOzc6HmnuCpIMbzZQ9kaeEnw==",
1798 "dependencies": {
1799 - "@milkdown/exception": "7.3.1",
1799 + "@milkdown/exception": "7.3.2",
1800 "prosemirror-changeset": "^2.2.1",
1801 "prosemirror-commands": "^1.5.2",
1802 "prosemirror-dropcursor": "^1.8.1",
@@ -1814,9 +1814,9 @@
1814 }
1815 },
1816 "node_modules/@milkdown/theme-nord": {
1817 - "version": "7.3.1",
1818 - "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.1.tgz",
1819 - "integrity": "sha512-vnloL2XXG9hDdHBkFES3GNi1UzLY7iahOVbuz/0N/m0LGRTkcvy0OUOKzE3csJ6j7ENQhAmv8PhFv60EdlVz0A==",
1817 + "version": "7.3.2",
1818 + "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.2.tgz",
1819 + "integrity": "sha512-CgydLp7E47a1EsFEMoLICSNeKnVfcGeD8FByXtHou4OZcLxYfQdvtGEOObVlgBa01qNOdbATRZsrIl4rc8likQ==",
1820 "dependencies": {
1821 "clsx": "^2.0.0",
1822 "tslib": "^2.5.0"
@@ -1836,11 +1836,11 @@
1836 }
1837 },
1838 "node_modules/@milkdown/transformer": {
1839 - "version": "7.3.1",
1840 - "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.1.tgz",
1841 - "integrity": "sha512-vFGnoOxqVnMNnu+JGs+bxMgIEC1RYhaWWKj1LtpwQQlHTX3PUCN823gF6MjH5R4L98HIg2Ysc7GbE1O7JoL3pw==",
1839 + "version": "7.3.2",
1840 + "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.2.tgz",
1841 + "integrity": "sha512-FsasNHjRRbRha4I3jXhK7FZymTzp4bAeqTB65QcIg5TILSpYan0BCZ2oDqnChK7wxppA9cP29iLOg/FJvNdhmw==",
1842 "dependencies": {
1843 - "@milkdown/exception": "7.3.1",
1843 + "@milkdown/exception": "7.3.2",
1844 "remark": "^15.0.1",
1845 "remark-parse": "^11.0.0",
1846 "remark-stringify": "^11.0.0",
@@ -1852,11 +1852,11 @@
1852 }
1853 },
1854 "node_modules/@milkdown/utils": {
1855 - "version": "7.3.1",
1856 - "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.1.tgz",
1857 - "integrity": "sha512-GT54XYHwnHjHVmH3vBcCFwlzZhdaM3S+1Zp1+ci5bcfTX0Rmt1KUyzkeBJOcSDS4jCm8eTYd2kBCzodZOHqm9A==",
1855 + "version": "7.3.2",
1856 + "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.2.tgz",
1857 + "integrity": "sha512-Dsdfkcs7D/gujERtegsyG+fLa/UbuczSI7+YueXrmyQ7y6LE/Ob8bo/PwSiISFTn4+hzZfchdmcYSmgvlblQNQ==",
1858 "dependencies": {
1859 - "@milkdown/exception": "7.3.1",
1859 + "@milkdown/exception": "7.3.2",
1860 "nanoid": "^5.0.0",
1861 "tslib": "^2.5.0"
1862 },
@@ -1868,11 +1868,11 @@
1868 }
1869 },
1870 "node_modules/@milkdown/vue": {
1871 - "version": "7.3.1",
1872 - "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.1.tgz",
1873 - "integrity": "sha512-JkzmIlRlran60VYELOqCjEOqpenQEIgv/m5sKlfjP0c2AVBBl4XnBDdsS9BswjF/l50JlqA3MoqPzzg/eTdmEA==",
1871 + "version": "7.3.2",
1872 + "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.2.tgz",
1873 + "integrity": "sha512-GgxjZrSaQDfSg/C/4UXz3vC8K1d6JeQ7jeFMnQBinvic2zJuzARDRNPVADEuU6zsHBvL8hCXlI4DiV6OTmzuIg==",
1874 "dependencies": {
1875 - "@milkdown/utils": "7.3.1",
1875 + "@milkdown/utils": "7.3.2",
1876 "tslib": "^2.5.0"
1877 },
1878 "peerDependencies": {
@@ -1994,13 +1994,13 @@
1994 }
1995 },
1996 "node_modules/@npmcli/config": {
1997 - "version": "8.0.1",
1998 - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.1.tgz",
1999 - "integrity": "sha512-NKGmMYv/YTLwJr+qK9CvADSe82NTM9AFwFFpsZpVcPCT3XTdxvJBdXi8xvXWjHSCMb0Cb+7FtU/a5qqguCOhxA==",
1997 + "version": "8.0.2",
1998 + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.2.tgz",
1999 + "integrity": "sha512-g+DAp7bUsiUDynRI4jTO0wPAXJpy3puhovHHg8S4iq54NF8zd00588GJOm5ARxDaDUdKCUYu9E5fNc+esYl5JA==",
2000 "dev": true,
2001 "dependencies": {
2002 "@npmcli/map-workspaces": "^3.0.2",
2003 - "ci-info": "^3.8.0",
2003 + "ci-info": "^4.0.0",
2004 "ini": "^4.1.0",
2005 "nopt": "^7.0.0",
2006 "proc-log": "^3.0.0",
@@ -2021,6 +2021,21 @@
2021 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
2022 }
2023 },
2024 + "node_modules/@npmcli/config/node_modules/ci-info": {
2025 + "version": "4.0.0",
2026 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
2027 + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
2028 + "dev": true,
2029 + "funding": [
2030 + {
2031 + "type": "github",
2032 + "url": "https://github.com/sponsors/sibiraj-s"
2033 + }
2034 + ],
2035 + "engines": {
2036 + "node": ">=8"
2037 + }
2038 + },
2039 "node_modules/@npmcli/config/node_modules/ini": {
2040 "version": "4.1.1",
2041 "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
@@ -2694,9 +2709,9 @@
2709 ]
2710 },
2711 "node_modules/@rushstack/eslint-patch": {
2697 - "version": "1.5.1",
2698 - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz",
2699 - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==",
2712 + "version": "1.6.0",
2713 + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz",
2714 + "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==",
2715 "dev": true
2716 },
2717 "node_modules/@sideway/address": {
@@ -2838,9 +2853,9 @@
2853 }
2854 },
2855 "node_modules/@tiptap/core": {
2841 - "version": "2.1.12",
2842 - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.12.tgz",
2843 - "integrity": "sha512-ZGc3xrBJA9KY8kln5AYTj8y+GDrKxi7u95xIl2eccrqTY5CQeRu6HRNM1yT4mAjuSaG9jmazyjGRlQuhyxCKxQ==",
2856 + "version": "2.1.13",
2857 + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz",
2858 + "integrity": "sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==",
2859 "funding": {
2860 "type": "github",
2861 "url": "https://github.com/sponsors/ueberdosis"
@@ -2850,9 +2865,9 @@
2865 }
2866 },
2867 "node_modules/@tiptap/extension-blockquote": {
2853 - "version": "2.1.12",
2854 - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.12.tgz",
2855 - "integrity": "sha512-Qb3YRlCfugx9pw7VgLTb+jY37OY4aBJeZnqHzx4QThSm13edNYjasokbX0nTwL1Up4NPTcY19JUeHt6fVaVVGg==",
2868 + "version": "2.1.13",
2869 + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.13.tgz",
2870 + "integrity": "sha512-oe6wSQACmODugoP9XH3Ouffjy4BsOBWfTC+dETHNCG6ZED6ShHN3CB9Vr7EwwRgmm2WLaKAjMO1sVumwH+Z1rg==",
2871 "funding": {
2872 "type": "github",
2873 "url": "https://github.com/sponsors/ueberdosis"
@@ -2862,9 +2877,9 @@
2877 }
2878 },
2879 "node_modules/@tiptap/extension-bold": {
2865 - "version": "2.1.12",
2866 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.12.tgz",
2867 - "integrity": "sha512-AZGxIxcGU1/y6V2YEbKsq6BAibL8yQrbRm6EdcBnby41vj1WziewEKswhLGmZx5IKM2r2ldxld03KlfSIlKQZg==",
2880 + "version": "2.1.13",
2881 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.13.tgz",
2882 + "integrity": "sha512-6cHsQTh/rUiG4jkbJer3vk7g60I5tBwEBSGpdxmEHh83RsvevD8+n92PjA24hYYte5RNlATB011E1wu8PVhSvw==",
2883 "funding": {
2884 "type": "github",
2885 "url": "https://github.com/sponsors/ueberdosis"
@@ -2874,9 +2889,9 @@
2889 }
2890 },
2891 "node_modules/@tiptap/extension-bubble-menu": {
2877 - "version": "2.1.12",
2878 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.12.tgz",
2879 - "integrity": "sha512-gAGi21EQ4wvLmT7klgariAc2Hf+cIjaNU2NWze3ut6Ku9gUo5ZLqj1t9SKHmNf4d5JG63O8GxpErqpA7lHlRtw==",
2892 + "version": "2.1.13",
2893 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.13.tgz",
2894 + "integrity": "sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==",
2895 "dependencies": {
2896 "tippy.js": "^6.3.7"
2897 },
@@ -2890,9 +2905,9 @@
2905 }
2906 },
2907 "node_modules/@tiptap/extension-bullet-list": {
2893 - "version": "2.1.12",
2894 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.12.tgz",
2895 - "integrity": "sha512-vtD8vWtNlmAZX8LYqt2yU9w3mU9rPCiHmbp4hDXJs2kBnI0Ju/qAyXFx6iJ3C3XyuMnMbJdDI9ee0spAvFz7cQ==",
2908 + "version": "2.1.13",
2909 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.13.tgz",
2910 + "integrity": "sha512-NkWlQ5bLPUlcROj6G/d4oqAxMf3j3wfndGOPp0z8OoXJtVbVoXl/aMSlLbVgE6n8r6CS8MYxKhXNxrb7Ll2foA==",
2911 "funding": {
2912 "type": "github",
2913 "url": "https://github.com/sponsors/ueberdosis"
@@ -2902,9 +2917,9 @@
2917 }
2918 },
2919 "node_modules/@tiptap/extension-character-count": {
2905 - "version": "2.1.12",
2906 - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.1.12.tgz",
2907 - "integrity": "sha512-+GFbBG13nvF8mFIeisSERG/Q3CuRsTNwVZIRbJTLgGdbHXFqPhJh4Xfm7cv7OaOYevUlVyO+z5pGD7wIl1bLqQ==",
2920 + "version": "2.1.13",
2921 + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.1.13.tgz",
2922 + "integrity": "sha512-FxPxS/Uqd4MgndInxXOcgNd225541Nsk1lT5e2uNTSNiQnG7dj7cSFG5KXGcSGLpGGt6e/E28WR6KLV+0/u+WA==",
2923 "funding": {
2924 "type": "github",
2925 "url": "https://github.com/sponsors/ueberdosis"
@@ -2915,9 +2930,9 @@
2930 }
2931 },
2932 "node_modules/@tiptap/extension-code": {
2918 - "version": "2.1.12",
2919 - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.12.tgz",
2920 - "integrity": "sha512-CRiRq5OTC1lFgSx6IMrECqmtb93a0ZZKujEnaRhzWliPBjLIi66va05f/P1vnV6/tHaC3yfXys6dxB5A4J8jxw==",
2933 + "version": "2.1.13",
2934 + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.13.tgz",
2935 + "integrity": "sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==",
2936 "funding": {
2937 "type": "github",
2938 "url": "https://github.com/sponsors/ueberdosis"
@@ -2927,9 +2942,9 @@
2942 }
2943 },
2944 "node_modules/@tiptap/extension-code-block": {
2930 - "version": "2.1.12",
2931 - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.12.tgz",
2932 - "integrity": "sha512-RXtSYCVsnk8D+K80uNZShClfZjvv1EgO42JlXLVGWQdIgaNyuOv/6I/Jdf+ZzhnpsBnHufW+6TJjwP5vJPSPHA==",
2945 + "version": "2.1.13",
2946 + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.13.tgz",
2947 + "integrity": "sha512-E3tweNExPOV+t1ODKX0MDVsS0aeHGWc1ECt+uyp6XwzsN0bdF2A5+pttQqM7sTcMnQkVACGFbn9wDeLRRcfyQg==",
2948 "funding": {
2949 "type": "github",
2950 "url": "https://github.com/sponsors/ueberdosis"
@@ -2940,9 +2955,9 @@
2955 }
2956 },
2957 "node_modules/@tiptap/extension-document": {
2943 - "version": "2.1.12",
2944 - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.12.tgz",
2945 - "integrity": "sha512-0QNfAkCcFlB9O8cUNSwTSIQMV9TmoEhfEaLz/GvbjwEq4skXK3bU+OQX7Ih07waCDVXIGAZ7YAZogbvrn/WbOw==",
2958 + "version": "2.1.13",
2959 + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.13.tgz",
2960 + "integrity": "sha512-wLwiTWsVmZTGIE5duTcHRmW4ulVxNW4nmgfpk95+mPn1iKyNGtrVhGWleLhBlTj+DWXDtcfNWZgqZkZNzhkqYQ==",
2961 "funding": {
2962 "type": "github",
2963 "url": "https://github.com/sponsors/ueberdosis"
@@ -2952,9 +2967,9 @@
2967 }
2968 },
2969 "node_modules/@tiptap/extension-dropcursor": {
2955 - "version": "2.1.12",
2956 - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.12.tgz",
2957 - "integrity": "sha512-0tT/q8nL4NBCYPxr9T0Brck+RQbWuczm9nV0bnxgt0IiQXoRHutfPWdS7GA65PTuVRBS/3LOco30fbjFhkfz/A==",
2970 + "version": "2.1.13",
2971 + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.13.tgz",
2972 + "integrity": "sha512-NAyJi4BJxH7vl/2LNS1X0ndwFKjEtX+cRgshXCnMyh7qNpIRW6Plczapc/W1OiMncOEhZJfpZfkRSfwG01FWFg==",
2973 "funding": {
2974 "type": "github",
2975 "url": "https://github.com/sponsors/ueberdosis"
@@ -2965,9 +2980,9 @@
2980 }
2981 },
2982 "node_modules/@tiptap/extension-floating-menu": {
2968 - "version": "2.1.12",
2969 - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.12.tgz",
2970 - "integrity": "sha512-uo0ydCJNg6AWwLT6cMUJYVChfvw2PY9ZfvKRhh9YJlGfM02jS4RUG/bJBts6R37f+a5FsOvAVwg8EvqPlNND1A==",
2983 + "version": "2.1.13",
2984 + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.13.tgz",
2985 + "integrity": "sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==",
2986 "dependencies": {
2987 "tippy.js": "^6.3.7"
2988 },
@@ -2981,9 +2996,9 @@
2996 }
2997 },
2998 "node_modules/@tiptap/extension-gapcursor": {
2984 - "version": "2.1.12",
2985 - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.12.tgz",
2986 - "integrity": "sha512-zFYdZCqPgpwoB7whyuwpc8EYLYjUE5QYKb8vICvc+FraBUDM51ujYhFSgJC3rhs8EjI+8GcK8ShLbSMIn49YOQ==",
2999 + "version": "2.1.13",
3000 + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.13.tgz",
3001 + "integrity": "sha512-Cl5apsoTcyPPCgE3ThufxQxZ1wyqqh+9uxUN9VF9AbeTkid6oPZvKXwaILf6AFnkSy+SuKrb9kZD2iaezxpzXw==",
3002 "funding": {
3003 "type": "github",
3004 "url": "https://github.com/sponsors/ueberdosis"
@@ -2994,9 +3009,9 @@
3009 }
3010 },
3011 "node_modules/@tiptap/extension-hard-break": {
2997 - "version": "2.1.12",
2998 - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.12.tgz",
2999 - "integrity": "sha512-nqKcAYGEOafg9D+2cy1E4gHNGuL12LerVa0eS2SQOb+PT8vSel9OTKU1RyZldsWSQJ5rq/w4uIjmLnrSR2w6Yw==",
3012 + "version": "2.1.13",
3013 + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.13.tgz",
3014 + "integrity": "sha512-TGkMzMQayuKg+vN4du0x1ahEItBLcCT1jdWeRsjdM8gHfzbPLdo4PQhVsvm1I0xaZmbJZelhnVsUwRZcIu1WNA==",
3015 "funding": {
3016 "type": "github",
3017 "url": "https://github.com/sponsors/ueberdosis"
@@ -3006,9 +3021,9 @@
3021 }
3022 },
3023 "node_modules/@tiptap/extension-heading": {
3009 - "version": "2.1.12",
3010 - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.12.tgz",
3011 - "integrity": "sha512-MoANP3POAP68Ko9YXarfDKLM/kXtscgp6m+xRagPAghRNujVY88nK1qBMZ3JdvTVN6b/ATJhp8UdrZX96TLV2w==",
3024 + "version": "2.1.13",
3025 + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.13.tgz",
3026 + "integrity": "sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==",
3027 "funding": {
3028 "type": "github",
3029 "url": "https://github.com/sponsors/ueberdosis"
@@ -3018,9 +3033,9 @@
3033 }
3034 },
3035 "node_modules/@tiptap/extension-highlight": {
3021 - "version": "2.1.12",
3022 - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.12.tgz",
3023 - "integrity": "sha512-buen31cYPyiiHA2i0o2i/UcjRTg/42mNDCizGr1OJwvv3AELG3qOFc4Y58WJWIvWNv+1Dr4ZxHA3GNVn0ANWyg==",
3036 + "version": "2.1.13",
3037 + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.13.tgz",
3038 + "integrity": "sha512-ZivjJma5WwPYcG0rpnynVDGis32OGdtpTwETEb+2OOjZBCBlyYQ4tcRk5gS3nzBAjLl/Qu84VVbawLhHXB6few==",
3039 "funding": {
3040 "type": "github",
3041 "url": "https://github.com/sponsors/ueberdosis"
@@ -3030,9 +3045,9 @@
3045 }
3046 },
3047 "node_modules/@tiptap/extension-history": {
3033 - "version": "2.1.12",
3034 - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.12.tgz",
3035 - "integrity": "sha512-6b7UFVkvPjq3LVoCTrYZAczt5sQrQUaoDWAieVClVZoFLfjga2Fwjcfgcie8IjdPt8YO2hG/sar/c07i9vM0Sg==",
3048 + "version": "2.1.13",
3049 + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.13.tgz",
3050 + "integrity": "sha512-1ouitThGTBUObqw250aDwGLMNESBH5PRXIGybsCFO1bktdmWtEw7m72WY41EuX2BH8iKJpcYPerl3HfY1vmCNw==",
3051 "funding": {
3052 "type": "github",
3053 "url": "https://github.com/sponsors/ueberdosis"
@@ -3043,9 +3058,9 @@
3058 }
3059 },
3060 "node_modules/@tiptap/extension-horizontal-rule": {
3046 - "version": "2.1.12",
3047 - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.12.tgz",
3048 - "integrity": "sha512-RRuoK4KxrXRrZNAjJW5rpaxjiP0FJIaqpi7nFbAua2oHXgsCsG8qbW2Y0WkbIoS8AJsvLZ3fNGsQ8gpdliuq3A==",
3061 + "version": "2.1.13",
3062 + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.13.tgz",
3063 + "integrity": "sha512-7OgjgNqZXvBejgULNdMSma2M1nzv4bbZG+FT5XMFZmEOxR9IB1x/RzChjPdeicff2ZK2sfhMBc4Y9femF5XkUg==",
3064 "funding": {
3065 "type": "github",
3066 "url": "https://github.com/sponsors/ueberdosis"
@@ -3056,9 +3071,9 @@
3071 }
3072 },
3073 "node_modules/@tiptap/extension-italic": {
3059 - "version": "2.1.12",
3060 - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.12.tgz",
3061 - "integrity": "sha512-/XYrW4ZEWyqDvnXVKbgTXItpJOp2ycswk+fJ3vuexyolO6NSs0UuYC6X4f+FbHYL5VuWqVBv7EavGa+tB6sl3A==",
3074 + "version": "2.1.13",
3075 + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.13.tgz",
3076 + "integrity": "sha512-HyDJfuDn5hzwGKZiANcvgz6wcum6bEgb4wmJnfej8XanTMJatNVv63TVxCJ10dSc9KGpPVcIkg6W8/joNXIEbw==",
3077 "funding": {
3078 "type": "github",
3079 "url": "https://github.com/sponsors/ueberdosis"
@@ -3068,9 +3083,9 @@
3083 }
3084 },
3085 "node_modules/@tiptap/extension-link": {
3071 - "version": "2.1.12",
3072 - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.12.tgz",
3073 - "integrity": "sha512-Sti5hhlkCqi5vzdQjU/gbmr8kb578p+u0J4kWS+SSz3BknNThEm/7Id67qdjBTOQbwuN07lHjDaabJL0hSkzGQ==",
3086 + "version": "2.1.13",
3087 + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.13.tgz",
3088 + "integrity": "sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==",
3089 "dependencies": {
3090 "linkifyjs": "^4.1.0"
3091 },
@@ -3084,9 +3099,9 @@
3099 }
3100 },
3101 "node_modules/@tiptap/extension-list-item": {
3087 - "version": "2.1.12",
3088 - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.12.tgz",
3089 - "integrity": "sha512-Gk7hBFofAPmNQ8+uw8w5QSsZOMEGf7KQXJnx5B022YAUJTYYxO3jYVuzp34Drk9p+zNNIcXD4kc7ff5+nFOTrg==",
3102 + "version": "2.1.13",
3103 + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.13.tgz",
3104 + "integrity": "sha512-6e8iiCWXOiJTl1XOwVW2tc0YG18h70HUtEHFCx2m5HspOGFKsFEaSS3qYxOheM9HxlmQeDt8mTtqftRjEFRxPQ==",
3105 "funding": {
3106 "type": "github",
3107 "url": "https://github.com/sponsors/ueberdosis"
@@ -3096,9 +3111,9 @@
3111 }
3112 },
3113 "node_modules/@tiptap/extension-ordered-list": {
3099 - "version": "2.1.12",
3100 - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.12.tgz",
3101 - "integrity": "sha512-tF6VGl+D2avCgn9U/2YLJ8qVmV6sPE/iEzVAFZuOSe6L0Pj7SQw4K6AO640QBob/d8VrqqJFHCb6l10amJOnXA==",
3114 + "version": "2.1.13",
3115 + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.13.tgz",
3116 + "integrity": "sha512-UO4ZAL5Vrr1WwER5VjgmeNIWHpqy9cnIRo1En07gZ0OWTjs1eITPcu+4TCn1ZG6DhoFvAQzE5DTxxdhIotg+qw==",
3117 "funding": {
3118 "type": "github",
3119 "url": "https://github.com/sponsors/ueberdosis"
@@ -3108,9 +3123,9 @@
3123 }
3124 },
3125 "node_modules/@tiptap/extension-paragraph": {
3111 - "version": "2.1.12",
3112 - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.12.tgz",
3113 - "integrity": "sha512-hoH/uWPX+KKnNAZagudlsrr4Xu57nusGekkJWBcrb5MCDE91BS+DN2xifuhwXiTHxnwOMVFjluc0bPzQbkArsw==",
3126 + "version": "2.1.13",
3127 + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.13.tgz",
3128 + "integrity": "sha512-cEoZBJrsQn69FPpUMePXG/ltGXtqKISgypj70PEHXt5meKDjpmMVSY4/8cXvFYEYsI9GvIwyAK0OrfAHiSoROA==",
3129 "funding": {
3130 "type": "github",
3131 "url": "https://github.com/sponsors/ueberdosis"
@@ -3120,9 +3135,9 @@
3135 }
3136 },
3137 "node_modules/@tiptap/extension-strike": {
3123 - "version": "2.1.12",
3124 - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.12.tgz",
3125 - "integrity": "sha512-HlhrzIjYUT8oCH9nYzEL2QTTn8d1ECnVhKvzAe6x41xk31PjLMHTUy8aYjeQEkWZOWZ34tiTmslV1ce6R3Dt8g==",
3138 + "version": "2.1.13",
3139 + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.13.tgz",
3140 + "integrity": "sha512-VN6zlaCNCbyJUCDyBFxavw19XmQ4LkCh8n20M8huNqW77lDGXA2A7UcWLHaNBpqAijBRu9mWI8l4Bftyf2fcAw==",
3141 "funding": {
3142 "type": "github",
3143 "url": "https://github.com/sponsors/ueberdosis"
@@ -3132,9 +3147,9 @@
3147 }
3148 },
3149 "node_modules/@tiptap/extension-task-item": {
3135 - "version": "2.1.12",
3136 - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-2.1.12.tgz",
3137 - "integrity": "sha512-uqrDTO4JwukZUt40GQdvB6S+oDhdp4cKNPMi0sbteWziQugkSMLlkYvxU0Hfb/YeziaWWwFI7ssPu/hahyk6dQ==",
3150 + "version": "2.1.13",
3151 + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-2.1.13.tgz",
3152 + "integrity": "sha512-0E1woY0BXpv0SBOGPl5Cmo2RuH+Zchn7dYcTILtOsqHu6onJ4eP0N76+jGFLGV3T0PnPf7JDuwsO/B6pC7yMSg==",
3153 "funding": {
3154 "type": "github",
3155 "url": "https://github.com/sponsors/ueberdosis"
@@ -3145,9 +3160,9 @@
3160 }
3161 },
3162 "node_modules/@tiptap/extension-task-list": {
3148 - "version": "2.1.12",
3149 - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-2.1.12.tgz",
3150 - "integrity": "sha512-BUpYlEWK+Q3kw9KIiOqvhd0tUPhMcOf1+fJmCkluJok+okAxMbP1umAtCEQ3QkoCwLr+vpHJov7h3yi9+dwgeQ==",
3163 + "version": "2.1.13",
3164 + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-2.1.13.tgz",
3165 + "integrity": "sha512-WfTo4KN0PqpmZxx23rak08M7flfBhv9IcPVpuJ4JthZOlexYdOZxaE/Yd4vlqZhq6cibG7CFljp8VzkfTUa1Ew==",
3166 "funding": {
3167 "type": "github",
3168 "url": "https://github.com/sponsors/ueberdosis"
@@ -3157,9 +3172,9 @@
3172 }
3173 },
3174 "node_modules/@tiptap/extension-text": {
3160 - "version": "2.1.12",
3161 - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.12.tgz",
3162 - "integrity": "sha512-rCNUd505p/PXwU9Jgxo4ZJv4A3cIBAyAqlx/dtcY6cjztCQuXJhuQILPhjGhBTOLEEL4kW2wQtqzCmb7O8i2jg==",
3175 + "version": "2.1.13",
3176 + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.13.tgz",
3177 + "integrity": "sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==",
3178 "funding": {
3179 "type": "github",
3180 "url": "https://github.com/sponsors/ueberdosis"
@@ -3169,9 +3184,9 @@
3184 }
3185 },
3186 "node_modules/@tiptap/extension-text-align": {
3172 - "version": "2.1.12",
3173 - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.12.tgz",
3174 - "integrity": "sha512-siMlwrkgVrAxxgmZn8GOc75J7UZi2CVrP9vDHkUPPyKm/fjssYekXwGCEk4Vswii1BbOh2gt+MDsRkeYRGyDlQ==",
3187 + "version": "2.1.13",
3188 + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.13.tgz",
3189 + "integrity": "sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==",
3190 "funding": {
3191 "type": "github",
3192 "url": "https://github.com/sponsors/ueberdosis"
@@ -3181,9 +3196,9 @@
3196 }
3197 },
3198 "node_modules/@tiptap/extension-underline": {
3184 - "version": "2.1.12",
3185 - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.12.tgz",
3186 - "integrity": "sha512-NwwdhFT8gDD0VUNLQx85yFBhP9a8qg8GPuxlGzAP/lPTV8Ubh3vSeQ5N9k2ZF/vHlEvnugzeVCbmYn7wf8vn1g==",
3199 + "version": "2.1.13",
3200 + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.13.tgz",
3201 + "integrity": "sha512-z0CNKPjcvU8TrUSTui1voM7owssyXE9WvEGhIZMHzWwlx2ZXY2/L5+Hh33X/LzSKB9OGf/g1HAuHxrPcYxFuAQ==",
3202 "funding": {
3203 "type": "github",
3204 "url": "https://github.com/sponsors/ueberdosis"
@@ -3193,9 +3208,9 @@
3208 }
3209 },
3210 "node_modules/@tiptap/pm": {
3196 - "version": "2.1.12",
3197 - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.12.tgz",
3198 - "integrity": "sha512-Q3MXXQABG4CZBesSp82yV84uhJh/W0Gag6KPm2HRWPimSFELM09Z9/5WK9RItAYE0aLhe4Krnyiczn9AAa1tQQ==",
3211 + "version": "2.1.13",
3212 + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz",
3213 + "integrity": "sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==",
3214 "dependencies": {
3215 "prosemirror-changeset": "^2.2.0",
3216 "prosemirror-collab": "^1.3.0",
@@ -3222,29 +3237,29 @@
3237 }
3238 },
3239 "node_modules/@tiptap/starter-kit": {
3225 - "version": "2.1.12",
3226 - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.1.12.tgz",
3227 - "integrity": "sha512-+RoP1rWV7rSCit2+3wl2bjvSRiePRJE/7YNKbvH8Faz/+AMO23AFegHoUFynR7U0ouGgYDljGkkj35e0asbSDA==",
3228 - "dependencies": {
3229 - "@tiptap/core": "^2.1.12",
3230 - "@tiptap/extension-blockquote": "^2.1.12",
3231 - "@tiptap/extension-bold": "^2.1.12",
3232 - "@tiptap/extension-bullet-list": "^2.1.12",
3233 - "@tiptap/extension-code": "^2.1.12",
3234 - "@tiptap/extension-code-block": "^2.1.12",
3235 - "@tiptap/extension-document": "^2.1.12",
3236 - "@tiptap/extension-dropcursor": "^2.1.12",
3237 - "@tiptap/extension-gapcursor": "^2.1.12",
3238 - "@tiptap/extension-hard-break": "^2.1.12",
3239 - "@tiptap/extension-heading": "^2.1.12",
3240 - "@tiptap/extension-history": "^2.1.12",
3241 - "@tiptap/extension-horizontal-rule": "^2.1.12",
3242 - "@tiptap/extension-italic": "^2.1.12",
3243 - "@tiptap/extension-list-item": "^2.1.12",
3244 - "@tiptap/extension-ordered-list": "^2.1.12",
3245 - "@tiptap/extension-paragraph": "^2.1.12",
3246 - "@tiptap/extension-strike": "^2.1.12",
3247 - "@tiptap/extension-text": "^2.1.12"
3240 + "version": "2.1.13",
3241 + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.1.13.tgz",
3242 + "integrity": "sha512-ph/mUR/OwPtPkZ5rNHINxubpABn8fHnvJSdhXFrY/q6SKoaO11NZXgegRaiG4aL7O6Sz4LsZVw6Sm0Ae+GJmrg==",
3243 + "dependencies": {
3244 + "@tiptap/core": "^2.1.13",
3245 + "@tiptap/extension-blockquote": "^2.1.13",
3246 + "@tiptap/extension-bold": "^2.1.13",
3247 + "@tiptap/extension-bullet-list": "^2.1.13",
3248 + "@tiptap/extension-code": "^2.1.13",
3249 + "@tiptap/extension-code-block": "^2.1.13",
3250 + "@tiptap/extension-document": "^2.1.13",
3251 + "@tiptap/extension-dropcursor": "^2.1.13",
3252 + "@tiptap/extension-gapcursor": "^2.1.13",
3253 + "@tiptap/extension-hard-break": "^2.1.13",
3254 + "@tiptap/extension-heading": "^2.1.13",
3255 + "@tiptap/extension-history": "^2.1.13",
3256 + "@tiptap/extension-horizontal-rule": "^2.1.13",
3257 + "@tiptap/extension-italic": "^2.1.13",
3258 + "@tiptap/extension-list-item": "^2.1.13",
3259 + "@tiptap/extension-ordered-list": "^2.1.13",
3260 + "@tiptap/extension-paragraph": "^2.1.13",
3261 + "@tiptap/extension-strike": "^2.1.13",
3262 + "@tiptap/extension-text": "^2.1.13"
3263 },
3264 "funding": {
3265 "type": "github",
@@ -3252,12 +3267,12 @@
3267 }
3268 },
3269 "node_modules/@tiptap/vue-3": {
3255 - "version": "2.1.12",
3256 - "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.1.12.tgz",
3257 - "integrity": "sha512-yAcfmWw/9jtIUbhb0uGQVI9NoPYgHRasX2sAGWnm9Al+0aJktgmQ3mLCifXfXfjyEbeMF0p2L6Ul8tO7eho7aQ==",
3270 + "version": "2.1.13",
3271 + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.1.13.tgz",
3272 + "integrity": "sha512-sPMT+uXtPfYLQioXtxxMLij234++PEf5Z43/auOLu737pKdgBr7w0sC8oYiZMgFt9dNCZWBrvT0fupF8yQN8AQ==",
3273 "dependencies": {
3259 - "@tiptap/extension-bubble-menu": "^2.1.12",
3260 - "@tiptap/extension-floating-menu": "^2.1.12"
3274 + "@tiptap/extension-bubble-menu": "^2.1.13",
3275 + "@tiptap/extension-floating-menu": "^2.1.13"
3276 },
3277 "funding": {
3278 "type": "github",
@@ -3369,21 +3384,6 @@
3384 "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==",
3385 "dev": true
3386 },
3372 - "node_modules/@types/chai": {
3373 - "version": "4.3.6",
3374 - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz",
3375 - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==",
3376 - "dev": true
3377 - },
3378 - "node_modules/@types/chai-subset": {
3379 - "version": "1.3.3",
3380 - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
3381 - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
3382 - "dev": true,
3383 - "dependencies": {
3384 - "@types/chai": "*"
3385 - }
3386 - },
3387 "node_modules/@types/debug": {
3388 "version": "4.1.10",
3389 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz",
@@ -3473,9 +3473,9 @@
3473 "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="
3474 },
3475 "node_modules/@types/mapbox__vector-tile": {
3476 - "version": "1.3.3",
3477 - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.3.tgz",
3478 - "integrity": "sha512-d263B3KCQtXKVZMHpMJrEW5EeLBsQ8jvAS9nhpUKC5hHIlQaACG9PWkW8qxEeNuceo9120AwPjeS91uNa4ltqA==",
3476 + "version": "1.3.4",
3477 + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
3478 + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
3479 "dependencies": {
3480 "@types/geojson": "*",
3481 "@types/mapbox__point-geometry": "*",
@@ -3496,9 +3496,9 @@
3496 "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ=="
3497 },
3498 "node_modules/@types/node": {
3499 - "version": "20.9.3",
3500 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz",
3501 - "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==",
3499 + "version": "20.10.3",
3500 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz",
3501 + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==",
3502 "dev": true,
3503 "dependencies": {
3504 "undici-types": "~5.26.4"
@@ -3520,9 +3520,9 @@
3520 "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg=="
3521 },
3522 "node_modules/@types/pbf": {
3523 - "version": "3.0.4",
3524 - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.4.tgz",
3525 - "integrity": "sha512-SOFlLGZkLbEXJRwcWCqeP/Koyaf/uAqLXHUsdo/nMfjLsNd8kqauwHe9GBOljSmpcHp/LC6kOjo3SidGjNirVA=="
3523 + "version": "3.0.5",
3524 + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
3525 + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="
3526 },
3527 "node_modules/@types/resize-observer-browser": {
3528 "version": "0.1.7",
@@ -3896,9 +3896,9 @@
3896 "dev": true
3897 },
3898 "node_modules/@vitejs/plugin-vue": {
3899 - "version": "4.5.0",
3900 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz",
3901 - "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==",
3899 + "version": "4.5.1",
3900 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.1.tgz",
3901 + "integrity": "sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g==",
3902 "dev": true,
3903 "engines": {
3904 "node": "^14.18.0 || >=16.0.0"
@@ -3927,13 +3927,13 @@
3927 }
3928 },
3929 "node_modules/@vitest/expect": {
3930 - "version": "0.34.6",
3931 - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz",
3932 - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==",
3930 + "version": "1.0.1",
3931 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.1.tgz",
3932 + "integrity": "sha512-3cdrb/eKD/0tygDX75YscuHEHMUJ70u3UoLSq2eqhWks57AyzvsDQbyn53IhZ0tBN7gA8Jj2VhXiOV2lef7thw==",
3933 "dev": true,
3934 "dependencies": {
3935 - "@vitest/spy": "0.34.6",
3936 - "@vitest/utils": "0.34.6",
3935 + "@vitest/spy": "1.0.1",
3936 + "@vitest/utils": "1.0.1",
3937 "chai": "^4.3.10"
3938 },
3939 "funding": {
@@ -3941,13 +3941,13 @@
3941 }
3942 },
3943 "node_modules/@vitest/runner": {
3944 - "version": "0.34.6",
3945 - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz",
3946 - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==",
3944 + "version": "1.0.1",
3945 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.1.tgz",
3946 + "integrity": "sha512-/+z0vhJ0MfRPT3AyTvAK6m57rzlew/ct8B2a4LMv7NhpPaiI2QLGyOBMB3lcioWdJHjRuLi9aYppfOv0B5aRQA==",
3947 "dev": true,
3948 "dependencies": {
3949 - "@vitest/utils": "0.34.6",
3950 - "p-limit": "^4.0.0",
3949 + "@vitest/utils": "1.0.1",
3950 + "p-limit": "^5.0.0",
3951 "pathe": "^1.1.1"
3952 },
3953 "funding": {
@@ -3955,15 +3955,15 @@
3955 }
3956 },
3957 "node_modules/@vitest/runner/node_modules/p-limit": {
3958 - "version": "4.0.0",
3959 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
3960 - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
3958 + "version": "5.0.0",
3959 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
3960 + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
3961 "dev": true,
3962 "dependencies": {
3963 "yocto-queue": "^1.0.0"
3964 },
3965 "engines": {
3966 - "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
3966 + "node": ">=18"
3967 },
3968 "funding": {
3969 "url": "https://github.com/sponsors/sindresorhus"
@@ -3982,70 +3982,71 @@
3982 }
3983 },
3984 "node_modules/@vitest/snapshot": {
3985 - "version": "0.34.6",
3986 - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz",
3987 - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==",
3985 + "version": "1.0.1",
3986 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.1.tgz",
3987 + "integrity": "sha512-wIPtPDGSxEZ+DpNMc94AsybX6LV6uN6sosf5TojyP1m2QbKwiRuLV/5RSsjt1oWViHsTj8mlcwrQQ1zHGO0fMw==",
3988 "dev": true,
3989 "dependencies": {
3990 - "magic-string": "^0.30.1",
3990 + "magic-string": "^0.30.5",
3991 "pathe": "^1.1.1",
3992 - "pretty-format": "^29.5.0"
3992 + "pretty-format": "^29.7.0"
3993 },
3994 "funding": {
3995 "url": "https://opencollective.com/vitest"
3996 }
3997 },
3998 "node_modules/@vitest/spy": {
3999 - "version": "0.34.6",
4000 - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz",
4001 - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==",
3999 + "version": "1.0.1",
4000 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.1.tgz",
4001 + "integrity": "sha512-yXwm1uKhBVr/5MhVeSmtNqK+0q2RXIchJt8kokEKdrWLtkPeDgdbZ6SjR1VQGZuNdWL6sSBnLayIyVvcS0qLfA==",
4002 "dev": true,
4003 "dependencies": {
4004 - "tinyspy": "^2.1.1"
4004 + "tinyspy": "^2.2.0"
4005 },
4006 "funding": {
4007 "url": "https://opencollective.com/vitest"
4008 }
4009 },
4010 "node_modules/@vitest/utils": {
4011 - "version": "0.34.6",
4012 - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz",
4013 - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==",
4011 + "version": "1.0.1",
4012 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.1.tgz",
4013 + "integrity": "sha512-MGPCHkzXbbAyscrhwGzh8uP1HPrTYLWaj1WTDtWSGrpe2yJWLRN9mF9ooKawr6NMOg9vTBtg2JqWLfuLC7Dknw==",
4014 "dev": true,
4015 "dependencies": {
4016 - "diff-sequences": "^29.4.3",
4017 - "loupe": "^2.3.6",
4018 - "pretty-format": "^29.5.0"
4016 + "diff-sequences": "^29.6.3",
4017 + "loupe": "^2.3.7",
4018 + "pretty-format": "^29.7.0"
4019 },
4020 "funding": {
4021 "url": "https://opencollective.com/vitest"
4022 }
4023 },
4024 "node_modules/@volar/language-core": {
4025 - "version": "1.10.5",
4026 - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.5.tgz",
4027 - "integrity": "sha512-xD71j4Ee0Ycq8WsiAE6H/aCThGdTobiZZeD+jFD+bvmbopa1Az296pqJysr3Ck8c7n5+GGF+xlKCS3WxRFYgSQ==",
4025 + "version": "1.11.1",
4026 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
4027 + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
4028 "dev": true,
4029 "dependencies": {
4030 - "@volar/source-map": "1.10.5"
4030 + "@volar/source-map": "1.11.1"
4031 }
4032 },
4033 "node_modules/@volar/source-map": {
4034 - "version": "1.10.5",
4035 - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.5.tgz",
4036 - "integrity": "sha512-s4kgo66SA1kMzYvF9HFE6Vc1rxtXLUmcLrT2WKnchPDvLne+97Kw+xoR2NxJFmsvHoL18vmu/YGXYcN+Q5re1g==",
4034 + "version": "1.11.1",
4035 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
4036 + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
4037 "dev": true,
4038 "dependencies": {
4039 "muggle-string": "^0.3.1"
4040 }
4041 },
4042 "node_modules/@volar/typescript": {
4043 - "version": "1.10.5",
4044 - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.5.tgz",
4045 - "integrity": "sha512-kfDehpeLJku9i1BgsFOYIczPmFFH4herl+GZrLGdvX5urTqeCKsKYlF36iNmFaADzjMb9WlENcUZzPjK8MxNrQ==",
4043 + "version": "1.11.1",
4044 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
4045 + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
4046 "dev": true,
4047 "dependencies": {
4048 - "@volar/language-core": "1.10.5"
4048 + "@volar/language-core": "1.11.1",
4049 + "path-browserify": "^1.0.1"
4050 }
4051 },
4052 "node_modules/@vue-leaflet/vue-leaflet": {
@@ -4093,49 +4094,49 @@
4094 }
4095 },
4096 "node_modules/@vue/compiler-core": {
4096 - "version": "3.3.8",
4097 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz",
4098 - "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==",
4097 + "version": "3.3.10",
4098 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.10.tgz",
4099 + "integrity": "sha512-doe0hODR1+i1menPkRzJ5MNR6G+9uiZHIknK3Zn5OcIztu6GGw7u0XUzf3AgB8h/dfsZC9eouzoLo3c3+N/cVA==",
4100 "dependencies": {
4100 - "@babel/parser": "^7.23.0",
4101 - "@vue/shared": "3.3.8",
4101 + "@babel/parser": "^7.23.5",
4102 + "@vue/shared": "3.3.10",
4103 "estree-walker": "^2.0.2",
4104 "source-map-js": "^1.0.2"
4105 }
4106 },
4107 "node_modules/@vue/compiler-dom": {
4107 - "version": "3.3.8",
4108 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz",
4109 - "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==",
4108 + "version": "3.3.10",
4109 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.10.tgz",
4110 + "integrity": "sha512-NCrqF5fm10GXZIK0GrEAauBqdy+F2LZRt3yNHzrYjpYBuRssQbuPLtSnSNjyR9luHKkWSH8we5LMB3g+4z2HvA==",
4111 "dependencies": {
4111 - "@vue/compiler-core": "3.3.8",
4112 - "@vue/shared": "3.3.8"
4112 + "@vue/compiler-core": "3.3.10",
4113 + "@vue/shared": "3.3.10"
4114 }
4115 },
4116 "node_modules/@vue/compiler-sfc": {
4116 - "version": "3.3.8",
4117 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz",
4118 - "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==",
4119 - "dependencies": {
4120 - "@babel/parser": "^7.23.0",
4121 - "@vue/compiler-core": "3.3.8",
4122 - "@vue/compiler-dom": "3.3.8",
4123 - "@vue/compiler-ssr": "3.3.8",
4124 - "@vue/reactivity-transform": "3.3.8",
4125 - "@vue/shared": "3.3.8",
4117 + "version": "3.3.10",
4118 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.10.tgz",
4119 + "integrity": "sha512-xpcTe7Rw7QefOTRFFTlcfzozccvjM40dT45JtrE3onGm/jBLZ0JhpKu3jkV7rbDFLeeagR/5RlJ2Y9SvyS0lAg==",
4120 + "dependencies": {
4121 + "@babel/parser": "^7.23.5",
4122 + "@vue/compiler-core": "3.3.10",
4123 + "@vue/compiler-dom": "3.3.10",
4124 + "@vue/compiler-ssr": "3.3.10",
4125 + "@vue/reactivity-transform": "3.3.10",
4126 + "@vue/shared": "3.3.10",
4127 "estree-walker": "^2.0.2",
4128 "magic-string": "^0.30.5",
4128 - "postcss": "^8.4.31",
4129 + "postcss": "^8.4.32",
4130 "source-map-js": "^1.0.2"
4131 }
4132 },
4133 "node_modules/@vue/compiler-ssr": {
4133 - "version": "3.3.8",
4134 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz",
4135 - "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==",
4134 + "version": "3.3.10",
4135 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.10.tgz",
4136 + "integrity": "sha512-12iM4jA4GEbskwXMmPcskK5wImc2ohKm408+o9iox3tfN9qua8xL0THIZtoe9OJHnXP4eOWZpgCAAThEveNlqQ==",
4137 "dependencies": {
4137 - "@vue/compiler-dom": "3.3.8",
4138 - "@vue/shared": "3.3.8"
4138 + "@vue/compiler-dom": "3.3.10",
4139 + "@vue/shared": "3.3.10"
4140 }
4141 },
4142 "node_modules/@vue/devtools-api": {
@@ -4182,18 +4183,19 @@
4183 }
4184 },
4185 "node_modules/@vue/language-core": {
4185 - "version": "1.8.22",
4186 - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.22.tgz",
4187 - "integrity": "sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==",
4186 + "version": "1.8.25",
4187 + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.25.tgz",
4188 + "integrity": "sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA==",
4189 "dev": true,
4190 "dependencies": {
4190 - "@volar/language-core": "~1.10.5",
4191 - "@volar/source-map": "~1.10.5",
4191 + "@volar/language-core": "~1.11.1",
4192 + "@volar/source-map": "~1.11.1",
4193 "@vue/compiler-dom": "^3.3.0",
4194 "@vue/shared": "^3.3.0",
4195 "computeds": "^0.0.1",
4196 "minimatch": "^9.0.3",
4197 "muggle-string": "^0.3.1",
4198 + "path-browserify": "^1.0.1",
4199 "vue-template-compiler": "^2.7.14"
4200 },
4201 "peerDependencies": {
@@ -4230,41 +4232,41 @@
4232 }
4233 },
4234 "node_modules/@vue/reactivity": {
4233 - "version": "3.3.8",
4234 - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz",
4235 - "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==",
4235 + "version": "3.3.10",
4236 + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.10.tgz",
4237 + "integrity": "sha512-H5Z7rOY/JLO+e5a6/FEXaQ1TMuOvY4LDVgT+/+HKubEAgs9qeeZ+NhADSeEtrNQeiKLDuzeKc8v0CUFpB6Pqgw==",
4238 "dependencies": {
4237 - "@vue/shared": "3.3.8"
4239 + "@vue/shared": "3.3.10"
4240 }
4241 },
4242 "node_modules/@vue/reactivity-transform": {
4241 - "version": "3.3.8",
4242 - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz",
4243 - "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==",
4243 + "version": "3.3.10",
4244 + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.10.tgz",
4245 + "integrity": "sha512-0xBdk+CKHWT+Gev8oZ63Tc0qFfj935YZx+UAynlutnrDZ4diFCVFMWixn65HzjE3S1iJppWOo6Tt1OzASH7VEg==",
4246 "dependencies": {
4245 - "@babel/parser": "^7.23.0",
4246 - "@vue/compiler-core": "3.3.8",
4247 - "@vue/shared": "3.3.8",
4247 + "@babel/parser": "^7.23.5",
4248 + "@vue/compiler-core": "3.3.10",
4249 + "@vue/shared": "3.3.10",
4250 "estree-walker": "^2.0.2",
4251 "magic-string": "^0.30.5"
4252 }
4253 },
4254 "node_modules/@vue/runtime-core": {
4253 - "version": "3.3.8",
4254 - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz",
4255 - "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==",
4255 + "version": "3.3.10",
4256 + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.10.tgz",
4257 + "integrity": "sha512-DZ0v31oTN4YHX9JEU5VW1LoIVgFovWgIVb30bWn9DG9a7oA415idcwsRNNajqTx8HQJyOaWfRKoyuP2P2TYIag==",
4258 "dependencies": {
4257 - "@vue/reactivity": "3.3.8",
4258 - "@vue/shared": "3.3.8"
4259 + "@vue/reactivity": "3.3.10",
4260 + "@vue/shared": "3.3.10"
4261 }
4262 },
4263 "node_modules/@vue/runtime-dom": {
4262 - "version": "3.3.8",
4263 - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz",
4264 - "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==",
4264 + "version": "3.3.10",
4265 + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.10.tgz",
4266 + "integrity": "sha512-c/jKb3ny05KJcYk0j1m7Wbhrxq7mZYr06GhKykDMNRRR9S+/dGT8KpHuNQjv3/8U4JshfkAk6TpecPD3B21Ijw==",
4267 "dependencies": {
4266 - "@vue/runtime-core": "3.3.8",
4267 - "@vue/shared": "3.3.8",
4268 + "@vue/runtime-core": "3.3.10",
4269 + "@vue/shared": "3.3.10",
4270 "csstype": "^3.1.2"
4271 }
4272 },
@@ -4274,26 +4276,26 @@
4276 "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
4277 },
4278 "node_modules/@vue/server-renderer": {
4277 - "version": "3.3.8",
4278 - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz",
4279 - "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==",
4279 + "version": "3.3.10",
4280 + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.10.tgz",
4281 + "integrity": "sha512-0i6ww3sBV3SKlF3YTjSVqKQ74xialMbjVYGy7cOTi7Imd8ediE7t72SK3qnvhrTAhOvlQhq6Bk6nFPdXxe0sAg==",
4282 "dependencies": {
4281 - "@vue/compiler-ssr": "3.3.8",
4282 - "@vue/shared": "3.3.8"
4283 + "@vue/compiler-ssr": "3.3.10",
4284 + "@vue/shared": "3.3.10"
4285 },
4286 "peerDependencies": {
4285 - "vue": "3.3.8"
4287 + "vue": "3.3.10"
4288 }
4289 },
4290 "node_modules/@vue/shared": {
4289 - "version": "3.3.8",
4290 - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz",
4291 - "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw=="
4291 + "version": "3.3.10",
4292 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.10.tgz",
4293 + "integrity": "sha512-2y3Y2J1a3RhFa0WisHvACJR2ncvWiVHcP8t0Inxo+NKz+8RKO4ZV8eZgCxRgQoA6ITfV12L4E6POOL9HOU5nqw=="
4294 },
4295 "node_modules/@vue/test-utils": {
4294 - "version": "2.4.2",
4295 - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.2.tgz",
4296 - "integrity": "sha512-07lLjpG1o9tEBoWQfVOFhDT7+WFCdDeECoeSdzOuVgIi6nxb2JDLGNNOV6+3crPpyg/jMlIocj96UROcgomiGg==",
4296 + "version": "2.4.3",
4297 + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.3.tgz",
4298 + "integrity": "sha512-F4K7mF+ad++VlTrxMJVRnenKSJmO6fkQt2wpRDiKDesQMkfpniGWsqEi/JevxGBo2qEkwwjvTUAoiGJLNx++CA==",
4299 "dev": true,
4300 "dependencies": {
4301 "js-beautify": "^1.14.9",
@@ -4328,12 +4330,12 @@
4330 }
4331 },
4332 "node_modules/@vueuse/components": {
4331 - "version": "10.6.1",
4332 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.6.1.tgz",
4333 - "integrity": "sha512-Yx7h201xJG3V4+rY1wRAYy8EI9Q1r+gpwCJzgyZ0CWPyDWyZCxPXNjPhBJsXcSzJ1h1ph9tE5cVqEXHtEs6bjg==",
4333 + "version": "10.7.0",
4334 + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.0.tgz",
4335 + "integrity": "sha512-ycyF+fZtipP/8WVWZ5y6Cb9twJ0EeVHIqcqkCcTpmAJdheRjorT8v6cHk3h144HHTMgIfBWC6TaSukDG7QFmsw==",
4336 "dependencies": {
4335 - "@vueuse/core": "10.6.1",
4336 - "@vueuse/shared": "10.6.1",
4337 + "@vueuse/core": "10.7.0",
4338 + "@vueuse/shared": "10.7.0",
4339 "vue-demi": ">=0.14.6"
4340 }
4341 },
@@ -4363,13 +4365,13 @@
4365 }
4366 },
4367 "node_modules/@vueuse/core": {
4366 - "version": "10.6.1",
4367 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.6.1.tgz",
4368 - "integrity": "sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==",
4368 + "version": "10.7.0",
4369 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz",
4370 + "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==",
4371 "dependencies": {
4372 "@types/web-bluetooth": "^0.0.20",
4371 - "@vueuse/metadata": "10.6.1",
4372 - "@vueuse/shared": "10.6.1",
4373 + "@vueuse/metadata": "10.7.0",
4374 + "@vueuse/shared": "10.7.0",
4375 "vue-demi": ">=0.14.6"
4376 },
4377 "funding": {
@@ -4402,17 +4404,17 @@
4404 }
4405 },
4406 "node_modules/@vueuse/metadata": {
4405 - "version": "10.6.1",
4406 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.1.tgz",
4407 - "integrity": "sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw==",
4407 + "version": "10.7.0",
4408 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz",
4409 + "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==",
4410 "funding": {
4411 "url": "https://github.com/sponsors/antfu"
4412 }
4413 },
4414 "node_modules/@vueuse/shared": {
4413 - "version": "10.6.1",
4414 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.1.tgz",
4415 - "integrity": "sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==",
4415 + "version": "10.7.0",
4416 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz",
4417 + "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==",
4418 "dependencies": {
4419 "vue-demi": ">=0.14.6"
4420 },
@@ -4450,12 +4452,6 @@
4452 "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
4453 "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA=="
4454 },
4453 - "node_modules/abab": {
4454 - "version": "2.0.6",
4455 - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
4456 - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
4457 - "dev": true
4458 - },
4455 "node_modules/abbrev": {
4456 "version": "1.1.1",
4457 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -4497,9 +4493,9 @@
4493 }
4494 },
4495 "node_modules/acorn-walk": {
4500 - "version": "8.2.0",
4501 - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
4502 - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
4496 + "version": "8.3.1",
4497 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz",
4498 + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==",
4499 "dev": true,
4500 "engines": {
4501 "node": ">=0.4.0"
@@ -4623,9 +4619,9 @@
4619 }
4620 },
4621 "node_modules/apexcharts": {
4626 - "version": "3.44.0",
4627 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.0.tgz",
4628 - "integrity": "sha512-u7Xzrbcxc2yWznN78Jh5NMCYVAsWDfBjRl5ea++rVzFAqjU2hLz4RgKIFwYOBDRQtW1e/Qz8azJTqIJ1+Vu9Qg==",
4622 + "version": "3.44.2",
4623 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.2.tgz",
4624 + "integrity": "sha512-QWOFS/SC1TDsuI8VudVuIwLhs1qE6kwixRvmABMUgTVeVzizRWgQh8pdEIgwl+Zvr0TlM3vHPz6Dc5NP1hJ7BA==",
4625 "dependencies": {
4626 "@yr/monotone-cubic-spline": "^1.0.3",
4627 "svg.draggable.js": "^2.2.2",
@@ -5402,9 +5398,9 @@
5398 }
5399 },
5400 "node_modules/chart.js": {
5405 - "version": "4.4.0",
5406 - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.0.tgz",
5407 - "integrity": "sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==",
5401 + "version": "4.4.1",
5402 + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
5403 + "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
5404 "dependencies": {
5405 "@kurkle/color": "^0.3.0"
5406 },
@@ -5894,9 +5890,9 @@
5890 "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
5891 },
5892 "node_modules/cypress": {
5897 - "version": "13.5.1",
5898 - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.5.1.tgz",
5899 - "integrity": "sha512-yqLViT0D/lPI8Kkm7ciF/x/DCK/H/DnogdGyiTnQgX4OVR2aM30PtK+kvklTOD1u3TuItiD9wUQAF8EYWtyZug==",
5893 + "version": "13.6.1",
5894 + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.1.tgz",
5895 + "integrity": "sha512-k1Wl5PQcA/4UoTffYKKaxA0FJKwg8yenYNYRzLt11CUR0Kln+h7Udne6mdU1cUIdXBDTVZWtmiUjzqGs7/pEpw==",
5896 "dev": true,
5897 "hasInstallScript": true,
5898 "dependencies": {
@@ -6108,17 +6104,16 @@
6104 }
6105 },
6106 "node_modules/data-urls": {
6111 - "version": "4.0.0",
6112 - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
6113 - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
6107 + "version": "5.0.0",
6108 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
6109 + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
6110 "dev": true,
6111 "dependencies": {
6116 - "abab": "^2.0.6",
6117 - "whatwg-mimetype": "^3.0.0",
6118 - "whatwg-url": "^12.0.0"
6112 + "whatwg-mimetype": "^4.0.0",
6113 + "whatwg-url": "^14.0.0"
6114 },
6115 "engines": {
6121 - "node": ">=14"
6116 + "node": ">=18"
6117 }
6118 },
6119 "node_modules/date-fns": {
@@ -6587,18 +6582,6 @@
6582 }
6583 ]
6584 },
6590 - "node_modules/domexception": {
6591 - "version": "4.0.0",
6592 - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
6593 - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
6594 - "dev": true,
6595 - "dependencies": {
6596 - "webidl-conversions": "^7.0.0"
6597 - },
6598 - "engines": {
6599 - "node": ">=12"
6600 - }
6601 - },
6585 "node_modules/domhandler": {
6586 "version": "5.0.3",
6587 "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
@@ -7001,15 +6984,15 @@
6984 }
6985 },
6986 "node_modules/eslint": {
7004 - "version": "8.54.0",
7005 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz",
7006 - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==",
6987 + "version": "8.55.0",
6988 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
6989 + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
6990 "dev": true,
6991 "dependencies": {
6992 "@eslint-community/eslint-utils": "^4.2.0",
6993 "@eslint-community/regexpp": "^4.6.1",
7011 - "@eslint/eslintrc": "^2.1.3",
7012 - "@eslint/js": "8.54.0",
6994 + "@eslint/eslintrc": "^2.1.4",
6995 + "@eslint/js": "8.55.0",
6996 "@humanwhocodes/config-array": "^0.11.13",
6997 "@humanwhocodes/module-importer": "^1.0.1",
6998 "@nodelib/fs.walk": "^1.2.8",
@@ -7136,9 +7119,9 @@
7119 }
7120 },
7121 "node_modules/eslint-plugin-vue": {
7139 - "version": "9.18.1",
7140 - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz",
7141 - "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==",
7122 + "version": "9.19.2",
7123 + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
7124 + "integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
7125 "dev": true,
7126 "dependencies": {
7127 "@eslint-community/eslint-utils": "^4.4.0",
@@ -7777,9 +7760,9 @@
7760 "dev": true
7761 },
7762 "node_modules/fs-extra": {
7780 - "version": "11.1.1",
7781 - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
7782 - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
7763 + "version": "11.2.0",
7764 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
7765 + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
7766 "dev": true,
7767 "dependencies": {
7768 "graceful-fs": "^4.2.0",
@@ -8262,15 +8245,15 @@
8245 "dev": true
8246 },
8247 "node_modules/html-encoding-sniffer": {
8265 - "version": "3.0.0",
8266 - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
8267 - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
8248 + "version": "4.0.0",
8249 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
8250 + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
8251 "dev": true,
8252 "dependencies": {
8270 - "whatwg-encoding": "^2.0.0"
8253 + "whatwg-encoding": "^3.1.1"
8254 },
8255 "engines": {
8273 - "node": ">=12"
8256 + "node": ">=18"
8257 }
8258 },
8259 "node_modules/html-tags": {
@@ -9062,9 +9045,9 @@
9045 }
9046 },
9047 "node_modules/jose": {
9065 - "version": "5.1.1",
9066 - "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.1.tgz",
9067 - "integrity": "sha512-bfB+lNxowY49LfrBO0ITUn93JbUhxUN8I11K6oI5hJu/G6PO6fEUddVLjqdD0cQ9SXIHWXuWh7eJYwZF7Z0N/g==",
9048 + "version": "5.1.3",
9049 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.3.tgz",
9050 + "integrity": "sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw==",
9051 "funding": {
9052 "url": "https://github.com/sponsors/panva"
9053 }
@@ -9114,40 +9097,38 @@
9097 "dev": true
9098 },
9099 "node_modules/jsdom": {
9117 - "version": "22.1.0",
9118 - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz",
9119 - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==",
9100 + "version": "23.0.1",
9101 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.1.tgz",
9102 + "integrity": "sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==",
9103 "dev": true,
9104 "dependencies": {
9122 - "abab": "^2.0.6",
9105 "cssstyle": "^3.0.0",
9124 - "data-urls": "^4.0.0",
9106 + "data-urls": "^5.0.0",
9107 "decimal.js": "^10.4.3",
9126 - "domexception": "^4.0.0",
9108 "form-data": "^4.0.0",
9128 - "html-encoding-sniffer": "^3.0.0",
9129 - "http-proxy-agent": "^5.0.0",
9130 - "https-proxy-agent": "^5.0.1",
9109 + "html-encoding-sniffer": "^4.0.0",
9110 + "http-proxy-agent": "^7.0.0",
9111 + "https-proxy-agent": "^7.0.2",
9112 "is-potential-custom-element-name": "^1.0.1",
9132 - "nwsapi": "^2.2.4",
9113 + "nwsapi": "^2.2.7",
9114 "parse5": "^7.1.2",
9115 "rrweb-cssom": "^0.6.0",
9116 "saxes": "^6.0.0",
9117 "symbol-tree": "^3.2.4",
9137 - "tough-cookie": "^4.1.2",
9138 - "w3c-xmlserializer": "^4.0.0",
9118 + "tough-cookie": "^4.1.3",
9119 + "w3c-xmlserializer": "^5.0.0",
9120 "webidl-conversions": "^7.0.0",
9140 - "whatwg-encoding": "^2.0.0",
9141 - "whatwg-mimetype": "^3.0.0",
9142 - "whatwg-url": "^12.0.1",
9143 - "ws": "^8.13.0",
9144 - "xml-name-validator": "^4.0.0"
9121 + "whatwg-encoding": "^3.1.1",
9122 + "whatwg-mimetype": "^4.0.0",
9123 + "whatwg-url": "^14.0.0",
9124 + "ws": "^8.14.2",
9125 + "xml-name-validator": "^5.0.0"
9126 },
9127 "engines": {
9147 - "node": ">=16"
9128 + "node": ">=18"
9129 },
9130 "peerDependencies": {
9150 - "canvas": "^2.5.0"
9131 + "canvas": "^2.11.2"
9132 },
9133 "peerDependenciesMeta": {
9134 "canvas": {
@@ -9155,6 +9136,18 @@
9136 }
9137 }
9138 },
9139 + "node_modules/jsdom/node_modules/agent-base": {
9140 + "version": "7.1.0",
9141 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
9142 + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
9143 + "dev": true,
9144 + "dependencies": {
9145 + "debug": "^4.3.4"
9146 + },
9147 + "engines": {
9148 + "node": ">= 14"
9149 + }
9150 + },
9151 "node_modules/jsdom/node_modules/form-data": {
9152 "version": "4.0.0",
9153 "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -9169,6 +9162,41 @@
9162 "node": ">= 6"
9163 }
9164 },
9165 + "node_modules/jsdom/node_modules/http-proxy-agent": {
9166 + "version": "7.0.0",
9167 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
9168 + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
9169 + "dev": true,
9170 + "dependencies": {
9171 + "agent-base": "^7.1.0",
9172 + "debug": "^4.3.4"
9173 + },
9174 + "engines": {
9175 + "node": ">= 14"
9176 + }
9177 + },
9178 + "node_modules/jsdom/node_modules/https-proxy-agent": {
9179 + "version": "7.0.2",
9180 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
9181 + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
9182 + "dev": true,
9183 + "dependencies": {
9184 + "agent-base": "^7.0.2",
9185 + "debug": "4"
9186 + },
9187 + "engines": {
9188 + "node": ">= 14"
9189 + }
9190 + },
9191 + "node_modules/jsdom/node_modules/xml-name-validator": {
9192 + "version": "5.0.0",
9193 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
9194 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
9195 + "dev": true,
9196 + "engines": {
9197 + "node": ">=18"
9198 + }
9199 + },
9200 "node_modules/jsesc": {
9201 "version": "2.5.2",
9202 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -9766,12 +9794,12 @@
9794 }
9795 },
9796 "node_modules/loupe": {
9769 - "version": "2.3.6",
9770 - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
9771 - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
9797 + "version": "2.3.7",
9798 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
9799 + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
9800 "dev": true,
9801 "dependencies": {
9774 - "get-func-name": "^2.0.0"
9802 + "get-func-name": "^2.0.1"
9803 }
9804 },
9805 "node_modules/lru-cache": {
@@ -9936,9 +9964,9 @@
9964 "dev": true
9965 },
9966 "node_modules/maplibre-gl": {
9939 - "version": "3.6.1",
9940 - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.6.1.tgz",
9941 - "integrity": "sha512-XQpLkNTD6WYJXqF7vTxgHbAyShoZMm5o8fohXCn9PC/S/g3zBk92m7GUsN6KfuECh2rO01uiYbSNCSURkOODyQ==",
9967 + "version": "3.6.2",
9968 + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.6.2.tgz",
9969 + "integrity": "sha512-krg2KFIdOpLPngONDhP6ixCoWl5kbdMINP0moMSJFVX7wX1Clm2M9hlNKXS8vBGlVWwR5R3ZfI6IPrYz7c+aCQ==",
9970 "dependencies": {
9971 "@mapbox/geojson-rewind": "^0.5.2",
9972 "@mapbox/jsonlint-lines-primitives": "^2.0.2",
@@ -9950,8 +9978,8 @@
9978 "@maplibre/maplibre-gl-style-spec": "^19.3.3",
9979 "@types/geojson": "^7946.0.13",
9980 "@types/mapbox__point-geometry": "^0.1.4",
9953 - "@types/mapbox__vector-tile": "^1.3.3",
9954 - "@types/pbf": "^3.0.4",
9981 + "@types/mapbox__vector-tile": "^1.3.4",
9982 + "@types/pbf": "^3.0.5",
9983 "@types/supercluster": "^7.1.3",
9984 "earcut": "^2.2.4",
9985 "geojson-vt": "^3.2.1",
@@ -10908,9 +10936,9 @@
10936 }
10937 },
10938 "node_modules/nanoid": {
10911 - "version": "5.0.2",
10912 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.2.tgz",
10913 - "integrity": "sha512-2ustYUX1R2rL/Br5B/FMhi8d5/QzvkJ912rBYxskcpu0myTHzSZfTr1LAS2Sm7jxRUObRrSBFoyzwAhL49aVSg==",
10939 + "version": "5.0.4",
10940 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.4.tgz",
10941 + "integrity": "sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==",
10942 "funding": [
10943 {
10944 "type": "github",
@@ -11777,6 +11805,12 @@
11805 "node": ">=8.10.0"
11806 }
11807 },
11808 + "node_modules/path-browserify": {
11809 + "version": "1.0.1",
11810 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
11811 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
11812 + "dev": true
11813 + },
11814 "node_modules/path-exists": {
11815 "version": "4.0.0",
11816 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -12047,9 +12081,9 @@
12081 }
12082 },
12083 "node_modules/postcss": {
12050 - "version": "8.4.31",
12051 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
12052 - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
12084 + "version": "8.4.32",
12085 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
12086 + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
12087 "funding": [
12088 {
12089 "type": "opencollective",
@@ -12065,7 +12099,7 @@
12099 }
12100 ],
12101 "dependencies": {
12068 - "nanoid": "^3.3.6",
12102 + "nanoid": "^3.3.7",
12103 "picocolors": "^1.0.0",
12104 "source-map-js": "^1.0.2"
12105 },
@@ -12177,9 +12211,9 @@
12211 "dev": true
12212 },
12213 "node_modules/postcss/node_modules/nanoid": {
12180 - "version": "3.3.6",
12181 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
12182 - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
12214 + "version": "3.3.7",
12215 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
12216 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
12217 "funding": [
12218 {
12219 "type": "github",
@@ -12577,9 +12611,9 @@
12611 }
12612 },
12613 "node_modules/punycode": {
12580 - "version": "2.3.0",
12581 - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
12582 - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
12614 + "version": "2.3.1",
12615 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
12616 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
12617 "dev": true,
12618 "engines": {
12619 "node": ">=6"
@@ -13963,9 +13997,9 @@
13997 }
13998 },
13999 "node_modules/std-env": {
13966 - "version": "3.4.3",
13967 - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz",
13968 - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==",
14000 + "version": "3.6.0",
14001 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz",
14002 + "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==",
14003 "dev": true
14004 },
14005 "node_modules/stream-combiner": {
@@ -14444,9 +14478,9 @@
14478 }
14479 },
14480 "node_modules/tailwindcss": {
14447 - "version": "3.3.5",
14448 - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz",
14449 - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==",
14481 + "version": "3.3.6",
14482 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz",
14483 + "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==",
14484 "dev": true,
14485 "dependencies": {
14486 "@alloc/quick-lru": "^5.2.0",
@@ -14549,13 +14583,13 @@
14583 "dev": true
14584 },
14585 "node_modules/taze": {
14552 - "version": "0.12.0",
14553 - "resolved": "https://registry.npmjs.org/taze/-/taze-0.12.0.tgz",
14554 - "integrity": "sha512-ftDYS/dNF0EkiEpZZweJxJKQRVFPBFFDz3OPezFloVtOHoMmVwLiMxLM9KYLnA+30D8IFdnGgS15WiIaz2bOfA==",
14586 + "version": "0.13.0",
14587 + "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.0.tgz",
14588 + "integrity": "sha512-o17Y6miF+44sDJ7haRHTqZefTlGOaBSdDHRwRcrt+s3WeGSPBUtPSG18XNwToIXN//eh58hyYnyDwTnpYLp4sg==",
14589 "dev": true,
14590 "dependencies": {
14557 - "@antfu/ni": "^0.21.8",
14558 - "@npmcli/config": "^8.0.1",
14591 + "@antfu/ni": "^0.21.12",
14592 + "@npmcli/config": "^8.0.2",
14593 "cli-progress": "^3.12.0",
14594 "deepmerge": "^4.3.1",
14595 "detect-indent": "^7.0.1",
@@ -14795,9 +14829,9 @@
14829 "dev": true
14830 },
14831 "node_modules/tinypool": {
14798 - "version": "0.7.0",
14799 - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz",
14800 - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==",
14832 + "version": "0.8.1",
14833 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz",
14834 + "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==",
14835 "dev": true,
14836 "engines": {
14837 "node": ">=14.0.0"
@@ -14904,15 +14938,15 @@
14938 }
14939 },
14940 "node_modules/tr46": {
14907 - "version": "4.1.1",
14908 - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
14909 - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
14941 + "version": "5.0.0",
14942 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
14943 + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
14944 "dev": true,
14945 "dependencies": {
14912 - "punycode": "^2.3.0"
14946 + "punycode": "^2.3.1"
14947 },
14948 "engines": {
14915 - "node": ">=14"
14949 + "node": ">=18"
14950 }
14951 },
14952 "node_modules/treemate": {
@@ -15385,20 +15419,20 @@
15419 }
15420 },
15421 "node_modules/unplugin-vue-components": {
15388 - "version": "0.25.2",
15389 - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz",
15390 - "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==",
15422 + "version": "0.26.0",
15423 + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz",
15424 + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==",
15425 "dev": true,
15426 "dependencies": {
15393 - "@antfu/utils": "^0.7.5",
15394 - "@rollup/pluginutils": "^5.0.2",
15427 + "@antfu/utils": "^0.7.6",
15428 + "@rollup/pluginutils": "^5.0.4",
15429 "chokidar": "^3.5.3",
15430 "debug": "^4.3.4",
15397 - "fast-glob": "^3.3.0",
15431 + "fast-glob": "^3.3.1",
15432 "local-pkg": "^0.4.3",
15399 - "magic-string": "^0.30.1",
15433 + "magic-string": "^0.30.3",
15434 "minimatch": "^9.0.3",
15401 - "resolve": "^1.22.2",
15435 + "resolve": "^1.22.4",
15436 "unplugin": "^1.4.0"
15437 },
15438 "engines": {
@@ -15633,13 +15667,13 @@
15667 }
15668 },
15669 "node_modules/vite": {
15636 - "version": "5.0.0",
15637 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.0.tgz",
15638 - "integrity": "sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==",
15670 + "version": "5.0.6",
15671 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.6.tgz",
15672 + "integrity": "sha512-MD3joyAEBtV7QZPl2JVVUai6zHms3YOmLR+BpMzLlX2Yzjfcc4gTgNi09d/Rua3F4EtC8zdwPU8eQYyib4vVMQ==",
15673 "dev": true,
15674 "dependencies": {
15675 "esbuild": "^0.19.3",
15642 - "postcss": "^8.4.31",
15676 + "postcss": "^8.4.32",
15677 "rollup": "^4.2.0"
15678 },
15679 "bin": {
@@ -15688,23 +15722,22 @@
15722 }
15723 },
15724 "node_modules/vite-node": {
15691 - "version": "0.34.6",
15692 - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz",
15693 - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==",
15725 + "version": "1.0.1",
15726 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.1.tgz",
15727 + "integrity": "sha512-Y2Jnz4cr2azsOMMYuVPrQkp3KMnS/0WV8ezZjCy4hU7O5mUHCAVOnFmoEvs1nvix/4mYm74Len8bYRWZJMNP6g==",
15728 "dev": true,
15729 "dependencies": {
15730 "cac": "^6.7.14",
15731 "debug": "^4.3.4",
15698 - "mlly": "^1.4.0",
15732 "pathe": "^1.1.1",
15733 "picocolors": "^1.0.0",
15701 - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0"
15734 + "vite": "^5.0.0-beta.15 || ^5.0.0"
15735 },
15736 "bin": {
15737 "vite-node": "vite-node.mjs"
15738 },
15739 "engines": {
15707 - "node": ">=v14.18.0"
15740 + "node": "^18.0.0 || >=20.0.0"
15741 },
15742 "funding": {
15743 "url": "https://opencollective.com/vitest"
@@ -15751,59 +15784,57 @@
15784 }
15785 },
15786 "node_modules/vitest": {
15754 - "version": "0.34.6",
15755 - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz",
15756 - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==",
15787 + "version": "1.0.1",
15788 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.1.tgz",
15789 + "integrity": "sha512-MHsOj079S28hDsvdDvyD1pRj4dcS51EC5Vbe0xvOYX+WryP8soiK2dm8oULi+oA/8Xa/h6GoJEMTmcmBy5YM+Q==",
15790 "dev": true,
15791 "dependencies": {
15759 - "@types/chai": "^4.3.5",
15760 - "@types/chai-subset": "^1.3.3",
15761 - "@types/node": "*",
15762 - "@vitest/expect": "0.34.6",
15763 - "@vitest/runner": "0.34.6",
15764 - "@vitest/snapshot": "0.34.6",
15765 - "@vitest/spy": "0.34.6",
15766 - "@vitest/utils": "0.34.6",
15767 - "acorn": "^8.9.0",
15768 - "acorn-walk": "^8.2.0",
15792 + "@vitest/expect": "1.0.1",
15793 + "@vitest/runner": "1.0.1",
15794 + "@vitest/snapshot": "1.0.1",
15795 + "@vitest/spy": "1.0.1",
15796 + "@vitest/utils": "1.0.1",
15797 + "acorn-walk": "^8.3.0",
15798 "cac": "^6.7.14",
15799 "chai": "^4.3.10",
15800 "debug": "^4.3.4",
15772 - "local-pkg": "^0.4.3",
15773 - "magic-string": "^0.30.1",
15801 + "execa": "^8.0.1",
15802 + "local-pkg": "^0.5.0",
15803 + "magic-string": "^0.30.5",
15804 "pathe": "^1.1.1",
15805 "picocolors": "^1.0.0",
15776 - "std-env": "^3.3.3",
15777 - "strip-literal": "^1.0.1",
15778 - "tinybench": "^2.5.0",
15779 - "tinypool": "^0.7.0",
15780 - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0",
15781 - "vite-node": "0.34.6",
15806 + "std-env": "^3.5.0",
15807 + "strip-literal": "^1.3.0",
15808 + "tinybench": "^2.5.1",
15809 + "tinypool": "^0.8.1",
15810 + "vite": "^5.0.0-beta.19 || ^5.0.0",
15811 + "vite-node": "1.0.1",
15812 "why-is-node-running": "^2.2.2"
15813 },
15814 "bin": {
15815 "vitest": "vitest.mjs"
15816 },
15817 "engines": {
15788 - "node": ">=v14.18.0"
15818 + "node": "^18.0.0 || >=20.0.0"
15819 },
15820 "funding": {
15821 "url": "https://opencollective.com/vitest"
15822 },
15823 "peerDependencies": {
15824 "@edge-runtime/vm": "*",
15795 - "@vitest/browser": "*",
15796 - "@vitest/ui": "*",
15825 + "@types/node": "^18.0.0 || >=20.0.0",
15826 + "@vitest/browser": "^1.0.0",
15827 + "@vitest/ui": "^1.0.0",
15828 "happy-dom": "*",
15798 - "jsdom": "*",
15799 - "playwright": "*",
15800 - "safaridriver": "*",
15801 - "webdriverio": "*"
15829 + "jsdom": "*"
15830 },
15831 "peerDependenciesMeta": {
15832 "@edge-runtime/vm": {
15833 "optional": true
15834 },
15835 + "@types/node": {
15836 + "optional": true
15837 + },
15838 "@vitest/browser": {
15839 "optional": true
15840 },
@@ -15815,78 +15846,219 @@
15846 },
15847 "jsdom": {
15848 "optional": true
15818 - },
15819 - "playwright": {
15820 - "optional": true
15821 - },
15822 - "safaridriver": {
15823 - "optional": true
15824 - },
15825 - "webdriverio": {
15826 - "optional": true
15849 }
15850 }
15851 },
15830 - "node_modules/vooks": {
15831 - "version": "0.2.12",
15832 - "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz",
15833 - "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==",
15852 + "node_modules/vitest/node_modules/execa": {
15853 + "version": "8.0.1",
15854 + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
15855 + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
15856 + "dev": true,
15857 "dependencies": {
15835 - "evtd": "^0.2.2"
15858 + "cross-spawn": "^7.0.3",
15859 + "get-stream": "^8.0.1",
15860 + "human-signals": "^5.0.0",
15861 + "is-stream": "^3.0.0",
15862 + "merge-stream": "^2.0.0",
15863 + "npm-run-path": "^5.1.0",
15864 + "onetime": "^6.0.0",
15865 + "signal-exit": "^4.1.0",
15866 + "strip-final-newline": "^3.0.0"
15867 },
15837 - "peerDependencies": {
15838 - "vue": "^3.0.0"
15839 - }
15840 - },
15841 - "node_modules/vt-pbf": {
15842 - "version": "3.1.3",
15843 - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
15844 - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
15845 - "dependencies": {
15846 - "@mapbox/point-geometry": "0.1.0",
15847 - "@mapbox/vector-tile": "^1.3.1",
15848 - "pbf": "^3.2.1"
15868 + "engines": {
15869 + "node": ">=16.17"
15870 + },
15871 + "funding": {
15872 + "url": "https://github.com/sindresorhus/execa?sponsor=1"
15873 }
15874 },
15851 - "node_modules/vue": {
15852 - "version": "3.3.8",
15853 - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz",
15854 - "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==",
15855 - "dependencies": {
15856 - "@vue/compiler-dom": "3.3.8",
15857 - "@vue/compiler-sfc": "3.3.8",
15858 - "@vue/runtime-dom": "3.3.8",
15859 - "@vue/server-renderer": "3.3.8",
15860 - "@vue/shared": "3.3.8"
15861 - },
15862 - "peerDependencies": {
15863 - "typescript": "*"
15875 + "node_modules/vitest/node_modules/get-stream": {
15876 + "version": "8.0.1",
15877 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
15878 + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
15879 + "dev": true,
15880 + "engines": {
15881 + "node": ">=16"
15882 },
15865 - "peerDependenciesMeta": {
15866 - "typescript": {
15867 - "optional": true
15868 - }
15883 + "funding": {
15884 + "url": "https://github.com/sponsors/sindresorhus"
15885 }
15886 },
15871 - "node_modules/vue-advanced-cropper": {
15872 - "version": "2.8.8",
15873 - "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-2.8.8.tgz",
15874 - "integrity": "sha512-yDM7Jb/gnxcs//JdbOogBUoHr1bhCQSto7/ohgETKAe4wvRpmqIkKSppMm1huVQr+GP1YoVlX/fkjKxvYzwwDQ==",
15875 - "dependencies": {
15876 - "classnames": "^2.2.6",
15877 - "debounce": "^1.2.0",
15878 - "easy-bem": "^1.0.2"
15879 - },
15887 + "node_modules/vitest/node_modules/human-signals": {
15888 + "version": "5.0.0",
15889 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
15890 + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
15891 + "dev": true,
15892 "engines": {
15881 - "node": ">=8",
15882 - "npm": ">=5"
15883 - },
15884 - "peerDependencies": {
15885 - "vue": "^3.0.0"
15893 + "node": ">=16.17.0"
15894 }
15895 },
15888 - "node_modules/vue-cal": {
15889 - "version": "4.8.1",
15896 + "node_modules/vitest/node_modules/is-stream": {
15897 + "version": "3.0.0",
15898 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
15899 + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
15900 + "dev": true,
15901 + "engines": {
15902 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
15903 + },
15904 + "funding": {
15905 + "url": "https://github.com/sponsors/sindresorhus"
15906 + }
15907 + },
15908 + "node_modules/vitest/node_modules/local-pkg": {
15909 + "version": "0.5.0",
15910 + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
15911 + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
15912 + "dev": true,
15913 + "dependencies": {
15914 + "mlly": "^1.4.2",
15915 + "pkg-types": "^1.0.3"
15916 + },
15917 + "engines": {
15918 + "node": ">=14"
15919 + },
15920 + "funding": {
15921 + "url": "https://github.com/sponsors/antfu"
15922 + }
15923 + },
15924 + "node_modules/vitest/node_modules/mimic-fn": {
15925 + "version": "4.0.0",
15926 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
15927 + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
15928 + "dev": true,
15929 + "engines": {
15930 + "node": ">=12"
15931 + },
15932 + "funding": {
15933 + "url": "https://github.com/sponsors/sindresorhus"
15934 + }
15935 + },
15936 + "node_modules/vitest/node_modules/npm-run-path": {
15937 + "version": "5.1.0",
15938 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
15939 + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
15940 + "dev": true,
15941 + "dependencies": {
15942 + "path-key": "^4.0.0"
15943 + },
15944 + "engines": {
15945 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
15946 + },
15947 + "funding": {
15948 + "url": "https://github.com/sponsors/sindresorhus"
15949 + }
15950 + },
15951 + "node_modules/vitest/node_modules/onetime": {
15952 + "version": "6.0.0",
15953 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
15954 + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
15955 + "dev": true,
15956 + "dependencies": {
15957 + "mimic-fn": "^4.0.0"
15958 + },
15959 + "engines": {
15960 + "node": ">=12"
15961 + },
15962 + "funding": {
15963 + "url": "https://github.com/sponsors/sindresorhus"
15964 + }
15965 + },
15966 + "node_modules/vitest/node_modules/path-key": {
15967 + "version": "4.0.0",
15968 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
15969 + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
15970 + "dev": true,
15971 + "engines": {
15972 + "node": ">=12"
15973 + },
15974 + "funding": {
15975 + "url": "https://github.com/sponsors/sindresorhus"
15976 + }
15977 + },
15978 + "node_modules/vitest/node_modules/signal-exit": {
15979 + "version": "4.1.0",
15980 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
15981 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
15982 + "dev": true,
15983 + "engines": {
15984 + "node": ">=14"
15985 + },
15986 + "funding": {
15987 + "url": "https://github.com/sponsors/isaacs"
15988 + }
15989 + },
15990 + "node_modules/vitest/node_modules/strip-final-newline": {
15991 + "version": "3.0.0",
15992 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
15993 + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
15994 + "dev": true,
15995 + "engines": {
15996 + "node": ">=12"
15997 + },
15998 + "funding": {
15999 + "url": "https://github.com/sponsors/sindresorhus"
16000 + }
16001 + },
16002 + "node_modules/vooks": {
16003 + "version": "0.2.12",
16004 + "resolved": "https://registry.npmjs.org/vooks/-/vooks-0.2.12.tgz",
16005 + "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==",
16006 + "dependencies": {
16007 + "evtd": "^0.2.2"
16008 + },
16009 + "peerDependencies": {
16010 + "vue": "^3.0.0"
16011 + }
16012 + },
16013 + "node_modules/vt-pbf": {
16014 + "version": "3.1.3",
16015 + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
16016 + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
16017 + "dependencies": {
16018 + "@mapbox/point-geometry": "0.1.0",
16019 + "@mapbox/vector-tile": "^1.3.1",
16020 + "pbf": "^3.2.1"
16021 + }
16022 + },
16023 + "node_modules/vue": {
16024 + "version": "3.3.10",
16025 + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.10.tgz",
16026 + "integrity": "sha512-zg6SIXZdTBwiqCw/1p+m04VyHjLfwtjwz8N57sPaBhEex31ND0RYECVOC1YrRwMRmxFf5T1dabl6SGUbMKKuVw==",
16027 + "dependencies": {
16028 + "@vue/compiler-dom": "3.3.10",
16029 + "@vue/compiler-sfc": "3.3.10",
16030 + "@vue/runtime-dom": "3.3.10",
16031 + "@vue/server-renderer": "3.3.10",
16032 + "@vue/shared": "3.3.10"
16033 + },
16034 + "peerDependencies": {
16035 + "typescript": "*"
16036 + },
16037 + "peerDependenciesMeta": {
16038 + "typescript": {
16039 + "optional": true
16040 + }
16041 + }
16042 + },
16043 + "node_modules/vue-advanced-cropper": {
16044 + "version": "2.8.8",
16045 + "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-2.8.8.tgz",
16046 + "integrity": "sha512-yDM7Jb/gnxcs//JdbOogBUoHr1bhCQSto7/ohgETKAe4wvRpmqIkKSppMm1huVQr+GP1YoVlX/fkjKxvYzwwDQ==",
16047 + "dependencies": {
16048 + "classnames": "^2.2.6",
16049 + "debounce": "^1.2.0",
16050 + "easy-bem": "^1.0.2"
16051 + },
16052 + "engines": {
16053 + "node": ">=8",
16054 + "npm": ">=5"
16055 + },
16056 + "peerDependencies": {
16057 + "vue": "^3.0.0"
16058 + }
16059 + },
16060 + "node_modules/vue-cal": {
16061 + "version": "4.8.1",
16062 "resolved": "https://registry.npmjs.org/vue-cal/-/vue-cal-4.8.1.tgz",
16063 "integrity": "sha512-qe0jSDmbzdKF3/MSTPcHSJMOovav4MwmXtgs1n7jkI345zAtfErQVv4uFEVXg1rD62sBi1qWflYRUKy1mzQapg==",
16064 "funding": {
@@ -15980,12 +16152,12 @@
16152 }
16153 },
16154 "node_modules/vue-i18n": {
15983 - "version": "9.7.0",
15984 - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.7.0.tgz",
15985 - "integrity": "sha512-8Z8kSz9U2juzuAf+6mjW1HTd5pIlYuFJZkC+HvYOglFdpzwc2rTUGjxKwN8xGdtGur1MFnyJ44TSr+TksJtY8A==",
16155 + "version": "9.8.0",
16156 + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.8.0.tgz",
16157 + "integrity": "sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==",
16158 "dependencies": {
15987 - "@intlify/core-base": "9.7.0",
15988 - "@intlify/shared": "9.7.0",
16159 + "@intlify/core-base": "9.8.0",
16160 + "@intlify/shared": "9.8.0",
16161 "@vue/devtools-api": "^6.5.0"
16162 },
16163 "engines": {
@@ -16052,13 +16224,13 @@
16224 }
16225 },
16226 "node_modules/vue-tsc": {
16055 - "version": "1.8.22",
16056 - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.22.tgz",
16057 - "integrity": "sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==",
16227 + "version": "1.8.25",
16228 + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.25.tgz",
16229 + "integrity": "sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ==",
16230 "dev": true,
16231 "dependencies": {
16060 - "@volar/typescript": "~1.10.5",
16061 - "@vue/language-core": "1.8.22",
16232 + "@volar/typescript": "~1.11.1",
16233 + "@vue/language-core": "1.8.25",
16234 "semver": "^7.5.4"
16235 },
16236 "bin": {
@@ -16164,15 +16336,24 @@
16336 "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
16337 },
16338 "node_modules/w3c-xmlserializer": {
16167 - "version": "4.0.0",
16168 - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
16169 - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
16339 + "version": "5.0.0",
16340 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
16341 + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
16342 "dev": true,
16343 "dependencies": {
16172 - "xml-name-validator": "^4.0.0"
16344 + "xml-name-validator": "^5.0.0"
16345 },
16346 "engines": {
16175 - "node": ">=14"
16347 + "node": ">=18"
16348 + }
16349 + },
16350 + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": {
16351 + "version": "5.0.0",
16352 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
16353 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
16354 + "dev": true,
16355 + "engines": {
16356 + "node": ">=18"
16357 }
16358 },
16359 "node_modules/wait-on": {
@@ -16225,37 +16406,37 @@
16406 "dev": true
16407 },
16408 "node_modules/whatwg-encoding": {
16228 - "version": "2.0.0",
16229 - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
16230 - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
16409 + "version": "3.1.1",
16410 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
16411 + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
16412 "dev": true,
16413 "dependencies": {
16414 "iconv-lite": "0.6.3"
16415 },
16416 "engines": {
16236 - "node": ">=12"
16417 + "node": ">=18"
16418 }
16419 },
16420 "node_modules/whatwg-mimetype": {
16240 - "version": "3.0.0",
16241 - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
16242 - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
16421 + "version": "4.0.0",
16422 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
16423 + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
16424 "dev": true,
16425 "engines": {
16245 - "node": ">=12"
16426 + "node": ">=18"
16427 }
16428 },
16429 "node_modules/whatwg-url": {
16249 - "version": "12.0.1",
16250 - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
16251 - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
16430 + "version": "14.0.0",
16431 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
16432 + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
16433 "dev": true,
16434 "dependencies": {
16254 - "tr46": "^4.1.1",
16435 + "tr46": "^5.0.0",
16436 "webidl-conversions": "^7.0.0"
16437 },
16438 "engines": {
16258 - "node": ">=14"
16439 + "node": ">=18"
16440 }
16441 },
16442 "node_modules/which": {
@@ -16441,9 +16622,9 @@
16622 "dev": true
16623 },
16624 "node_modules/ws": {
16444 - "version": "8.14.1",
16445 - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz",
16446 - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==",
16625 + "version": "8.14.2",
16626 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
16627 + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
16628 "dev": true,
16629 "engines": {
16630 "node": ">=10.0.0"
@@ -16622,9 +16803,9 @@
16803 }
16804 },
16805 "@antfu/ni": {
16625 - "version": "0.21.8",
16626 - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.8.tgz",
16627 - "integrity": "sha512-90X8pU2szlvw0AJo9EZMbYc2eQKkmO7mAdC4tD4r5co2Mm56MT37MIG8EyB7p4WRheuzGxuLDxJ63mF6+Zajiw==",
16806 + "version": "0.21.12",
16807 + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.12.tgz",
16808 + "integrity": "sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==",
16809 "dev": true
16810 },
16811 "@antfu/utils": {
@@ -16873,9 +17054,9 @@
17054 }
17055 },
17056 "@babel/parser": {
16876 - "version": "7.23.4",
16877 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz",
16878 - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ=="
17057 + "version": "7.23.5",
17058 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
17059 + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ=="
17060 },
17061 "@babel/plugin-syntax-jsx": {
17062 "version": "7.22.5",
@@ -17245,9 +17426,9 @@
17426 "dev": true
17427 },
17428 "@eslint/eslintrc": {
17248 - "version": "2.1.3",
17249 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
17250 - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
17429 + "version": "2.1.4",
17430 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
17431 + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
17432 "dev": true,
17433 "requires": {
17434 "ajv": "^6.12.4",
@@ -17279,9 +17460,9 @@
17460 }
17461 },
17462 "@eslint/js": {
17282 - "version": "8.54.0",
17283 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz",
17284 - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==",
17463 + "version": "8.55.0",
17464 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
17465 + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
17466 "dev": true
17467 },
17468 "@faker-js/faker": {
@@ -17336,43 +17517,43 @@
17517 "integrity": "sha512-3UKtCVDbwt8FeurOHYBybDzYYJH0peyisGjsQe2aRFR4M693m0DdE3v4BZl+60OjvnXGWhO8O/rmET2kwPF6SQ=="
17518 },
17519 "@fullcalendar/core": {
17339 - "version": "6.1.9",
17340 - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.9.tgz",
17341 - "integrity": "sha512-eeG+z9BWerdsU9Ac6j16rpYpPnE0wxtnEHiHrh/u/ADbGTR3hCOjCD9PxQOfhOTHbWOVs7JQunGcksSPu5WZBQ==",
17520 + "version": "6.1.10",
17521 + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.10.tgz",
17522 + "integrity": "sha512-oTXGJSAGpCf1oY+CKp5qYjMHkJCPBkJ3SHitl63n8Q6xKeiwQ4EF6Au451euUovREwJpLmD1AyZrCnWmtB9AVg==",
17523 "requires": {
17524 "preact": "~10.12.1"
17525 }
17526 },
17527 "@fullcalendar/daygrid": {
17347 - "version": "6.1.9",
17348 - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.9.tgz",
17349 - "integrity": "sha512-o/6joH/7lmVHXAkbaa/tUbzWYnGp/LgfdiFyYPkqQbjKEeivNZWF1WhHqFbhx0zbFONSHtrvkjY2bjr+Ef2quQ==",
17528 + "version": "6.1.10",
17529 + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.10.tgz",
17530 + "integrity": "sha512-Z4GRm1IyHKgxXFTWGcEI0nTsvYOIkpE0aMt3/o3ER2SZkF+hfwcDFhtj0c9+WhMjXFIWYeoTnA9rUOY7Zl/nxA==",
17531 "requires": {}
17532 },
17533 "@fullcalendar/interaction": {
17353 - "version": "6.1.9",
17354 - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.9.tgz",
17355 - "integrity": "sha512-I3FGnv0kKZpIwujg3HllbKrciNjTqeTYy3oJG226oAn7lV6wnrrDYMmuGmA0jPJAGN46HKrQqKN7ItxQRDec4Q==",
17534 + "version": "6.1.10",
17535 + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.10.tgz",
17536 + "integrity": "sha512-aZRlwCpmDasq2RNeWV0ub20Uevare9Cb6iMlxCacx0fhOC14H28G9d1FsduJIecInL84SPGwt5ItqAYMsWv7zw==",
17537 "requires": {}
17538 },
17539 "@fullcalendar/list": {
17359 - "version": "6.1.9",
17360 - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.9.tgz",
17361 - "integrity": "sha512-OCKdC1Gz26cJ5QsXdQyXVyzVu23ypT2xzyAR+Wc8jEytcJLWXw2a914m/MVax8n8EHuaIYY2exhsy/eaSU0XNA==",
17540 + "version": "6.1.10",
17541 + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.10.tgz",
17542 + "integrity": "sha512-WE4vuSUCzol4tJd0ZP0cNxeyRPaZcsVVYs2I3qdf3OZQkXwDCdSyWEz0Hluf+XZWcZXt21aEYKlxRjwUpQcf4Q==",
17543 "requires": {}
17544 },
17545 "@fullcalendar/timegrid": {
17365 - "version": "6.1.9",
17366 - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.9.tgz",
17367 - "integrity": "sha512-le7UV05wVE1Trdr054kgJXTwa+A1pEI8nlCBnPWdcyrL+dTLoPvQ4AWEVCnV7So+4zRYaCqnqGXfCJsj0RQa0g==",
17546 + "version": "6.1.10",
17547 + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.10.tgz",
17548 + "integrity": "sha512-hFKyQXJaPbNyq1reZmvkCmM64O99krHoIcJAbDS+dntCm3FzZUcDtAcRKIbMiantHrezCG/1MEYk3m9e3aKvIQ==",
17549 "requires": {
17369 - "@fullcalendar/daygrid": "~6.1.9"
17550 + "@fullcalendar/daygrid": "~6.1.10"
17551 }
17552 },
17553 "@fullcalendar/vue3": {
17373 - "version": "6.1.9",
17374 - "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.9.tgz",
17375 - "integrity": "sha512-nuEEb/6uRhD0AH3PzU4Mtod3dD7S729nA1oYorMdCYMgUvXoHJlz2wOKK8w4LGZIn6K2R8Yzo8ol33ElBjHo3A==",
17554 + "version": "6.1.10",
17555 + "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-6.1.10.tgz",
17556 + "integrity": "sha512-YMYBQx0TlWNuN4G6ra2dkf5cCF5aVi/2zDLGLvLqe2Nk2o7uNbTkrCSG40061OepWQlJv+hYqm1JukLRmyqi4Q==",
17557 "requires": {}
17558 },
17559 "@googlemaps/markerclusterer": {
@@ -17438,27 +17619,27 @@
17619 }
17620 },
17621 "@intlify/core-base": {
17441 - "version": "9.7.0",
17442 - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.7.0.tgz",
17443 - "integrity": "sha512-1tBnfnCI23jXqGW15cagCjn2GgD487VST1dMG8P5LRzrSfx+kUzqFyTrjMNIwgq1tVaF4HnDpFMUuyrzTLKphw==",
17622 + "version": "9.8.0",
17623 + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.8.0.tgz",
17624 + "integrity": "sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==",
17625 "requires": {
17445 - "@intlify/message-compiler": "9.7.0",
17446 - "@intlify/shared": "9.7.0"
17626 + "@intlify/message-compiler": "9.8.0",
17627 + "@intlify/shared": "9.8.0"
17628 }
17629 },
17630 "@intlify/message-compiler": {
17450 - "version": "9.7.0",
17451 - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.7.0.tgz",
17452 - "integrity": "sha512-/YdZCio2L2tCM5bZ2eMHbSEIQNPh1QqvZIOLI/yCVKXLscis7O0SsR2nmuU/DfCJ3iSeI8juw82C2wLvfsAeww==",
17631 + "version": "9.8.0",
17632 + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.8.0.tgz",
17633 + "integrity": "sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==",
17634 "requires": {
17454 - "@intlify/shared": "9.7.0",
17635 + "@intlify/shared": "9.8.0",
17636 "source-map-js": "^1.0.2"
17637 }
17638 },
17639 "@intlify/shared": {
17459 - "version": "9.7.0",
17460 - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.7.0.tgz",
17461 - "integrity": "sha512-PUkEuk//YKu4CHS5ah3mNa3XL/+TZj6rAY/6yYN+GCNFd2u+uWUkeuwE4Q6t8dydRWlErOePHHS0KyNoof/oBw=="
17640 + "version": "9.8.0",
17641 + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.8.0.tgz",
17642 + "integrity": "sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ=="
17643 },
17644 "@isaacs/cliui": {
17645 "version": "8.0.2",
@@ -17685,11 +17866,11 @@
17866 }
17867 },
17868 "@milkdown/core": {
17688 - "version": "7.3.1",
17689 - "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.1.tgz",
17690 - "integrity": "sha512-W4wxS87YkXbRMTs9DEWNQWQfbDpfDvJ6EJJA5t/4eMXYymVHEr9h2QsHI23Tiznthgro1X0+kW3nxtfWWHw2xA==",
17869 + "version": "7.3.2",
17870 + "resolved": "https://registry.npmjs.org/@milkdown/core/-/core-7.3.2.tgz",
17871 + "integrity": "sha512-FbfFx5GpX7cxbZAyT03Pgnx9tLMrFJJK/RIyShgk5xyVtZGxEwQZ4tTqL280dNmjv5iXCAYz2nG5+8kIKJh4EQ==",
17872 "requires": {
17692 - "@milkdown/exception": "7.3.1",
17873 + "@milkdown/exception": "7.3.2",
17874 "remark-parse": "^11.0.0",
17875 "remark-stringify": "^11.0.0",
17876 "tslib": "^2.5.0",
@@ -17697,29 +17878,29 @@
17878 }
17879 },
17880 "@milkdown/ctx": {
17700 - "version": "7.3.1",
17701 - "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.1.tgz",
17702 - "integrity": "sha512-Wmf7Bhz8AH2bz4sz38a4DY3jFsDlHaaQ4ZGFi9JzSr1NjFB+2dvc19RYyncF/P14qTwdJc9htzP/HD4mUKlSww==",
17881 + "version": "7.3.2",
17882 + "resolved": "https://registry.npmjs.org/@milkdown/ctx/-/ctx-7.3.2.tgz",
17883 + "integrity": "sha512-D5bxCWlubfpSlGru58gQd6jBd6a+Gh8vYnWnuozS5NRj9bC2JeBmw92LR52Kxoh7OegiWyKPcXQKEdwU6EKTkg==",
17884 "requires": {
17704 - "@milkdown/exception": "7.3.1",
17885 + "@milkdown/exception": "7.3.2",
17886 "tslib": "^2.5.0"
17887 }
17888 },
17889 "@milkdown/exception": {
17709 - "version": "7.3.1",
17710 - "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.1.tgz",
17711 - "integrity": "sha512-e2x1h/zE8paoF9ygEbUVZZTNpp1acw6azqExSvL+3myoMgwTsmE/G6oK9YpajY1BfSsLM2J3ii9ByIcsRM6+9w==",
17890 + "version": "7.3.2",
17891 + "resolved": "https://registry.npmjs.org/@milkdown/exception/-/exception-7.3.2.tgz",
17892 + "integrity": "sha512-y46GujvdvlSjeq455VLtVFr3EvRIkseOmQ1cKWMs04HZ06/r/auY2yu/+3ORJ2qQEG1bXoeuTLe4Sq/PgqXSPw==",
17893 "requires": {
17894 "tslib": "^2.5.0"
17895 }
17896 },
17897 "@milkdown/preset-commonmark": {
17717 - "version": "7.3.1",
17718 - "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.1.tgz",
17719 - "integrity": "sha512-8qiz/jQ4st6Sd3r7wuTSc9XCqsRqcOJFyI3N7Jt6I+Opi/JPE6AXiihsbbfPcN9y4w5w1MuuWH50fq6om5cXXA==",
17898 + "version": "7.3.2",
17899 + "resolved": "https://registry.npmjs.org/@milkdown/preset-commonmark/-/preset-commonmark-7.3.2.tgz",
17900 + "integrity": "sha512-gy7Ay1zAHYl07sPraR+tC2bZsw0dyDt+B36QgsIoEpRvKI4LPNSfI+0UuiK0yzKmELsMvMZNu8yxG32q/dtSZA==",
17901 "requires": {
17721 - "@milkdown/exception": "7.3.1",
17722 - "@milkdown/utils": "7.3.1",
17902 + "@milkdown/exception": "7.3.2",
17903 + "@milkdown/utils": "7.3.2",
17904 "@sindresorhus/slugify": "^2.2.0",
17905 "remark-inline-links": "^7.0.0",
17906 "tslib": "^2.5.0",
@@ -17727,11 +17908,11 @@
17908 }
17909 },
17910 "@milkdown/prose": {
17730 - "version": "7.3.1",
17731 - "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.1.tgz",
17732 - "integrity": "sha512-l9xfPOYDwOnTrTCLYr328pUjg9gwNP5n1CKBVFlpkkGKdDVAfdRsH0QgzNHuw42amwDG+e+uu/s29HGqm9JZog==",
17911 + "version": "7.3.2",
17912 + "resolved": "https://registry.npmjs.org/@milkdown/prose/-/prose-7.3.2.tgz",
17913 + "integrity": "sha512-3CeQ6Z75SL0zSm/fHzbP3e3I2a4+kFbkXI6vreK6AKQeCjYSJ8r/uJLkoDYRmJKOzc6HmnuCpIMbzZQ9kaeEnw==",
17914 "requires": {
17734 - "@milkdown/exception": "7.3.1",
17915 + "@milkdown/exception": "7.3.2",
17916 "prosemirror-changeset": "^2.2.1",
17917 "prosemirror-commands": "^1.5.2",
17918 "prosemirror-dropcursor": "^1.8.1",
@@ -17749,9 +17930,9 @@
17930 }
17931 },
17932 "@milkdown/theme-nord": {
17752 - "version": "7.3.1",
17753 - "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.1.tgz",
17754 - "integrity": "sha512-vnloL2XXG9hDdHBkFES3GNi1UzLY7iahOVbuz/0N/m0LGRTkcvy0OUOKzE3csJ6j7ENQhAmv8PhFv60EdlVz0A==",
17933 + "version": "7.3.2",
17934 + "resolved": "https://registry.npmjs.org/@milkdown/theme-nord/-/theme-nord-7.3.2.tgz",
17935 + "integrity": "sha512-CgydLp7E47a1EsFEMoLICSNeKnVfcGeD8FByXtHou4OZcLxYfQdvtGEOObVlgBa01qNOdbATRZsrIl4rc8likQ==",
17936 "requires": {
17937 "clsx": "^2.0.0",
17938 "tslib": "^2.5.0"
@@ -17765,11 +17946,11 @@
17946 }
17947 },
17948 "@milkdown/transformer": {
17768 - "version": "7.3.1",
17769 - "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.1.tgz",
17770 - "integrity": "sha512-vFGnoOxqVnMNnu+JGs+bxMgIEC1RYhaWWKj1LtpwQQlHTX3PUCN823gF6MjH5R4L98HIg2Ysc7GbE1O7JoL3pw==",
17949 + "version": "7.3.2",
17950 + "resolved": "https://registry.npmjs.org/@milkdown/transformer/-/transformer-7.3.2.tgz",
17951 + "integrity": "sha512-FsasNHjRRbRha4I3jXhK7FZymTzp4bAeqTB65QcIg5TILSpYan0BCZ2oDqnChK7wxppA9cP29iLOg/FJvNdhmw==",
17952 "requires": {
17772 - "@milkdown/exception": "7.3.1",
17953 + "@milkdown/exception": "7.3.2",
17954 "remark": "^15.0.1",
17955 "remark-parse": "^11.0.0",
17956 "remark-stringify": "^11.0.0",
@@ -17778,21 +17959,21 @@
17959 }
17960 },
17961 "@milkdown/utils": {
17781 - "version": "7.3.1",
17782 - "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.1.tgz",
17783 - "integrity": "sha512-GT54XYHwnHjHVmH3vBcCFwlzZhdaM3S+1Zp1+ci5bcfTX0Rmt1KUyzkeBJOcSDS4jCm8eTYd2kBCzodZOHqm9A==",
17962 + "version": "7.3.2",
17963 + "resolved": "https://registry.npmjs.org/@milkdown/utils/-/utils-7.3.2.tgz",
17964 + "integrity": "sha512-Dsdfkcs7D/gujERtegsyG+fLa/UbuczSI7+YueXrmyQ7y6LE/Ob8bo/PwSiISFTn4+hzZfchdmcYSmgvlblQNQ==",
17965 "requires": {
17785 - "@milkdown/exception": "7.3.1",
17966 + "@milkdown/exception": "7.3.2",
17967 "nanoid": "^5.0.0",
17968 "tslib": "^2.5.0"
17969 }
17970 },
17971 "@milkdown/vue": {
17791 - "version": "7.3.1",
17792 - "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.1.tgz",
17793 - "integrity": "sha512-JkzmIlRlran60VYELOqCjEOqpenQEIgv/m5sKlfjP0c2AVBBl4XnBDdsS9BswjF/l50JlqA3MoqPzzg/eTdmEA==",
17972 + "version": "7.3.2",
17973 + "resolved": "https://registry.npmjs.org/@milkdown/vue/-/vue-7.3.2.tgz",
17974 + "integrity": "sha512-GgxjZrSaQDfSg/C/4UXz3vC8K1d6JeQ7jeFMnQBinvic2zJuzARDRNPVADEuU6zsHBvL8hCXlI4DiV6OTmzuIg==",
17975 "requires": {
17795 - "@milkdown/utils": "7.3.1",
17976 + "@milkdown/utils": "7.3.2",
17977 "tslib": "^2.5.0"
17978 }
17979 },
@@ -17884,13 +18065,13 @@
18065 }
18066 },
18067 "@npmcli/config": {
17887 - "version": "8.0.1",
17888 - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.1.tgz",
17889 - "integrity": "sha512-NKGmMYv/YTLwJr+qK9CvADSe82NTM9AFwFFpsZpVcPCT3XTdxvJBdXi8xvXWjHSCMb0Cb+7FtU/a5qqguCOhxA==",
18068 + "version": "8.0.2",
18069 + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.0.2.tgz",
18070 + "integrity": "sha512-g+DAp7bUsiUDynRI4jTO0wPAXJpy3puhovHHg8S4iq54NF8zd00588GJOm5ARxDaDUdKCUYu9E5fNc+esYl5JA==",
18071 "dev": true,
18072 "requires": {
18073 "@npmcli/map-workspaces": "^3.0.2",
17893 - "ci-info": "^3.8.0",
18074 + "ci-info": "^4.0.0",
18075 "ini": "^4.1.0",
18076 "nopt": "^7.0.0",
18077 "proc-log": "^3.0.0",
@@ -17905,6 +18086,12 @@
18086 "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
18087 "dev": true
18088 },
18089 + "ci-info": {
18090 + "version": "4.0.0",
18091 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
18092 + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
18093 + "dev": true
18094 + },
18095 "ini": {
18096 "version": "4.1.1",
18097 "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
@@ -18379,9 +18566,9 @@
18566 "optional": true
18567 },
18568 "@rushstack/eslint-patch": {
18382 - "version": "1.5.1",
18383 - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz",
18384 - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==",
18569 + "version": "1.6.0",
18570 + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz",
18571 + "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==",
18572 "dev": true
18573 },
18574 "@sideway/address": {
@@ -18491,183 +18678,183 @@
18678 "integrity": "sha512-YlLyCqGBsMEuZb3XTO/STT0TX9eSwjoVhCJgtjVfQOF+ebIMVlojTh40CmDveWiWbth687cbr6S2heeussV8Sg=="
18679 },
18680 "@tiptap/core": {
18494 - "version": "2.1.12",
18495 - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.12.tgz",
18496 - "integrity": "sha512-ZGc3xrBJA9KY8kln5AYTj8y+GDrKxi7u95xIl2eccrqTY5CQeRu6HRNM1yT4mAjuSaG9jmazyjGRlQuhyxCKxQ==",
18681 + "version": "2.1.13",
18682 + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz",
18683 + "integrity": "sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==",
18684 "requires": {}
18685 },
18686 "@tiptap/extension-blockquote": {
18500 - "version": "2.1.12",
18501 - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.12.tgz",
18502 - "integrity": "sha512-Qb3YRlCfugx9pw7VgLTb+jY37OY4aBJeZnqHzx4QThSm13edNYjasokbX0nTwL1Up4NPTcY19JUeHt6fVaVVGg==",
18687 + "version": "2.1.13",
18688 + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.13.tgz",
18689 + "integrity": "sha512-oe6wSQACmODugoP9XH3Ouffjy4BsOBWfTC+dETHNCG6ZED6ShHN3CB9Vr7EwwRgmm2WLaKAjMO1sVumwH+Z1rg==",
18690 "requires": {}
18691 },
18692 "@tiptap/extension-bold": {
18506 - "version": "2.1.12",
18507 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.12.tgz",
18508 - "integrity": "sha512-AZGxIxcGU1/y6V2YEbKsq6BAibL8yQrbRm6EdcBnby41vj1WziewEKswhLGmZx5IKM2r2ldxld03KlfSIlKQZg==",
18693 + "version": "2.1.13",
18694 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.13.tgz",
18695 + "integrity": "sha512-6cHsQTh/rUiG4jkbJer3vk7g60I5tBwEBSGpdxmEHh83RsvevD8+n92PjA24hYYte5RNlATB011E1wu8PVhSvw==",
18696 "requires": {}
18697 },
18698 "@tiptap/extension-bubble-menu": {
18512 - "version": "2.1.12",
18513 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.12.tgz",
18514 - "integrity": "sha512-gAGi21EQ4wvLmT7klgariAc2Hf+cIjaNU2NWze3ut6Ku9gUo5ZLqj1t9SKHmNf4d5JG63O8GxpErqpA7lHlRtw==",
18699 + "version": "2.1.13",
18700 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.13.tgz",
18701 + "integrity": "sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==",
18702 "requires": {
18703 "tippy.js": "^6.3.7"
18704 }
18705 },
18706 "@tiptap/extension-bullet-list": {
18520 - "version": "2.1.12",
18521 - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.12.tgz",
18522 - "integrity": "sha512-vtD8vWtNlmAZX8LYqt2yU9w3mU9rPCiHmbp4hDXJs2kBnI0Ju/qAyXFx6iJ3C3XyuMnMbJdDI9ee0spAvFz7cQ==",
18707 + "version": "2.1.13",
18708 + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.13.tgz",
18709 + "integrity": "sha512-NkWlQ5bLPUlcROj6G/d4oqAxMf3j3wfndGOPp0z8OoXJtVbVoXl/aMSlLbVgE6n8r6CS8MYxKhXNxrb7Ll2foA==",
18710 "requires": {}
18711 },
18712 "@tiptap/extension-character-count": {
18526 - "version": "2.1.12",
18527 - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.1.12.tgz",
18528 - "integrity": "sha512-+GFbBG13nvF8mFIeisSERG/Q3CuRsTNwVZIRbJTLgGdbHXFqPhJh4Xfm7cv7OaOYevUlVyO+z5pGD7wIl1bLqQ==",
18713 + "version": "2.1.13",
18714 + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-2.1.13.tgz",
18715 + "integrity": "sha512-FxPxS/Uqd4MgndInxXOcgNd225541Nsk1lT5e2uNTSNiQnG7dj7cSFG5KXGcSGLpGGt6e/E28WR6KLV+0/u+WA==",
18716 "requires": {}
18717 },
18718 "@tiptap/extension-code": {
18532 - "version": "2.1.12",
18533 - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.12.tgz",
18534 - "integrity": "sha512-CRiRq5OTC1lFgSx6IMrECqmtb93a0ZZKujEnaRhzWliPBjLIi66va05f/P1vnV6/tHaC3yfXys6dxB5A4J8jxw==",
18719 + "version": "2.1.13",
18720 + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.13.tgz",
18721 + "integrity": "sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==",
18722 "requires": {}
18723 },
18724 "@tiptap/extension-code-block": {
18538 - "version": "2.1.12",
18539 - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.12.tgz",
18540 - "integrity": "sha512-RXtSYCVsnk8D+K80uNZShClfZjvv1EgO42JlXLVGWQdIgaNyuOv/6I/Jdf+ZzhnpsBnHufW+6TJjwP5vJPSPHA==",
18725 + "version": "2.1.13",
18726 + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.13.tgz",
18727 + "integrity": "sha512-E3tweNExPOV+t1ODKX0MDVsS0aeHGWc1ECt+uyp6XwzsN0bdF2A5+pttQqM7sTcMnQkVACGFbn9wDeLRRcfyQg==",
18728 "requires": {}
18729 },
18730 "@tiptap/extension-document": {
18544 - "version": "2.1.12",
18545 - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.12.tgz",
18546 - "integrity": "sha512-0QNfAkCcFlB9O8cUNSwTSIQMV9TmoEhfEaLz/GvbjwEq4skXK3bU+OQX7Ih07waCDVXIGAZ7YAZogbvrn/WbOw==",
18731 + "version": "2.1.13",
18732 + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.13.tgz",
18733 + "integrity": "sha512-wLwiTWsVmZTGIE5duTcHRmW4ulVxNW4nmgfpk95+mPn1iKyNGtrVhGWleLhBlTj+DWXDtcfNWZgqZkZNzhkqYQ==",
18734 "requires": {}
18735 },
18736 "@tiptap/extension-dropcursor": {
18550 - "version": "2.1.12",
18551 - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.12.tgz",
18552 - "integrity": "sha512-0tT/q8nL4NBCYPxr9T0Brck+RQbWuczm9nV0bnxgt0IiQXoRHutfPWdS7GA65PTuVRBS/3LOco30fbjFhkfz/A==",
18737 + "version": "2.1.13",
18738 + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.13.tgz",
18739 + "integrity": "sha512-NAyJi4BJxH7vl/2LNS1X0ndwFKjEtX+cRgshXCnMyh7qNpIRW6Plczapc/W1OiMncOEhZJfpZfkRSfwG01FWFg==",
18740 "requires": {}
18741 },
18742 "@tiptap/extension-floating-menu": {
18556 - "version": "2.1.12",
18557 - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.12.tgz",
18558 - "integrity": "sha512-uo0ydCJNg6AWwLT6cMUJYVChfvw2PY9ZfvKRhh9YJlGfM02jS4RUG/bJBts6R37f+a5FsOvAVwg8EvqPlNND1A==",
18743 + "version": "2.1.13",
18744 + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.13.tgz",
18745 + "integrity": "sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==",
18746 "requires": {
18747 "tippy.js": "^6.3.7"
18748 }
18749 },
18750 "@tiptap/extension-gapcursor": {
18564 - "version": "2.1.12",
18565 - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.12.tgz",
18566 - "integrity": "sha512-zFYdZCqPgpwoB7whyuwpc8EYLYjUE5QYKb8vICvc+FraBUDM51ujYhFSgJC3rhs8EjI+8GcK8ShLbSMIn49YOQ==",
18751 + "version": "2.1.13",
18752 + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.13.tgz",
18753 + "integrity": "sha512-Cl5apsoTcyPPCgE3ThufxQxZ1wyqqh+9uxUN9VF9AbeTkid6oPZvKXwaILf6AFnkSy+SuKrb9kZD2iaezxpzXw==",
18754 "requires": {}
18755 },
18756 "@tiptap/extension-hard-break": {
18570 - "version": "2.1.12",
18571 - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.12.tgz",
18572 - "integrity": "sha512-nqKcAYGEOafg9D+2cy1E4gHNGuL12LerVa0eS2SQOb+PT8vSel9OTKU1RyZldsWSQJ5rq/w4uIjmLnrSR2w6Yw==",
18757 + "version": "2.1.13",
18758 + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.13.tgz",
18759 + "integrity": "sha512-TGkMzMQayuKg+vN4du0x1ahEItBLcCT1jdWeRsjdM8gHfzbPLdo4PQhVsvm1I0xaZmbJZelhnVsUwRZcIu1WNA==",
18760 "requires": {}
18761 },
18762 "@tiptap/extension-heading": {
18576 - "version": "2.1.12",
18577 - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.12.tgz",
18578 - "integrity": "sha512-MoANP3POAP68Ko9YXarfDKLM/kXtscgp6m+xRagPAghRNujVY88nK1qBMZ3JdvTVN6b/ATJhp8UdrZX96TLV2w==",
18763 + "version": "2.1.13",
18764 + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.13.tgz",
18765 + "integrity": "sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==",
18766 "requires": {}
18767 },
18768 "@tiptap/extension-highlight": {
18582 - "version": "2.1.12",
18583 - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.12.tgz",
18584 - "integrity": "sha512-buen31cYPyiiHA2i0o2i/UcjRTg/42mNDCizGr1OJwvv3AELG3qOFc4Y58WJWIvWNv+1Dr4ZxHA3GNVn0ANWyg==",
18769 + "version": "2.1.13",
18770 + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.13.tgz",
18771 + "integrity": "sha512-ZivjJma5WwPYcG0rpnynVDGis32OGdtpTwETEb+2OOjZBCBlyYQ4tcRk5gS3nzBAjLl/Qu84VVbawLhHXB6few==",
18772 "requires": {}
18773 },
18774 "@tiptap/extension-history": {
18588 - "version": "2.1.12",
18589 - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.12.tgz",
18590 - "integrity": "sha512-6b7UFVkvPjq3LVoCTrYZAczt5sQrQUaoDWAieVClVZoFLfjga2Fwjcfgcie8IjdPt8YO2hG/sar/c07i9vM0Sg==",
18775 + "version": "2.1.13",
18776 + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.13.tgz",
18777 + "integrity": "sha512-1ouitThGTBUObqw250aDwGLMNESBH5PRXIGybsCFO1bktdmWtEw7m72WY41EuX2BH8iKJpcYPerl3HfY1vmCNw==",
18778 "requires": {}
18779 },
18780 "@tiptap/extension-horizontal-rule": {
18594 - "version": "2.1.12",
18595 - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.12.tgz",
18596 - "integrity": "sha512-RRuoK4KxrXRrZNAjJW5rpaxjiP0FJIaqpi7nFbAua2oHXgsCsG8qbW2Y0WkbIoS8AJsvLZ3fNGsQ8gpdliuq3A==",
18781 + "version": "2.1.13",
18782 + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.13.tgz",
18783 + "integrity": "sha512-7OgjgNqZXvBejgULNdMSma2M1nzv4bbZG+FT5XMFZmEOxR9IB1x/RzChjPdeicff2ZK2sfhMBc4Y9femF5XkUg==",
18784 "requires": {}
18785 },
18786 "@tiptap/extension-italic": {
18600 - "version": "2.1.12",
18601 - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.12.tgz",
18602 - "integrity": "sha512-/XYrW4ZEWyqDvnXVKbgTXItpJOp2ycswk+fJ3vuexyolO6NSs0UuYC6X4f+FbHYL5VuWqVBv7EavGa+tB6sl3A==",
18787 + "version": "2.1.13",
18788 + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.13.tgz",
18789 + "integrity": "sha512-HyDJfuDn5hzwGKZiANcvgz6wcum6bEgb4wmJnfej8XanTMJatNVv63TVxCJ10dSc9KGpPVcIkg6W8/joNXIEbw==",
18790 "requires": {}
18791 },
18792 "@tiptap/extension-link": {
18606 - "version": "2.1.12",
18607 - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.12.tgz",
18608 - "integrity": "sha512-Sti5hhlkCqi5vzdQjU/gbmr8kb578p+u0J4kWS+SSz3BknNThEm/7Id67qdjBTOQbwuN07lHjDaabJL0hSkzGQ==",
18793 + "version": "2.1.13",
18794 + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.13.tgz",
18795 + "integrity": "sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==",
18796 "requires": {
18797 "linkifyjs": "^4.1.0"
18798 }
18799 },
18800 "@tiptap/extension-list-item": {
18614 - "version": "2.1.12",
18615 - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.12.tgz",
18616 - "integrity": "sha512-Gk7hBFofAPmNQ8+uw8w5QSsZOMEGf7KQXJnx5B022YAUJTYYxO3jYVuzp34Drk9p+zNNIcXD4kc7ff5+nFOTrg==",
18801 + "version": "2.1.13",
18802 + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.13.tgz",
18803 + "integrity": "sha512-6e8iiCWXOiJTl1XOwVW2tc0YG18h70HUtEHFCx2m5HspOGFKsFEaSS3qYxOheM9HxlmQeDt8mTtqftRjEFRxPQ==",
18804 "requires": {}
18805 },
18806 "@tiptap/extension-ordered-list": {
18620 - "version": "2.1.12",
18621 - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.12.tgz",
18622 - "integrity": "sha512-tF6VGl+D2avCgn9U/2YLJ8qVmV6sPE/iEzVAFZuOSe6L0Pj7SQw4K6AO640QBob/d8VrqqJFHCb6l10amJOnXA==",
18807 + "version": "2.1.13",
18808 + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.13.tgz",
18809 + "integrity": "sha512-UO4ZAL5Vrr1WwER5VjgmeNIWHpqy9cnIRo1En07gZ0OWTjs1eITPcu+4TCn1ZG6DhoFvAQzE5DTxxdhIotg+qw==",
18810 "requires": {}
18811 },
18812 "@tiptap/extension-paragraph": {
18626 - "version": "2.1.12",
18627 - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.12.tgz",
18628 - "integrity": "sha512-hoH/uWPX+KKnNAZagudlsrr4Xu57nusGekkJWBcrb5MCDE91BS+DN2xifuhwXiTHxnwOMVFjluc0bPzQbkArsw==",
18813 + "version": "2.1.13",
18814 + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.13.tgz",
18815 + "integrity": "sha512-cEoZBJrsQn69FPpUMePXG/ltGXtqKISgypj70PEHXt5meKDjpmMVSY4/8cXvFYEYsI9GvIwyAK0OrfAHiSoROA==",
18816 "requires": {}
18817 },
18818 "@tiptap/extension-strike": {
18632 - "version": "2.1.12",
18633 - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.12.tgz",
18634 - "integrity": "sha512-HlhrzIjYUT8oCH9nYzEL2QTTn8d1ECnVhKvzAe6x41xk31PjLMHTUy8aYjeQEkWZOWZ34tiTmslV1ce6R3Dt8g==",
18819 + "version": "2.1.13",
18820 + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.13.tgz",
18821 + "integrity": "sha512-VN6zlaCNCbyJUCDyBFxavw19XmQ4LkCh8n20M8huNqW77lDGXA2A7UcWLHaNBpqAijBRu9mWI8l4Bftyf2fcAw==",
18822 "requires": {}
18823 },
18824 "@tiptap/extension-task-item": {
18638 - "version": "2.1.12",
18639 - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-2.1.12.tgz",
18640 - "integrity": "sha512-uqrDTO4JwukZUt40GQdvB6S+oDhdp4cKNPMi0sbteWziQugkSMLlkYvxU0Hfb/YeziaWWwFI7ssPu/hahyk6dQ==",
18825 + "version": "2.1.13",
18826 + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-2.1.13.tgz",
18827 + "integrity": "sha512-0E1woY0BXpv0SBOGPl5Cmo2RuH+Zchn7dYcTILtOsqHu6onJ4eP0N76+jGFLGV3T0PnPf7JDuwsO/B6pC7yMSg==",
18828 "requires": {}
18829 },
18830 "@tiptap/extension-task-list": {
18644 - "version": "2.1.12",
18645 - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-2.1.12.tgz",
18646 - "integrity": "sha512-BUpYlEWK+Q3kw9KIiOqvhd0tUPhMcOf1+fJmCkluJok+okAxMbP1umAtCEQ3QkoCwLr+vpHJov7h3yi9+dwgeQ==",
18831 + "version": "2.1.13",
18832 + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-2.1.13.tgz",
18833 + "integrity": "sha512-WfTo4KN0PqpmZxx23rak08M7flfBhv9IcPVpuJ4JthZOlexYdOZxaE/Yd4vlqZhq6cibG7CFljp8VzkfTUa1Ew==",
18834 "requires": {}
18835 },
18836 "@tiptap/extension-text": {
18650 - "version": "2.1.12",
18651 - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.12.tgz",
18652 - "integrity": "sha512-rCNUd505p/PXwU9Jgxo4ZJv4A3cIBAyAqlx/dtcY6cjztCQuXJhuQILPhjGhBTOLEEL4kW2wQtqzCmb7O8i2jg==",
18837 + "version": "2.1.13",
18838 + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.13.tgz",
18839 + "integrity": "sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==",
18840 "requires": {}
18841 },
18842 "@tiptap/extension-text-align": {
18656 - "version": "2.1.12",
18657 - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.12.tgz",
18658 - "integrity": "sha512-siMlwrkgVrAxxgmZn8GOc75J7UZi2CVrP9vDHkUPPyKm/fjssYekXwGCEk4Vswii1BbOh2gt+MDsRkeYRGyDlQ==",
18843 + "version": "2.1.13",
18844 + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.13.tgz",
18845 + "integrity": "sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==",
18846 "requires": {}
18847 },
18848 "@tiptap/extension-underline": {
18662 - "version": "2.1.12",
18663 - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.12.tgz",
18664 - "integrity": "sha512-NwwdhFT8gDD0VUNLQx85yFBhP9a8qg8GPuxlGzAP/lPTV8Ubh3vSeQ5N9k2ZF/vHlEvnugzeVCbmYn7wf8vn1g==",
18849 + "version": "2.1.13",
18850 + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.13.tgz",
18851 + "integrity": "sha512-z0CNKPjcvU8TrUSTui1voM7owssyXE9WvEGhIZMHzWwlx2ZXY2/L5+Hh33X/LzSKB9OGf/g1HAuHxrPcYxFuAQ==",
18852 "requires": {}
18853 },
18854 "@tiptap/pm": {
18668 - "version": "2.1.12",
18669 - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.12.tgz",
18670 - "integrity": "sha512-Q3MXXQABG4CZBesSp82yV84uhJh/W0Gag6KPm2HRWPimSFELM09Z9/5WK9RItAYE0aLhe4Krnyiczn9AAa1tQQ==",
18855 + "version": "2.1.13",
18856 + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz",
18857 + "integrity": "sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==",
18858 "requires": {
18859 "prosemirror-changeset": "^2.2.0",
18860 "prosemirror-collab": "^1.3.0",
@@ -18690,38 +18877,38 @@
18877 }
18878 },
18879 "@tiptap/starter-kit": {
18693 - "version": "2.1.12",
18694 - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.1.12.tgz",
18695 - "integrity": "sha512-+RoP1rWV7rSCit2+3wl2bjvSRiePRJE/7YNKbvH8Faz/+AMO23AFegHoUFynR7U0ouGgYDljGkkj35e0asbSDA==",
18696 - "requires": {
18697 - "@tiptap/core": "^2.1.12",
18698 - "@tiptap/extension-blockquote": "^2.1.12",
18699 - "@tiptap/extension-bold": "^2.1.12",
18700 - "@tiptap/extension-bullet-list": "^2.1.12",
18701 - "@tiptap/extension-code": "^2.1.12",
18702 - "@tiptap/extension-code-block": "^2.1.12",
18703 - "@tiptap/extension-document": "^2.1.12",
18704 - "@tiptap/extension-dropcursor": "^2.1.12",
18705 - "@tiptap/extension-gapcursor": "^2.1.12",
18706 - "@tiptap/extension-hard-break": "^2.1.12",
18707 - "@tiptap/extension-heading": "^2.1.12",
18708 - "@tiptap/extension-history": "^2.1.12",
18709 - "@tiptap/extension-horizontal-rule": "^2.1.12",
18710 - "@tiptap/extension-italic": "^2.1.12",
18711 - "@tiptap/extension-list-item": "^2.1.12",
18712 - "@tiptap/extension-ordered-list": "^2.1.12",
18713 - "@tiptap/extension-paragraph": "^2.1.12",
18714 - "@tiptap/extension-strike": "^2.1.12",
18715 - "@tiptap/extension-text": "^2.1.12"
18880 + "version": "2.1.13",
18881 + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.1.13.tgz",
18882 + "integrity": "sha512-ph/mUR/OwPtPkZ5rNHINxubpABn8fHnvJSdhXFrY/q6SKoaO11NZXgegRaiG4aL7O6Sz4LsZVw6Sm0Ae+GJmrg==",
18883 + "requires": {
18884 + "@tiptap/core": "^2.1.13",
18885 + "@tiptap/extension-blockquote": "^2.1.13",
18886 + "@tiptap/extension-bold": "^2.1.13",
18887 + "@tiptap/extension-bullet-list": "^2.1.13",
18888 + "@tiptap/extension-code": "^2.1.13",
18889 + "@tiptap/extension-code-block": "^2.1.13",
18890 + "@tiptap/extension-document": "^2.1.13",
18891 + "@tiptap/extension-dropcursor": "^2.1.13",
18892 + "@tiptap/extension-gapcursor": "^2.1.13",
18893 + "@tiptap/extension-hard-break": "^2.1.13",
18894 + "@tiptap/extension-heading": "^2.1.13",
18895 + "@tiptap/extension-history": "^2.1.13",
18896 + "@tiptap/extension-horizontal-rule": "^2.1.13",
18897 + "@tiptap/extension-italic": "^2.1.13",
18898 + "@tiptap/extension-list-item": "^2.1.13",
18899 + "@tiptap/extension-ordered-list": "^2.1.13",
18900 + "@tiptap/extension-paragraph": "^2.1.13",
18901 + "@tiptap/extension-strike": "^2.1.13",
18902 + "@tiptap/extension-text": "^2.1.13"
18903 }
18904 },
18905 "@tiptap/vue-3": {
18719 - "version": "2.1.12",
18720 - "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.1.12.tgz",
18721 - "integrity": "sha512-yAcfmWw/9jtIUbhb0uGQVI9NoPYgHRasX2sAGWnm9Al+0aJktgmQ3mLCifXfXfjyEbeMF0p2L6Ul8tO7eho7aQ==",
18906 + "version": "2.1.13",
18907 + "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.1.13.tgz",
18908 + "integrity": "sha512-sPMT+uXtPfYLQioXtxxMLij234++PEf5Z43/auOLu737pKdgBr7w0sC8oYiZMgFt9dNCZWBrvT0fupF8yQN8AQ==",
18909 "requires": {
18723 - "@tiptap/extension-bubble-menu": "^2.1.12",
18724 - "@tiptap/extension-floating-menu": "^2.1.12"
18910 + "@tiptap/extension-bubble-menu": "^2.1.13",
18911 + "@tiptap/extension-floating-menu": "^2.1.13"
18912 }
18913 },
18914 "@tootallnate/once": {
@@ -18808,21 +18995,6 @@
18995 "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==",
18996 "dev": true
18997 },
18811 - "@types/chai": {
18812 - "version": "4.3.6",
18813 - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz",
18814 - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==",
18815 - "dev": true
18816 - },
18817 - "@types/chai-subset": {
18818 - "version": "1.3.3",
18819 - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
18820 - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
18821 - "dev": true,
18822 - "requires": {
18823 - "@types/chai": "*"
18824 - }
18825 - },
18998 "@types/debug": {
18999 "version": "4.1.10",
19000 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz",
@@ -18912,9 +19084,9 @@
19084 "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA=="
19085 },
19086 "@types/mapbox__vector-tile": {
18915 - "version": "1.3.3",
18916 - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.3.tgz",
18917 - "integrity": "sha512-d263B3KCQtXKVZMHpMJrEW5EeLBsQ8jvAS9nhpUKC5hHIlQaACG9PWkW8qxEeNuceo9120AwPjeS91uNa4ltqA==",
19087 + "version": "1.3.4",
19088 + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
19089 + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
19090 "requires": {
19091 "@types/geojson": "*",
19092 "@types/mapbox__point-geometry": "*",
@@ -18935,9 +19107,9 @@
19107 "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ=="
19108 },
19109 "@types/node": {
18938 - "version": "20.9.3",
18939 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz",
18940 - "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==",
19110 + "version": "20.10.3",
19111 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz",
19112 + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==",
19113 "dev": true,
19114 "requires": {
19115 "undici-types": "~5.26.4"
@@ -18959,9 +19131,9 @@
19131 "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg=="
19132 },
19133 "@types/pbf": {
18962 - "version": "3.0.4",
18963 - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.4.tgz",
18964 - "integrity": "sha512-SOFlLGZkLbEXJRwcWCqeP/Koyaf/uAqLXHUsdo/nMfjLsNd8kqauwHe9GBOljSmpcHp/LC6kOjo3SidGjNirVA=="
19134 + "version": "3.0.5",
19135 + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
19136 + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="
19137 },
19138 "@types/resize-observer-browser": {
19139 "version": "0.1.7",
@@ -19225,9 +19397,9 @@
19397 "dev": true
19398 },
19399 "@vitejs/plugin-vue": {
19228 - "version": "4.5.0",
19229 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz",
19230 - "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==",
19400 + "version": "4.5.1",
19401 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.1.tgz",
19402 + "integrity": "sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g==",
19403 "dev": true,
19404 "requires": {}
19405 },
@@ -19243,31 +19415,31 @@
19415 }
19416 },
19417 "@vitest/expect": {
19246 - "version": "0.34.6",
19247 - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz",
19248 - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==",
19418 + "version": "1.0.1",
19419 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.1.tgz",
19420 + "integrity": "sha512-3cdrb/eKD/0tygDX75YscuHEHMUJ70u3UoLSq2eqhWks57AyzvsDQbyn53IhZ0tBN7gA8Jj2VhXiOV2lef7thw==",
19421 "dev": true,
19422 "requires": {
19251 - "@vitest/spy": "0.34.6",
19252 - "@vitest/utils": "0.34.6",
19423 + "@vitest/spy": "1.0.1",
19424 + "@vitest/utils": "1.0.1",
19425 "chai": "^4.3.10"
19426 }
19427 },
19428 "@vitest/runner": {
19257 - "version": "0.34.6",
19258 - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz",
19259 - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==",
19429 + "version": "1.0.1",
19430 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.1.tgz",
19431 + "integrity": "sha512-/+z0vhJ0MfRPT3AyTvAK6m57rzlew/ct8B2a4LMv7NhpPaiI2QLGyOBMB3lcioWdJHjRuLi9aYppfOv0B5aRQA==",
19432 "dev": true,
19433 "requires": {
19262 - "@vitest/utils": "0.34.6",
19263 - "p-limit": "^4.0.0",
19434 + "@vitest/utils": "1.0.1",
19435 + "p-limit": "^5.0.0",
19436 "pathe": "^1.1.1"
19437 },
19438 "dependencies": {
19439 "p-limit": {
19268 - "version": "4.0.0",
19269 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
19270 - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
19440 + "version": "5.0.0",
19441 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
19442 + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
19443 "dev": true,
19444 "requires": {
19445 "yocto-queue": "^1.0.0"
@@ -19282,61 +19454,62 @@
19454 }
19455 },
19456 "@vitest/snapshot": {
19285 - "version": "0.34.6",
19286 - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz",
19287 - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==",
19457 + "version": "1.0.1",
19458 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.1.tgz",
19459 + "integrity": "sha512-wIPtPDGSxEZ+DpNMc94AsybX6LV6uN6sosf5TojyP1m2QbKwiRuLV/5RSsjt1oWViHsTj8mlcwrQQ1zHGO0fMw==",
19460 "dev": true,
19461 "requires": {
19290 - "magic-string": "^0.30.1",
19462 + "magic-string": "^0.30.5",
19463 "pathe": "^1.1.1",
19292 - "pretty-format": "^29.5.0"
19464 + "pretty-format": "^29.7.0"
19465 }
19466 },
19467 "@vitest/spy": {
19296 - "version": "0.34.6",
19297 - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz",
19298 - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==",
19468 + "version": "1.0.1",
19469 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.1.tgz",
19470 + "integrity": "sha512-yXwm1uKhBVr/5MhVeSmtNqK+0q2RXIchJt8kokEKdrWLtkPeDgdbZ6SjR1VQGZuNdWL6sSBnLayIyVvcS0qLfA==",
19471 "dev": true,
19472 "requires": {
19301 - "tinyspy": "^2.1.1"
19473 + "tinyspy": "^2.2.0"
19474 }
19475 },
19476 "@vitest/utils": {
19305 - "version": "0.34.6",
19306 - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz",
19307 - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==",
19477 + "version": "1.0.1",
19478 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.1.tgz",
19479 + "integrity": "sha512-MGPCHkzXbbAyscrhwGzh8uP1HPrTYLWaj1WTDtWSGrpe2yJWLRN9mF9ooKawr6NMOg9vTBtg2JqWLfuLC7Dknw==",
19480 "dev": true,
19481 "requires": {
19310 - "diff-sequences": "^29.4.3",
19311 - "loupe": "^2.3.6",
19312 - "pretty-format": "^29.5.0"
19482 + "diff-sequences": "^29.6.3",
19483 + "loupe": "^2.3.7",
19484 + "pretty-format": "^29.7.0"
19485 }
19486 },
19487 "@volar/language-core": {
19316 - "version": "1.10.5",
19317 - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.5.tgz",
19318 - "integrity": "sha512-xD71j4Ee0Ycq8WsiAE6H/aCThGdTobiZZeD+jFD+bvmbopa1Az296pqJysr3Ck8c7n5+GGF+xlKCS3WxRFYgSQ==",
19488 + "version": "1.11.1",
19489 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
19490 + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
19491 "dev": true,
19492 "requires": {
19321 - "@volar/source-map": "1.10.5"
19493 + "@volar/source-map": "1.11.1"
19494 }
19495 },
19496 "@volar/source-map": {
19325 - "version": "1.10.5",
19326 - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.5.tgz",
19327 - "integrity": "sha512-s4kgo66SA1kMzYvF9HFE6Vc1rxtXLUmcLrT2WKnchPDvLne+97Kw+xoR2NxJFmsvHoL18vmu/YGXYcN+Q5re1g==",
19497 + "version": "1.11.1",
19498 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
19499 + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
19500 "dev": true,
19501 "requires": {
19502 "muggle-string": "^0.3.1"
19503 }
19504 },
19505 "@volar/typescript": {
19334 - "version": "1.10.5",
19335 - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.5.tgz",
19336 - "integrity": "sha512-kfDehpeLJku9i1BgsFOYIczPmFFH4herl+GZrLGdvX5urTqeCKsKYlF36iNmFaADzjMb9WlENcUZzPjK8MxNrQ==",
19506 + "version": "1.11.1",
19507 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
19508 + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
19509 "dev": true,
19510 "requires": {
19339 - "@volar/language-core": "1.10.5"
19511 + "@volar/language-core": "1.11.1",
19512 + "path-browserify": "^1.0.1"
19513 }
19514 },
19515 "@vue-leaflet/vue-leaflet": {
@@ -19372,49 +19545,49 @@
19545 }
19546 },
19547 "@vue/compiler-core": {
19375 - "version": "3.3.8",
19376 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz",
19377 - "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==",
19548 + "version": "3.3.10",
19549 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.10.tgz",
19550 + "integrity": "sha512-doe0hODR1+i1menPkRzJ5MNR6G+9uiZHIknK3Zn5OcIztu6GGw7u0XUzf3AgB8h/dfsZC9eouzoLo3c3+N/cVA==",
19551 "requires": {
19379 - "@babel/parser": "^7.23.0",
19380 - "@vue/shared": "3.3.8",
19552 + "@babel/parser": "^7.23.5",
19553 + "@vue/shared": "3.3.10",
19554 "estree-walker": "^2.0.2",
19555 "source-map-js": "^1.0.2"
19556 }
19557 },
19558 "@vue/compiler-dom": {
19386 - "version": "3.3.8",
19387 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz",
19388 - "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==",
19559 + "version": "3.3.10",
19560 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.10.tgz",
19561 + "integrity": "sha512-NCrqF5fm10GXZIK0GrEAauBqdy+F2LZRt3yNHzrYjpYBuRssQbuPLtSnSNjyR9luHKkWSH8we5LMB3g+4z2HvA==",
19562 "requires": {
19390 - "@vue/compiler-core": "3.3.8",
19391 - "@vue/shared": "3.3.8"
19563 + "@vue/compiler-core": "3.3.10",
19564 + "@vue/shared": "3.3.10"
19565 }
19566 },
19567 "@vue/compiler-sfc": {
19395 - "version": "3.3.8",
19396 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz",
19397 - "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==",
19398 - "requires": {
19399 - "@babel/parser": "^7.23.0",
19400 - "@vue/compiler-core": "3.3.8",
19401 - "@vue/compiler-dom": "3.3.8",
19402 - "@vue/compiler-ssr": "3.3.8",
19403 - "@vue/reactivity-transform": "3.3.8",
19404 - "@vue/shared": "3.3.8",
19568 + "version": "3.3.10",
19569 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.10.tgz",
19570 + "integrity": "sha512-xpcTe7Rw7QefOTRFFTlcfzozccvjM40dT45JtrE3onGm/jBLZ0JhpKu3jkV7rbDFLeeagR/5RlJ2Y9SvyS0lAg==",
19571 + "requires": {
19572 + "@babel/parser": "^7.23.5",
19573 + "@vue/compiler-core": "3.3.10",
19574 + "@vue/compiler-dom": "3.3.10",
19575 + "@vue/compiler-ssr": "3.3.10",
19576 + "@vue/reactivity-transform": "3.3.10",
19577 + "@vue/shared": "3.3.10",
19578 "estree-walker": "^2.0.2",
19579 "magic-string": "^0.30.5",
19407 - "postcss": "^8.4.31",
19580 + "postcss": "^8.4.32",
19581 "source-map-js": "^1.0.2"
19582 }
19583 },
19584 "@vue/compiler-ssr": {
19412 - "version": "3.3.8",
19413 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz",
19414 - "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==",
19585 + "version": "3.3.10",
19586 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.10.tgz",
19587 + "integrity": "sha512-12iM4jA4GEbskwXMmPcskK5wImc2ohKm408+o9iox3tfN9qua8xL0THIZtoe9OJHnXP4eOWZpgCAAThEveNlqQ==",
19588 "requires": {
19416 - "@vue/compiler-dom": "3.3.8",
19417 - "@vue/shared": "3.3.8"
19589 + "@vue/compiler-dom": "3.3.10",
19590 + "@vue/shared": "3.3.10"
19591 }
19592 },
19593 "@vue/devtools-api": {
@@ -19444,18 +19617,19 @@
19617 }
19618 },
19619 "@vue/language-core": {
19447 - "version": "1.8.22",
19448 - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.22.tgz",
19449 - "integrity": "sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==",
19620 + "version": "1.8.25",
19621 + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.25.tgz",
19622 + "integrity": "sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA==",
19623 "dev": true,
19624 "requires": {
19452 - "@volar/language-core": "~1.10.5",
19453 - "@volar/source-map": "~1.10.5",
19625 + "@volar/language-core": "~1.11.1",
19626 + "@volar/source-map": "~1.11.1",
19627 "@vue/compiler-dom": "^3.3.0",
19628 "@vue/shared": "^3.3.0",
19629 "computeds": "^0.0.1",
19630 "minimatch": "^9.0.3",
19631 "muggle-string": "^0.3.1",
19632 + "path-browserify": "^1.0.1",
19633 "vue-template-compiler": "^2.7.14"
19634 },
19635 "dependencies": {
@@ -19480,41 +19654,41 @@
19654 }
19655 },
19656 "@vue/reactivity": {
19483 - "version": "3.3.8",
19484 - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz",
19485 - "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==",
19657 + "version": "3.3.10",
19658 + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.10.tgz",
19659 + "integrity": "sha512-H5Z7rOY/JLO+e5a6/FEXaQ1TMuOvY4LDVgT+/+HKubEAgs9qeeZ+NhADSeEtrNQeiKLDuzeKc8v0CUFpB6Pqgw==",
19660 "requires": {
19487 - "@vue/shared": "3.3.8"
19661 + "@vue/shared": "3.3.10"
19662 }
19663 },
19664 "@vue/reactivity-transform": {
19491 - "version": "3.3.8",
19492 - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz",
19493 - "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==",
19665 + "version": "3.3.10",
19666 + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.10.tgz",
19667 + "integrity": "sha512-0xBdk+CKHWT+Gev8oZ63Tc0qFfj935YZx+UAynlutnrDZ4diFCVFMWixn65HzjE3S1iJppWOo6Tt1OzASH7VEg==",
19668 "requires": {
19495 - "@babel/parser": "^7.23.0",
19496 - "@vue/compiler-core": "3.3.8",
19497 - "@vue/shared": "3.3.8",
19669 + "@babel/parser": "^7.23.5",
19670 + "@vue/compiler-core": "3.3.10",
19671 + "@vue/shared": "3.3.10",
19672 "estree-walker": "^2.0.2",
19673 "magic-string": "^0.30.5"
19674 }
19675 },
19676 "@vue/runtime-core": {
19503 - "version": "3.3.8",
19504 - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz",
19505 - "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==",
19677 + "version": "3.3.10",
19678 + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.10.tgz",
19679 + "integrity": "sha512-DZ0v31oTN4YHX9JEU5VW1LoIVgFovWgIVb30bWn9DG9a7oA415idcwsRNNajqTx8HQJyOaWfRKoyuP2P2TYIag==",
19680 "requires": {
19507 - "@vue/reactivity": "3.3.8",
19508 - "@vue/shared": "3.3.8"
19681 + "@vue/reactivity": "3.3.10",
19682 + "@vue/shared": "3.3.10"
19683 }
19684 },
19685 "@vue/runtime-dom": {
19512 - "version": "3.3.8",
19513 - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz",
19514 - "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==",
19686 + "version": "3.3.10",
19687 + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.10.tgz",
19688 + "integrity": "sha512-c/jKb3ny05KJcYk0j1m7Wbhrxq7mZYr06GhKykDMNRRR9S+/dGT8KpHuNQjv3/8U4JshfkAk6TpecPD3B21Ijw==",
19689 "requires": {
19516 - "@vue/runtime-core": "3.3.8",
19517 - "@vue/shared": "3.3.8",
19690 + "@vue/runtime-core": "3.3.10",
19691 + "@vue/shared": "3.3.10",
19692 "csstype": "^3.1.2"
19693 },
19694 "dependencies": {
@@ -19526,23 +19700,23 @@
19700 }
19701 },
19702 "@vue/server-renderer": {
19529 - "version": "3.3.8",
19530 - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz",
19531 - "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==",
19703 + "version": "3.3.10",
19704 + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.10.tgz",
19705 + "integrity": "sha512-0i6ww3sBV3SKlF3YTjSVqKQ74xialMbjVYGy7cOTi7Imd8ediE7t72SK3qnvhrTAhOvlQhq6Bk6nFPdXxe0sAg==",
19706 "requires": {
19533 - "@vue/compiler-ssr": "3.3.8",
19534 - "@vue/shared": "3.3.8"
19707 + "@vue/compiler-ssr": "3.3.10",
19708 + "@vue/shared": "3.3.10"
19709 }
19710 },
19711 "@vue/shared": {
19538 - "version": "3.3.8",
19539 - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz",
19540 - "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw=="
19712 + "version": "3.3.10",
19713 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.10.tgz",
19714 + "integrity": "sha512-2y3Y2J1a3RhFa0WisHvACJR2ncvWiVHcP8t0Inxo+NKz+8RKO4ZV8eZgCxRgQoA6ITfV12L4E6POOL9HOU5nqw=="
19715 },
19716 "@vue/test-utils": {
19543 - "version": "2.4.2",
19544 - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.2.tgz",
19545 - "integrity": "sha512-07lLjpG1o9tEBoWQfVOFhDT7+WFCdDeECoeSdzOuVgIi6nxb2JDLGNNOV6+3crPpyg/jMlIocj96UROcgomiGg==",
19717 + "version": "2.4.3",
19718 + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.3.tgz",
19719 + "integrity": "sha512-F4K7mF+ad++VlTrxMJVRnenKSJmO6fkQt2wpRDiKDesQMkfpniGWsqEi/JevxGBo2qEkwwjvTUAoiGJLNx++CA==",
19720 "dev": true,
19721 "requires": {
19722 "js-beautify": "^1.14.9",
@@ -19565,12 +19739,12 @@
19739 }
19740 },
19741 "@vueuse/components": {
19568 - "version": "10.6.1",
19569 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.6.1.tgz",
19570 - "integrity": "sha512-Yx7h201xJG3V4+rY1wRAYy8EI9Q1r+gpwCJzgyZ0CWPyDWyZCxPXNjPhBJsXcSzJ1h1ph9tE5cVqEXHtEs6bjg==",
19742 + "version": "10.7.0",
19743 + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.0.tgz",
19744 + "integrity": "sha512-ycyF+fZtipP/8WVWZ5y6Cb9twJ0EeVHIqcqkCcTpmAJdheRjorT8v6cHk3h144HHTMgIfBWC6TaSukDG7QFmsw==",
19745 "requires": {
19572 - "@vueuse/core": "10.6.1",
19573 - "@vueuse/shared": "10.6.1",
19746 + "@vueuse/core": "10.7.0",
19747 + "@vueuse/shared": "10.7.0",
19748 "vue-demi": ">=0.14.6"
19749 },
19750 "dependencies": {
@@ -19583,13 +19757,13 @@
19757 }
19758 },
19759 "@vueuse/core": {
19586 - "version": "10.6.1",
19587 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.6.1.tgz",
19588 - "integrity": "sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==",
19760 + "version": "10.7.0",
19761 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz",
19762 + "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==",
19763 "requires": {
19764 "@types/web-bluetooth": "^0.0.20",
19591 - "@vueuse/metadata": "10.6.1",
19592 - "@vueuse/shared": "10.6.1",
19765 + "@vueuse/metadata": "10.7.0",
19766 + "@vueuse/shared": "10.7.0",
19767 "vue-demi": ">=0.14.6"
19768 },
19769 "dependencies": {
@@ -19602,14 +19776,14 @@
19776 }
19777 },
19778 "@vueuse/metadata": {
19605 - "version": "10.6.1",
19606 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.6.1.tgz",
19607 - "integrity": "sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw=="
19779 + "version": "10.7.0",
19780 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz",
19781 + "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA=="
19782 },
19783 "@vueuse/shared": {
19610 - "version": "10.6.1",
19611 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.6.1.tgz",
19612 - "integrity": "sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==",
19784 + "version": "10.7.0",
19785 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz",
19786 + "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==",
19787 "requires": {
19788 "vue-demi": ">=0.14.6"
19789 },
@@ -19627,12 +19801,6 @@
19801 "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
19802 "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA=="
19803 },
19630 - "abab": {
19631 - "version": "2.0.6",
19632 - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
19633 - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
19634 - "dev": true
19635 - },
19804 "abbrev": {
19805 "version": "1.1.1",
19806 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -19663,9 +19831,9 @@
19831 "requires": {}
19832 },
19833 "acorn-walk": {
19666 - "version": "8.2.0",
19667 - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
19668 - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
19834 + "version": "8.3.1",
19835 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz",
19836 + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==",
19837 "dev": true
19838 },
19839 "agent-base": {
@@ -19755,9 +19923,9 @@
19923 }
19924 },
19925 "apexcharts": {
19758 - "version": "3.44.0",
19759 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.0.tgz",
19760 - "integrity": "sha512-u7Xzrbcxc2yWznN78Jh5NMCYVAsWDfBjRl5ea++rVzFAqjU2hLz4RgKIFwYOBDRQtW1e/Qz8azJTqIJ1+Vu9Qg==",
19926 + "version": "3.44.2",
19927 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.2.tgz",
19928 + "integrity": "sha512-QWOFS/SC1TDsuI8VudVuIwLhs1qE6kwixRvmABMUgTVeVzizRWgQh8pdEIgwl+Zvr0TlM3vHPz6Dc5NP1hJ7BA==",
19929 "requires": {
19930 "@yr/monotone-cubic-spline": "^1.0.3",
19931 "svg.draggable.js": "^2.2.2",
@@ -20297,9 +20465,9 @@
20465 "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="
20466 },
20467 "chart.js": {
20300 - "version": "4.4.0",
20301 - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.0.tgz",
20302 - "integrity": "sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==",
20468 + "version": "4.4.1",
20469 + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
20470 + "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
20471 "requires": {
20472 "@kurkle/color": "^0.3.0"
20473 }
@@ -20676,9 +20844,9 @@
20844 "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
20845 },
20846 "cypress": {
20679 - "version": "13.5.1",
20680 - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.5.1.tgz",
20681 - "integrity": "sha512-yqLViT0D/lPI8Kkm7ciF/x/DCK/H/DnogdGyiTnQgX4OVR2aM30PtK+kvklTOD1u3TuItiD9wUQAF8EYWtyZug==",
20847 + "version": "13.6.1",
20848 + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.1.tgz",
20849 + "integrity": "sha512-k1Wl5PQcA/4UoTffYKKaxA0FJKwg8yenYNYRzLt11CUR0Kln+h7Udne6mdU1cUIdXBDTVZWtmiUjzqGs7/pEpw==",
20850 "dev": true,
20851 "requires": {
20852 "@cypress/request": "^3.0.0",
@@ -20845,14 +21013,13 @@
21013 }
21014 },
21015 "data-urls": {
20848 - "version": "4.0.0",
20849 - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
20850 - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
21016 + "version": "5.0.0",
21017 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
21018 + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
21019 "dev": true,
21020 "requires": {
20853 - "abab": "^2.0.6",
20854 - "whatwg-mimetype": "^3.0.0",
20855 - "whatwg-url": "^12.0.0"
21021 + "whatwg-mimetype": "^4.0.0",
21022 + "whatwg-url": "^14.0.0"
21023 }
21024 },
21025 "date-fns": {
@@ -21174,15 +21341,6 @@
21341 "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
21342 "dev": true
21343 },
21177 - "domexception": {
21178 - "version": "4.0.0",
21179 - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
21180 - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
21181 - "dev": true,
21182 - "requires": {
21183 - "webidl-conversions": "^7.0.0"
21184 - }
21185 - },
21344 "domhandler": {
21345 "version": "5.0.3",
21346 "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
@@ -21510,15 +21668,15 @@
21668 "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="
21669 },
21670 "eslint": {
21513 - "version": "8.54.0",
21514 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz",
21515 - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==",
21671 + "version": "8.55.0",
21672 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
21673 + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
21674 "dev": true,
21675 "requires": {
21676 "@eslint-community/eslint-utils": "^4.2.0",
21677 "@eslint-community/regexpp": "^4.6.1",
21520 - "@eslint/eslintrc": "^2.1.3",
21521 - "@eslint/js": "8.54.0",
21678 + "@eslint/eslintrc": "^2.1.4",
21679 + "@eslint/js": "8.55.0",
21680 "@humanwhocodes/config-array": "^0.11.13",
21681 "@humanwhocodes/module-importer": "^1.0.1",
21682 "@nodelib/fs.walk": "^1.2.8",
@@ -21671,9 +21829,9 @@
21829 }
21830 },
21831 "eslint-plugin-vue": {
21674 - "version": "9.18.1",
21675 - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz",
21676 - "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==",
21832 + "version": "9.19.2",
21833 + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
21834 + "integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
21835 "dev": true,
21836 "requires": {
21837 "@eslint-community/eslint-utils": "^4.4.0",
@@ -22070,9 +22228,9 @@
22228 "dev": true
22229 },
22230 "fs-extra": {
22073 - "version": "11.1.1",
22074 - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
22075 - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
22231 + "version": "11.2.0",
22232 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
22233 + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
22234 "dev": true,
22235 "requires": {
22236 "graceful-fs": "^4.2.0",
@@ -22426,12 +22584,12 @@
22584 "dev": true
22585 },
22586 "html-encoding-sniffer": {
22429 - "version": "3.0.0",
22430 - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
22431 - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
22587 + "version": "4.0.0",
22588 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
22589 + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
22590 "dev": true,
22591 "requires": {
22434 - "whatwg-encoding": "^2.0.0"
22592 + "whatwg-encoding": "^3.1.1"
22593 }
22594 },
22595 "html-tags": {
@@ -22982,9 +23140,9 @@
23140 }
23141 },
23142 "jose": {
22985 - "version": "5.1.1",
22986 - "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.1.tgz",
22987 - "integrity": "sha512-bfB+lNxowY49LfrBO0ITUn93JbUhxUN8I11K6oI5hJu/G6PO6fEUddVLjqdD0cQ9SXIHWXuWh7eJYwZF7Z0N/g=="
23143 + "version": "5.1.3",
23144 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.3.tgz",
23145 + "integrity": "sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw=="
23146 },
23147 "js-beautify": {
23148 "version": "1.14.9",
@@ -23020,36 +23178,43 @@
23178 "dev": true
23179 },
23180 "jsdom": {
23023 - "version": "22.1.0",
23024 - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz",
23025 - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==",
23181 + "version": "23.0.1",
23182 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.1.tgz",
23183 + "integrity": "sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==",
23184 "dev": true,
23185 "requires": {
23028 - "abab": "^2.0.6",
23186 "cssstyle": "^3.0.0",
23030 - "data-urls": "^4.0.0",
23187 + "data-urls": "^5.0.0",
23188 "decimal.js": "^10.4.3",
23032 - "domexception": "^4.0.0",
23189 "form-data": "^4.0.0",
23034 - "html-encoding-sniffer": "^3.0.0",
23035 - "http-proxy-agent": "^5.0.0",
23036 - "https-proxy-agent": "^5.0.1",
23190 + "html-encoding-sniffer": "^4.0.0",
23191 + "http-proxy-agent": "^7.0.0",
23192 + "https-proxy-agent": "^7.0.2",
23193 "is-potential-custom-element-name": "^1.0.1",
23038 - "nwsapi": "^2.2.4",
23194 + "nwsapi": "^2.2.7",
23195 "parse5": "^7.1.2",
23196 "rrweb-cssom": "^0.6.0",
23197 "saxes": "^6.0.0",
23198 "symbol-tree": "^3.2.4",
23043 - "tough-cookie": "^4.1.2",
23044 - "w3c-xmlserializer": "^4.0.0",
23199 + "tough-cookie": "^4.1.3",
23200 + "w3c-xmlserializer": "^5.0.0",
23201 "webidl-conversions": "^7.0.0",
23046 - "whatwg-encoding": "^2.0.0",
23047 - "whatwg-mimetype": "^3.0.0",
23048 - "whatwg-url": "^12.0.1",
23049 - "ws": "^8.13.0",
23050 - "xml-name-validator": "^4.0.0"
23202 + "whatwg-encoding": "^3.1.1",
23203 + "whatwg-mimetype": "^4.0.0",
23204 + "whatwg-url": "^14.0.0",
23205 + "ws": "^8.14.2",
23206 + "xml-name-validator": "^5.0.0"
23207 },
23208 "dependencies": {
23209 + "agent-base": {
23210 + "version": "7.1.0",
23211 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
23212 + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
23213 + "dev": true,
23214 + "requires": {
23215 + "debug": "^4.3.4"
23216 + }
23217 + },
23218 "form-data": {
23219 "version": "4.0.0",
23220 "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -23060,6 +23225,32 @@
23225 "combined-stream": "^1.0.8",
23226 "mime-types": "^2.1.12"
23227 }
23228 + },
23229 + "http-proxy-agent": {
23230 + "version": "7.0.0",
23231 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
23232 + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
23233 + "dev": true,
23234 + "requires": {
23235 + "agent-base": "^7.1.0",
23236 + "debug": "^4.3.4"
23237 + }
23238 + },
23239 + "https-proxy-agent": {
23240 + "version": "7.0.2",
23241 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
23242 + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
23243 + "dev": true,
23244 + "requires": {
23245 + "agent-base": "^7.0.2",
23246 + "debug": "4"
23247 + }
23248 + },
23249 + "xml-name-validator": {
23250 + "version": "5.0.0",
23251 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
23252 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
23253 + "dev": true
23254 }
23255 }
23256 },
@@ -23533,12 +23724,12 @@
23724 "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="
23725 },
23726 "loupe": {
23536 - "version": "2.3.6",
23537 - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
23538 - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
23727 + "version": "2.3.7",
23728 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
23729 + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
23730 "dev": true,
23731 "requires": {
23541 - "get-func-name": "^2.0.0"
23732 + "get-func-name": "^2.0.1"
23733 }
23734 },
23735 "lru-cache": {
@@ -23671,9 +23862,9 @@
23862 "dev": true
23863 },
23864 "maplibre-gl": {
23674 - "version": "3.6.1",
23675 - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.6.1.tgz",
23676 - "integrity": "sha512-XQpLkNTD6WYJXqF7vTxgHbAyShoZMm5o8fohXCn9PC/S/g3zBk92m7GUsN6KfuECh2rO01uiYbSNCSURkOODyQ==",
23865 + "version": "3.6.2",
23866 + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.6.2.tgz",
23867 + "integrity": "sha512-krg2KFIdOpLPngONDhP6ixCoWl5kbdMINP0moMSJFVX7wX1Clm2M9hlNKXS8vBGlVWwR5R3ZfI6IPrYz7c+aCQ==",
23868 "requires": {
23869 "@mapbox/geojson-rewind": "^0.5.2",
23870 "@mapbox/jsonlint-lines-primitives": "^2.0.2",
@@ -23685,8 +23876,8 @@
23876 "@maplibre/maplibre-gl-style-spec": "^19.3.3",
23877 "@types/geojson": "^7946.0.13",
23878 "@types/mapbox__point-geometry": "^0.1.4",
23688 - "@types/mapbox__vector-tile": "^1.3.3",
23689 - "@types/pbf": "^3.0.4",
23879 + "@types/mapbox__vector-tile": "^1.3.4",
23880 + "@types/pbf": "^3.0.5",
23881 "@types/supercluster": "^7.1.3",
23882 "earcut": "^2.2.4",
23883 "geojson-vt": "^3.2.1",
@@ -24334,9 +24525,9 @@
24525 }
24526 },
24527 "nanoid": {
24337 - "version": "5.0.2",
24338 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.2.tgz",
24339 - "integrity": "sha512-2ustYUX1R2rL/Br5B/FMhi8d5/QzvkJ912rBYxskcpu0myTHzSZfTr1LAS2Sm7jxRUObRrSBFoyzwAhL49aVSg=="
24528 + "version": "5.0.4",
24529 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.4.tgz",
24530 + "integrity": "sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig=="
24531 },
24532 "natural-compare": {
24533 "version": "1.4.0",
@@ -24986,6 +25177,12 @@
25177 "resolved": "https://registry.npmjs.org/password-validator/-/password-validator-5.3.0.tgz",
25178 "integrity": "sha512-Q+bSEM5pjokZqzWGoQaoylkeWeH4+9uMYlVImiPD0EOJClQ2RPBhrJ5h0OjhMKtwOmu5rRcLaTZo5Gk9RBl0ig=="
25179 },
25180 + "path-browserify": {
25181 + "version": "1.0.1",
25182 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
25183 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
25184 + "dev": true
25185 + },
25186 "path-exists": {
25187 "version": "4.0.0",
25188 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -25177,19 +25374,19 @@
25374 }
25375 },
25376 "postcss": {
25180 - "version": "8.4.31",
25181 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
25182 - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
25377 + "version": "8.4.32",
25378 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
25379 + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
25380 "requires": {
25184 - "nanoid": "^3.3.6",
25381 + "nanoid": "^3.3.7",
25382 "picocolors": "^1.0.0",
25383 "source-map-js": "^1.0.2"
25384 },
25385 "dependencies": {
25386 "nanoid": {
25190 - "version": "3.3.6",
25191 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
25192 - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
25387 + "version": "3.3.7",
25388 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
25389 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
25390 }
25391 }
25392 },
@@ -25572,9 +25769,9 @@
25769 }
25770 },
25771 "punycode": {
25575 - "version": "2.3.0",
25576 - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
25577 - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
25772 + "version": "2.3.1",
25773 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
25774 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
25775 "dev": true
25776 },
25777 "qs": {
@@ -26616,9 +26813,9 @@
26813 "dev": true
26814 },
26815 "std-env": {
26619 - "version": "3.4.3",
26620 - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz",
26621 - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==",
26816 + "version": "3.6.0",
26817 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz",
26818 + "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==",
26819 "dev": true
26820 },
26821 "stream-combiner": {
@@ -26965,9 +27162,9 @@
27162 }
27163 },
27164 "tailwindcss": {
26968 - "version": "3.3.5",
26969 - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz",
26970 - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==",
27165 + "version": "3.3.6",
27166 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz",
27167 + "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==",
27168 "dev": true,
27169 "requires": {
27170 "@alloc/quick-lru": "^5.2.0",
@@ -27049,13 +27246,13 @@
27246 }
27247 },
27248 "taze": {
27052 - "version": "0.12.0",
27053 - "resolved": "https://registry.npmjs.org/taze/-/taze-0.12.0.tgz",
27054 - "integrity": "sha512-ftDYS/dNF0EkiEpZZweJxJKQRVFPBFFDz3OPezFloVtOHoMmVwLiMxLM9KYLnA+30D8IFdnGgS15WiIaz2bOfA==",
27249 + "version": "0.13.0",
27250 + "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.0.tgz",
27251 + "integrity": "sha512-o17Y6miF+44sDJ7haRHTqZefTlGOaBSdDHRwRcrt+s3WeGSPBUtPSG18XNwToIXN//eh58hyYnyDwTnpYLp4sg==",
27252 "dev": true,
27253 "requires": {
27057 - "@antfu/ni": "^0.21.8",
27058 - "@npmcli/config": "^8.0.1",
27254 + "@antfu/ni": "^0.21.12",
27255 + "@npmcli/config": "^8.0.2",
27256 "cli-progress": "^3.12.0",
27257 "deepmerge": "^4.3.1",
27258 "detect-indent": "^7.0.1",
@@ -27219,9 +27416,9 @@
27416 "dev": true
27417 },
27418 "tinypool": {
27222 - "version": "0.7.0",
27223 - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz",
27224 - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==",
27419 + "version": "0.8.1",
27420 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz",
27421 + "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==",
27422 "dev": true
27423 },
27424 "tinyqueue": {
@@ -27300,12 +27497,12 @@
27497 }
27498 },
27499 "tr46": {
27303 - "version": "4.1.1",
27304 - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
27305 - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
27500 + "version": "5.0.0",
27501 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
27502 + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
27503 "dev": true,
27504 "requires": {
27308 - "punycode": "^2.3.0"
27505 + "punycode": "^2.3.1"
27506 }
27507 },
27508 "treemate": {
@@ -27660,20 +27857,20 @@
27857 }
27858 },
27859 "unplugin-vue-components": {
27663 - "version": "0.25.2",
27664 - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz",
27665 - "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==",
27860 + "version": "0.26.0",
27861 + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz",
27862 + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==",
27863 "dev": true,
27864 "requires": {
27668 - "@antfu/utils": "^0.7.5",
27669 - "@rollup/pluginutils": "^5.0.2",
27865 + "@antfu/utils": "^0.7.6",
27866 + "@rollup/pluginutils": "^5.0.4",
27867 "chokidar": "^3.5.3",
27868 "debug": "^4.3.4",
27672 - "fast-glob": "^3.3.0",
27869 + "fast-glob": "^3.3.1",
27870 "local-pkg": "^0.4.3",
27674 - "magic-string": "^0.30.1",
27871 + "magic-string": "^0.30.3",
27872 "minimatch": "^9.0.3",
27676 - "resolve": "^1.22.2",
27873 + "resolve": "^1.22.4",
27874 "unplugin": "^1.4.0"
27875 },
27876 "dependencies": {
@@ -27832,14 +28029,14 @@
28029 }
28030 },
28031 "vite": {
27835 - "version": "5.0.0",
27836 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.0.tgz",
27837 - "integrity": "sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==",
28032 + "version": "5.0.6",
28033 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.6.tgz",
28034 + "integrity": "sha512-MD3joyAEBtV7QZPl2JVVUai6zHms3YOmLR+BpMzLlX2Yzjfcc4gTgNi09d/Rua3F4EtC8zdwPU8eQYyib4vVMQ==",
28035 "dev": true,
28036 "requires": {
28037 "esbuild": "0.18.10",
28038 "fsevents": "~2.3.3",
27842 - "postcss": "^8.4.31",
28039 + "postcss": "^8.4.32",
28040 "rollup": "^4.2.0"
28041 },
28042 "dependencies": {
@@ -27867,17 +28064,16 @@
28064 }
28065 },
28066 "vite-node": {
27870 - "version": "0.34.6",
27871 - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz",
27872 - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==",
28067 + "version": "1.0.1",
28068 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.1.tgz",
28069 + "integrity": "sha512-Y2Jnz4cr2azsOMMYuVPrQkp3KMnS/0WV8ezZjCy4hU7O5mUHCAVOnFmoEvs1nvix/4mYm74Len8bYRWZJMNP6g==",
28070 "dev": true,
28071 "requires": {
28072 "cac": "^6.7.14",
28073 "debug": "^4.3.4",
27877 - "mlly": "^1.4.0",
28074 "pathe": "^1.1.1",
28075 "picocolors": "^1.0.0",
27880 - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0"
28076 + "vite": "^5.0.0-beta.15 || ^5.0.0"
28077 }
28078 },
28079 "vite-svg-loader": {
@@ -27890,35 +28086,121 @@
28086 }
28087 },
28088 "vitest": {
27893 - "version": "0.34.6",
27894 - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz",
27895 - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==",
28089 + "version": "1.0.1",
28090 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.1.tgz",
28091 + "integrity": "sha512-MHsOj079S28hDsvdDvyD1pRj4dcS51EC5Vbe0xvOYX+WryP8soiK2dm8oULi+oA/8Xa/h6GoJEMTmcmBy5YM+Q==",
28092 "dev": true,
28093 "requires": {
27898 - "@types/chai": "^4.3.5",
27899 - "@types/chai-subset": "^1.3.3",
27900 - "@types/node": "*",
27901 - "@vitest/expect": "0.34.6",
27902 - "@vitest/runner": "0.34.6",
27903 - "@vitest/snapshot": "0.34.6",
27904 - "@vitest/spy": "0.34.6",
27905 - "@vitest/utils": "0.34.6",
27906 - "acorn": "^8.9.0",
27907 - "acorn-walk": "^8.2.0",
28094 + "@vitest/expect": "1.0.1",
28095 + "@vitest/runner": "1.0.1",
28096 + "@vitest/snapshot": "1.0.1",
28097 + "@vitest/spy": "1.0.1",
28098 + "@vitest/utils": "1.0.1",
28099 + "acorn-walk": "^8.3.0",
28100 "cac": "^6.7.14",
28101 "chai": "^4.3.10",
28102 "debug": "^4.3.4",
27911 - "local-pkg": "^0.4.3",
27912 - "magic-string": "^0.30.1",
28103 + "execa": "^8.0.1",
28104 + "local-pkg": "^0.5.0",
28105 + "magic-string": "^0.30.5",
28106 "pathe": "^1.1.1",
28107 "picocolors": "^1.0.0",
27915 - "std-env": "^3.3.3",
27916 - "strip-literal": "^1.0.1",
27917 - "tinybench": "^2.5.0",
27918 - "tinypool": "^0.7.0",
27919 - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0",
27920 - "vite-node": "0.34.6",
28108 + "std-env": "^3.5.0",
28109 + "strip-literal": "^1.3.0",
28110 + "tinybench": "^2.5.1",
28111 + "tinypool": "^0.8.1",
28112 + "vite": "^5.0.0-beta.19 || ^5.0.0",
28113 + "vite-node": "1.0.1",
28114 "why-is-node-running": "^2.2.2"
28115 + },
28116 + "dependencies": {
28117 + "execa": {
28118 + "version": "8.0.1",
28119 + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
28120 + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
28121 + "dev": true,
28122 + "requires": {
28123 + "cross-spawn": "^7.0.3",
28124 + "get-stream": "^8.0.1",
28125 + "human-signals": "^5.0.0",
28126 + "is-stream": "^3.0.0",
28127 + "merge-stream": "^2.0.0",
28128 + "npm-run-path": "^5.1.0",
28129 + "onetime": "^6.0.0",
28130 + "signal-exit": "^4.1.0",
28131 + "strip-final-newline": "^3.0.0"
28132 + }
28133 + },
28134 + "get-stream": {
28135 + "version": "8.0.1",
28136 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
28137 + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
28138 + "dev": true
28139 + },
28140 + "human-signals": {
28141 + "version": "5.0.0",
28142 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
28143 + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
28144 + "dev": true
28145 + },
28146 + "is-stream": {
28147 + "version": "3.0.0",
28148 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
28149 + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
28150 + "dev": true
28151 + },
28152 + "local-pkg": {
28153 + "version": "0.5.0",
28154 + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
28155 + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
28156 + "dev": true,
28157 + "requires": {
28158 + "mlly": "^1.4.2",
28159 + "pkg-types": "^1.0.3"
28160 + }
28161 + },
28162 + "mimic-fn": {
28163 + "version": "4.0.0",
28164 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
28165 + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
28166 + "dev": true
28167 + },
28168 + "npm-run-path": {
28169 + "version": "5.1.0",
28170 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
28171 + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
28172 + "dev": true,
28173 + "requires": {
28174 + "path-key": "^4.0.0"
28175 + }
28176 + },
28177 + "onetime": {
28178 + "version": "6.0.0",
28179 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
28180 + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
28181 + "dev": true,
28182 + "requires": {
28183 + "mimic-fn": "^4.0.0"
28184 + }
28185 + },
28186 + "path-key": {
28187 + "version": "4.0.0",
28188 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
28189 + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
28190 + "dev": true
28191 + },
28192 + "signal-exit": {
28193 + "version": "4.1.0",
28194 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
28195 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
28196 + "dev": true
28197 + },
28198 + "strip-final-newline": {
28199 + "version": "3.0.0",
28200 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
28201 + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
28202 + "dev": true
28203 + }
28204 }
28205 },
28206 "vooks": {
@@ -27940,15 +28222,15 @@
28222 }
28223 },
28224 "vue": {
27943 - "version": "3.3.8",
27944 - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz",
27945 - "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==",
28225 + "version": "3.3.10",
28226 + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.10.tgz",
28227 + "integrity": "sha512-zg6SIXZdTBwiqCw/1p+m04VyHjLfwtjwz8N57sPaBhEex31ND0RYECVOC1YrRwMRmxFf5T1dabl6SGUbMKKuVw==",
28228 "requires": {
27947 - "@vue/compiler-dom": "3.3.8",
27948 - "@vue/compiler-sfc": "3.3.8",
27949 - "@vue/runtime-dom": "3.3.8",
27950 - "@vue/server-renderer": "3.3.8",
27951 - "@vue/shared": "3.3.8"
28229 + "@vue/compiler-dom": "3.3.10",
28230 + "@vue/compiler-sfc": "3.3.10",
28231 + "@vue/runtime-dom": "3.3.10",
28232 + "@vue/server-renderer": "3.3.10",
28233 + "@vue/shared": "3.3.10"
28234 }
28235 },
28236 "vue-advanced-cropper": {
@@ -28029,12 +28311,12 @@
28311 }
28312 },
28313 "vue-i18n": {
28032 - "version": "9.7.0",
28033 - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.7.0.tgz",
28034 - "integrity": "sha512-8Z8kSz9U2juzuAf+6mjW1HTd5pIlYuFJZkC+HvYOglFdpzwc2rTUGjxKwN8xGdtGur1MFnyJ44TSr+TksJtY8A==",
28314 + "version": "9.8.0",
28315 + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.8.0.tgz",
28316 + "integrity": "sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==",
28317 "requires": {
28036 - "@intlify/core-base": "9.7.0",
28037 - "@intlify/shared": "9.7.0",
28318 + "@intlify/core-base": "9.8.0",
28319 + "@intlify/shared": "9.8.0",
28320 "@vue/devtools-api": "^6.5.0"
28321 }
28322 },
@@ -28075,13 +28357,13 @@
28357 }
28358 },
28359 "vue-tsc": {
28078 - "version": "1.8.22",
28079 - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.22.tgz",
28080 - "integrity": "sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==",
28360 + "version": "1.8.25",
28361 + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.25.tgz",
28362 + "integrity": "sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ==",
28363 "dev": true,
28364 "requires": {
28083 - "@volar/typescript": "~1.10.5",
28084 - "@vue/language-core": "1.8.22",
28365 + "@volar/typescript": "~1.11.1",
28366 + "@vue/language-core": "1.8.25",
28367 "semver": "^7.5.4"
28368 },
28369 "dependencies": {
@@ -28160,12 +28442,20 @@
28442 "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
28443 },
28444 "w3c-xmlserializer": {
28163 - "version": "4.0.0",
28164 - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
28165 - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
28445 + "version": "5.0.0",
28446 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
28447 + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
28448 "dev": true,
28449 "requires": {
28168 - "xml-name-validator": "^4.0.0"
28450 + "xml-name-validator": "^5.0.0"
28451 + },
28452 + "dependencies": {
28453 + "xml-name-validator": {
28454 + "version": "5.0.0",
28455 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
28456 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
28457 + "dev": true
28458 + }
28459 }
28460 },
28461 "wait-on": {
@@ -28206,27 +28496,27 @@
28496 "dev": true
28497 },
28498 "whatwg-encoding": {
28209 - "version": "2.0.0",
28210 - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
28211 - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
28499 + "version": "3.1.1",
28500 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
28501 + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
28502 "dev": true,
28503 "requires": {
28504 "iconv-lite": "0.6.3"
28505 }
28506 },
28507 "whatwg-mimetype": {
28218 - "version": "3.0.0",
28219 - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
28220 - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
28508 + "version": "4.0.0",
28509 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
28510 + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
28511 "dev": true
28512 },
28513 "whatwg-url": {
28224 - "version": "12.0.1",
28225 - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
28226 - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
28514 + "version": "14.0.0",
28515 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
28516 + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
28517 "dev": true,
28518 "requires": {
28229 - "tr46": "^4.1.1",
28519 + "tr46": "^5.0.0",
28520 "webidl-conversions": "^7.0.0"
28521 }
28522 },
@@ -28365,9 +28655,9 @@
28655 "dev": true
28656 },
28657 "ws": {
28368 - "version": "8.14.1",
28369 - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz",
28370 - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==",
28658 + "version": "8.14.2",
28659 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
28660 + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
28661 "dev": true,
28662 "requires": {}
28663 },
package.json
+47 -47
@@ -33,48 +33,48 @@
33 "@fontsource/jetbrains-mono": "^5.0.17",
34 "@fontsource/lexend": "^5.0.17",
35 "@fontsource/public-sans": "^5.0.15",
36 - "@fullcalendar/core": "^6.1.9",
37 - "@fullcalendar/daygrid": "^6.1.9",
38 - "@fullcalendar/interaction": "^6.1.9",
39 - "@fullcalendar/list": "^6.1.9",
40 - "@fullcalendar/timegrid": "^6.1.9",
41 - "@fullcalendar/vue3": "^6.1.9",
42 - "@milkdown/core": "^7.3.1",
43 - "@milkdown/ctx": "^7.3.1",
44 - "@milkdown/preset-commonmark": "^7.3.1",
45 - "@milkdown/prose": "^7.3.1",
46 - "@milkdown/theme-nord": "^7.3.1",
47 - "@milkdown/transformer": "^7.3.1",
48 - "@milkdown/vue": "^7.3.1",
36 + "@fullcalendar/core": "^6.1.10",
37 + "@fullcalendar/daygrid": "^6.1.10",
38 + "@fullcalendar/interaction": "^6.1.10",
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",
49 "@popperjs/core": "^2.11.8",
50 "@revolist/revogrid": "^4.7.0-next.4",
51 "@revolist/revogrid-column-numeral": "^1.0.2",
52 "@revolist/vue3-datagrid": "^3.6.17",
53 - "@tiptap/extension-character-count": "^2.1.12",
54 - "@tiptap/extension-highlight": "^2.1.12",
55 - "@tiptap/extension-link": "^2.1.12",
56 - "@tiptap/extension-task-item": "^2.1.12",
57 - "@tiptap/extension-task-list": "^2.1.12",
58 - "@tiptap/extension-text-align": "^2.1.12",
59 - "@tiptap/extension-underline": "^2.1.12",
60 - "@tiptap/pm": "^2.1.12",
61 - "@tiptap/starter-kit": "^2.1.12",
62 - "@tiptap/vue-3": "^2.1.12",
53 + "@tiptap/extension-character-count": "^2.1.13",
54 + "@tiptap/extension-highlight": "^2.1.13",
55 + "@tiptap/extension-link": "^2.1.13",
56 + "@tiptap/extension-task-item": "^2.1.13",
57 + "@tiptap/extension-task-list": "^2.1.13",
58 + "@tiptap/extension-text-align": "^2.1.13",
59 + "@tiptap/extension-underline": "^2.1.13",
60 + "@tiptap/pm": "^2.1.13",
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.6.1",
65 - "@vueuse/core": "^10.6.1",
66 - "apexcharts": "^3.44.0",
64 + "@vueuse/components": "^10.7.0",
65 + "@vueuse/core": "^10.7.0",
66 + "apexcharts": "^3.44.2",
67 "bytes": "^3.1.2",
68 - "chart.js": "^4.4.0",
68 + "chart.js": "^4.4.1",
69 "colord": "^2.9.3",
70 "dayjs": "^1.11.10",
71 "detect-touch-device": "^1.1.6",
72 "echarts": "^5.4.3",
73 "geojson": "^0.5.0",
74 "highlight.js": "^11.9.0",
75 - "jose": "^5.1.1",
75 + "jose": "^5.1.3",
76 "lodash": "^4.17.21",
77 - "maplibre-gl": "^3.6.1",
77 + "maplibre-gl": "^3.6.2",
78 "mitt": "^3.0.1",
79 "naive-ui": "^2.35.0",
80 "password-validator": "^5.3.0",
@@ -85,12 +85,12 @@
85 "shepherd.js": "^11.2.0",
86 "v-calendar": "^3.1.2",
87 "validator": "^13.11.0",
88 - "vue": "^3.3.8",
88 + "vue": "^3.3.10",
89 "vue-advanced-cropper": "^2.8.8",
90 "vue-cal": "^4.8.1",
91 "vue-chartjs": "^5.2.0",
92 "vue-highlight-words": "^3.0.1",
93 - "vue-i18n": "^9.7.0",
93 + "vue-i18n": "^9.8.0",
94 "vue-maplibre-gl": "^3.0.3",
95 "vue-router": "^4.2.5",
96 "vue-sjv": "^0.0.6",
@@ -104,47 +104,47 @@
104 "@css-render/vue3-ssr": "^0.15.12",
105 "@faker-js/faker": "^8.3.1",
106 "@iconify/vue": "^4.1.1",
107 - "@rushstack/eslint-patch": "^1.5.1",
107 + "@rushstack/eslint-patch": "^1.6.0",
108 "@tsconfig/node18": "^18.2.2",
109 "@types/bytes": "^3.1.4",
110 "@types/fs-extra": "^11.0.4",
111 "@types/inquirer": "^9.0.7",
112 "@types/jsdom": "^21.1.6",
113 "@types/lodash": "^4.14.202",
114 - "@types/node": "^20.9.3",
114 + "@types/node": "^20.10.3",
115 "@types/validator": "^13.11.7",
116 - "@vitejs/plugin-vue": "^4.5.0",
116 + "@vitejs/plugin-vue": "^4.5.1",
117 "@vitejs/plugin-vue-jsx": "^3.1.0",
118 "@vue-leaflet/vue-leaflet": "^0.10.1",
119 "@vue/eslint-config-prettier": "^8.0.0",
120 "@vue/eslint-config-typescript": "^12.0.0",
121 - "@vue/test-utils": "^2.4.2",
121 + "@vue/test-utils": "^2.4.3",
122 "@vue/tsconfig": "^0.4.0",
123 "autoprefixer": "^10.4.16",
124 - "cypress": "^13.5.1",
125 - "eslint": "^8.54.0",
124 + "cypress": "^13.6.1",
125 + "eslint": "^8.55.0",
126 "eslint-plugin-cypress": "^2.15.1",
127 - "eslint-plugin-vue": "^9.18.1",
128 - "fs-extra": "^11.1.1",
129 - "jsdom": "^22.1.0",
127 + "eslint-plugin-vue": "^9.19.2",
128 + "fs-extra": "^11.2.0",
129 + "jsdom": "^23.0.1",
130 "json5": "^2.2.3",
131 "leaflet": "^1.9.4",
132 "npm-run-all": "^4.1.5",
133 "picocolors": "^1.0.0",
134 - "postcss": "^8.4.31",
134 + "postcss": "^8.4.32",
135 "prettier": "^3.1.0",
136 "sass": "^1.69.5",
137 "start-server-and-test": "^2.0.3",
138 "tailwind-config-viewer": "^1.7.3",
139 - "tailwindcss": "^3.3.5",
140 - "taze": "^0.12.0",
139 + "tailwindcss": "^3.3.6",
140 + "taze": "^0.13.0",
141 "ts-node": "^10.9.1",
142 "typescript": "~5.3.2",
143 - "unplugin-vue-components": "^0.25.2",
144 - "vite": "^5.0.0",
143 + "unplugin-vue-components": "^0.26.0",
144 + "vite": "^5.0.6",
145 "vite-svg-loader": "^5.1.0",
146 - "vitest": "^0.34.6",
147 - "vue-tsc": "^1.8.22"
146 + "vitest": "^1.0.1",
147 + "vue-tsc": "^1.8.25"
148 },
149 "engines": {
150 "node": ">=16.0.0 <20.5.0"
src/api/healthchecks.ts new
+12
@@ -0,0 +1,12 @@
1 +import { type FlaskBaseResponse } from "@/types/flask.d"
2 +import { HttpClient } from "./httpClient"
3 +import type { InfluxDBAlert } from "@/types/healthchecks.d"
4 +
5 +export default {
6 + getHealthchecks() {
7 + return HttpClient.get<FlaskBaseResponse & { alerts: InfluxDBAlert[] }>(`/influxdb/alerts`)
8 + }
9 +
10 + // index health : Api.indices.getClusterHealth()
11 + // graylog health : Api.graylog.getMetrics()
12 +}
src/api/index.ts
+3 -1
@@ -6,6 +6,7 @@ import connectors from "./connectors"
6 import graylog from "./graylog"
7 import indices from "./indices"
8 import soc from "./soc"
9 +import healthchecks from "./healthchecks"
10
11 export default {
12 agents,
@@ -15,5 +16,6 @@ export default {
16 connectors,
17 graylog,
18 indices,
18 - soc
19 + soc,
20 + healthchecks
21 }
src/assets/scss/apexchart-override.scss
+4
@@ -7,3 +7,7 @@
7 }
8 }
9 }
10 +
11 +.apexcharts-tooltip {
12 + backdrop-filter: blur(6px);
13 +}
src/assets/scss/helpers.scss
+4
@@ -42,3 +42,7 @@
42 .text-secondary-color {
43 color: var(--fg-secondary-color);
44 }
45 +
46 +.text-warning-color {
47 + color: var(--warning-color);
48 +}
src/components/common/Notifications.vue
+76 -49
@@ -4,21 +4,21 @@
4 class="item flex"
5 v-for="item of listSanitized"
6 :key="item.id"
7 - @click="item.action ? item.action() : () => {}"
8 - :class="{ pointer: !!item.action }"
7 + @click="item.action ? preformAction(item.id, item.action) : () => {}"
8 + :class="[{ pointer: !!item.action }, item.type]"
9 >
10 - <div class="icon-box" :class="item.type">
11 - <Icon :name="MessageIcon" :size="21" v-if="item.type === 'message'"></Icon>
12 - <Icon :name="CalendarIcon" :size="21" v-else-if="item.type === 'reminder'"></Icon>
13 - <Icon :name="NewsIcon" :size="21" v-else-if="item.type === 'news'"></Icon>
14 - <Icon :name="AlertIcon" :size="21" v-else-if="item.type === 'alert'"></Icon>
10 + <div class="icon-box">
11 + <Icon :name="AlertIcon" :size="21" v-if="item.category === 'alert'"></Icon>
12 </div>
13 <div class="content grow">
14 <div class="title">{{ item.title }}</div>
15 <div class="description">{{ item.description }}</div>
19 - <div class="date">{{ item.date }}</div>
16 + <div class="footer flex justify-between items-center">
17 + <div class="date">{{ formatDatetime(item.date) }}</div>
18 + <div class="action-text" v-if="!!item.action">{{ item.actionTitle || "Details" }}</div>
19 + </div>
20 </div>
21 - <div class="read-badge" v-if="!item.read"></div>
21 + <div class="read-badge" v-if="!item.read" @click.stop="setRead(item.id)"></div>
22 </div>
23 <slot name="last"></slot>
24 </n-scrollbar>
@@ -31,9 +31,6 @@ import { useNotifications } from "@/composables/useNotifications"
31 import { computed } from "vue"
32 import _take from "lodash/take"
33
34 -const MessageIcon = "carbon:email"
35 -const CalendarIcon = "carbon:calendar"
36 -const NewsIcon = "fluent:news-24-regular"
34 const AlertIcon = "mdi:alert-outline"
35
36 const props = defineProps<{
@@ -48,6 +45,19 @@ const listSanitized = computed(() => {
45 }
46 return list.value
47 })
48 +
49 +function preformAction(id: string | number, action: () => void) {
50 + action()
51 + setRead(id)
52 +}
53 +
54 +function setRead(id: string | number) {
55 + useNotifications().setRead(id)
56 +}
57 +
58 +function formatDatetime(date: Date | string) {
59 + return useNotifications().formatDatetime(date)
60 +}
61 </script>
62
63 <style lang="scss" scoped>
@@ -65,38 +75,11 @@ const listSanitized = computed(() => {
75 display: flex;
76 justify-content: center;
77 align-items: center;
68 - background-color: var(--primary-005-color);
69 - color: var(--primary-color);
78 border-radius: 50%;
79 width: 42px;
80 height: 42px;
81 margin-top: 2px;
82 }
75 -
76 - &.message {
77 - .n-icon {
78 - background-color: var(--secondary1-opacity-010-color);
79 - color: var(--secondary1-color);
80 - }
81 - }
82 - &.reminder {
83 - .n-icon {
84 - background-color: var(--secondary2-opacity-010-color);
85 - color: var(--secondary2-color);
86 - }
87 - }
88 - &.news {
89 - .n-icon {
90 - background-color: var(--secondary3-opacity-010-color);
91 - color: var(--secondary3-color);
92 - }
93 - }
94 - &.alert {
95 - .n-icon {
96 - background-color: var(--secondary4-opacity-010-color);
97 - color: var(--secondary4-color);
98 - }
99 - }
83 }
84 .content {
85 max-width: 250px;
@@ -106,22 +89,66 @@ const listSanitized = computed(() => {
89 .title {
90 font-weight: bold;
91 }
109 - .date {
110 - font-size: 12px;
92 +
93 + .footer {
94 margin-top: 6px;
112 - opacity: 0.5;
95 +
96 + .date {
97 + font-size: 12px;
98 + opacity: 0.5;
99 + }
100 + .action-text {
101 + font-size: 12px;
102 + }
103 }
104 }
105
106 .read-badge {
107 position: absolute;
118 - top: 0;
119 - left: 0;
120 - width: 0;
121 - height: 0;
122 - border-style: solid;
123 - border-width: 20px 20px 0 0;
124 - border-color: var(--primary-050-color) transparent transparent transparent;
108 + top: 14px;
109 + right: 14px;
110 + width: 10px;
111 + height: 10px;
112 + border-radius: 50%;
113 + background-color: var(--primary-color);
114 + cursor: pointer;
115 + }
116 +
117 + &.success {
118 + .n-icon {
119 + background-color: var(--primary-005-color);
120 + color: var(--success-color);
121 + }
122 + .action-text {
123 + color: var(--success-color);
124 + }
125 + }
126 + &.info {
127 + .n-icon {
128 + background-color: var(--secondary1-opacity-010-color);
129 + color: var(--info-color);
130 + }
131 + .action-text {
132 + color: var(--info-color);
133 + }
134 + }
135 + &.warning {
136 + .n-icon {
137 + background-color: var(--secondary3-opacity-010-color);
138 + color: var(--warning-color);
139 + }
140 + .action-text {
141 + color: var(--warning-color);
142 + }
143 + }
144 + &.error {
145 + .n-icon {
146 + background-color: var(--secondary4-opacity-010-color);
147 + color: var(--error-color);
148 + }
149 + .action-text {
150 + color: var(--error-color);
151 + }
152 }
153
154 &.pointer {
src/components/graylog/Metrics/UncommittedEntries.vue
+113 -30
@@ -1,65 +1,144 @@
1 <template>
2 - <div class="uncommitted-entries-wrap">
3 - <div class="line"></div>
2 + <div class="uncommitted-entries-wrap flex flex-col gap-3">
3 <div class="uncommitted-entries">
5 - <div class="label flex items-center gap-3">
6 - <Icon :name="DangerIcon" v-if="isWarning"></Icon>
7 - <span>Uncommitted Journal Entries</span>
4 + <div class="chart grow">
5 + <div class="label flex items-center gap-3">
6 + <Icon :name="DangerIcon" v-if="isWarning"></Icon>
7 + <span>Uncommitted Journal Entries</span>
8 + </div>
9 + <apexchart height="70" :options="options" :series="series" ref="chart"></apexchart>
10 </div>
9 - <div class="value" :class="{ warning: isWarning }">
11 + <div class="value flex flex-col justify-center" :class="{ warning: isWarning }">
12 <span>{{ value }}</span>
13 </div>
14 </div>
15 + <div class="footer">
16 + <n-button type="primary" ghost icon-placement="right" @click="gotoMessages()">
17 + <template #icon>
18 + <Icon :name="LinkIcon" :size="14"></Icon>
19 + </template>
20 + See messages
21 + </n-button>
22 + </div>
23 </div>
24 </template>
25
26 <script setup lang="ts">
17 -// TODO: add a realtime chart
18 -// TODO: add goto grylog message page button
19 -
27 import Icon from "@/components/common/Icon.vue"
21 -import { computed, toRefs } from "vue"
28 +import { NButton } from "naive-ui"
29 +import { computed, ref, toRefs } from "vue"
30 +import { useRouter } from "vue-router"
31 +import { useThemeStore } from "@/stores/theme"
32 +import dayjs from "@/utils/dayjs"
33 +import "@/assets/scss/apexchart-override.scss"
34 +import { watch } from "vue"
35 +import { usHealthcheckStore } from "@/stores/healthcheck"
36 +
37 +const UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD = usHealthcheckStore().uncommittedJournalEntriesThreshold
38
39 const props = defineProps<{
40 value: number
41 }>()
42 +const router = useRouter()
43 const { value } = toRefs(props)
44
45 +const LinkIcon = "carbon:launch"
46 const DangerIcon = "majesticons:exclamation-line"
47
48 +const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
49 +const isThemeDark = computed(() => useThemeStore().isThemeDark)
50 +
51 const isWarning = computed<boolean>(() => {
31 - return value.value > 50000
52 + return value.value > UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD
53 +})
54 +
55 +function gotoMessages() {
56 + router.push({ name: "Graylog-Management" })
57 +}
58 +
59 +const series = ref<{ name: string; data: any }[]>([
60 + {
61 + name: "Entries",
62 + data: []
63 + }
64 +])
65 +
66 +const serieLength = computed<number>(() => series.value[0].data.length || 0)
67 +
68 +function getOptions() {
69 + return {
70 + chart: {
71 + height: 70,
72 + type: "area",
73 + sparkline: {
74 + enabled: true
75 + },
76 + animations: {
77 + enabled: serieLength.value < 100,
78 + easing: "linear",
79 + dynamicAnimation: {
80 + speed: 200
81 + }
82 + },
83 + toolbar: {
84 + show: false
85 + },
86 + zoom: {
87 + enabled: false
88 + }
89 + },
90 + dataLabels: {
91 + enabled: false
92 + },
93 + stroke: {
94 + curve: "straight",
95 + width: 3
96 + },
97 + xaxis: {
98 + type: "datetime"
99 + },
100 + colors: [style.value["--primary-color"]],
101 + tooltip: {
102 + x: {
103 + formatter: (time: number) => {
104 + return dayjs(time).format("HH:mm:ss")
105 + }
106 + },
107 + style: {
108 + fontFamily: style.value["--font-family-mono"]
109 + },
110 + theme: isThemeDark.value ? "dark" : "light"
111 + }
112 + }
113 +}
114 +
115 +const options = ref(getOptions())
116 +
117 +watch(value, val => {
118 + if (serieLength.value > 100) {
119 + series.value[0].data.shift()
120 +
121 + if (options.value.chart.animations.enabled) {
122 + options.value = getOptions()
123 + }
124 + }
125 + series.value[0].data.push([new Date(), val])
126 +})
127 +
128 +watch(isThemeDark, () => {
129 + options.value = getOptions()
130 })
131 </script>
132
133 <style lang="scss" scoped>
134 .uncommitted-entries-wrap {
135 width: 100%;
38 - position: relative;
39 - .line {
40 - width: 100%;
41 - height: 1px;
42 - background: var(--divider-010-color);
43 - background: linear-gradient(
44 - 90deg,
45 - transparent 0%,
46 - var(--divider-010-color) 5%,
47 - var(--divider-010-color) 95%,
48 - transparent 100%
49 - );
50 - position: absolute;
51 - top: 50%;
52 - }
136
137 .uncommitted-entries {
55 - position: relative;
138 background-color: var(--bg-color);
139 display: flex;
140 border-radius: var(--border-radius);
141 border: var(--border-small-050);
60 - overflow: hidden;
61 - max-width: 400px;
62 - margin: 0 auto;
142
143 .label {
144 padding: 18px 22px;
@@ -76,6 +155,10 @@ const isWarning = computed<boolean>(() => {
155 background-color: var(--bg-secondary-color);
156 font-size: 20px;
157 font-family: var(--font-family-mono);
158 + min-width: 80px;
159 + text-align: center;
160 + border-top-right-radius: var(--border-radius);
161 + border-bottom-right-radius: var(--border-radius);
162
163 &.warning {
164 color: var(--secondary3-color);
src/components/healthcheck/HealthcheckItem.vue new
+113
@@ -0,0 +1,113 @@
1 +<template>
2 + <div class="healthcheck-item flex flex-col gap-2 px-5 py-3" :class="`status-${alert.level}`">
3 + <div class="header-box flex justify-between">
4 + <div class="id">
5 + <span>#{{ alert.checkID }}</span>
6 + </div>
7 + <div class="time">
8 + {{ formatDate(alert.time) }}
9 + </div>
10 + </div>
11 + <div class="main-box flex justify-between gap-4">
12 + <div class="content flex gap-3 items-center">
13 + <div class="level mt-1">
14 + <Icon :name="WarningIcon" :size="20" v-if="alert.level === InfluxDBAlertLevel.Crit" />
15 + <Icon :name="OKIcon" :size="20" v-else />
16 + </div>
17 + <div class="info grow">
18 + <div class="message" v-html="message"></div>
19 + </div>
20 + </div>
21 + </div>
22 + <div class="footer-box flex justify-end items-center gap-3">
23 + <div class="time">{{ formatDate(alert.time) }}</div>
24 + </div>
25 + </div>
26 +</template>
27 +
28 +<script setup lang="ts">
29 +import Icon from "@/components/common/Icon.vue"
30 +import "@/assets/scss/vuesjv-override.scss"
31 +import { useSettingsStore } from "@/stores/settings"
32 +import dayjs from "@/utils/dayjs"
33 +import { InfluxDBAlertLevel, type InfluxDBAlert } from "@/types/healthchecks.d"
34 +import { computed } from "vue"
35 +
36 +const { alert } = defineProps<{ alert: InfluxDBAlert }>()
37 +
38 +const WarningIcon = "carbon:warning-alt-filled"
39 +const OKIcon = "carbon:checkmark-filled"
40 +
41 +const message = computed(() => {
42 + return alert.message.replace(/\n/gim, " <span class='mx-1'>•</span> ")
43 +})
44 +
45 +const dFormats = useSettingsStore().dateFormat
46 +
47 +function formatDate(timestamp: string | number | Date, utc: boolean = true): string {
48 + return dayjs(timestamp).utc(utc).format(dFormats.datetime)
49 +}
50 +</script>
51 +
52 +<style lang="scss" scoped>
53 +.healthcheck-item {
54 + border-radius: var(--border-radius);
55 + background-color: var(--bg-color);
56 + border: var(--border-small-050);
57 +
58 + .header-box {
59 + font-family: var(--font-family-mono);
60 + font-size: 13px;
61 + .id {
62 + word-break: break-word;
63 + color: var(--fg-secondary-color);
64 + line-height: 1.2;
65 + }
66 +
67 + .time {
68 + color: var(--fg-secondary-color);
69 + }
70 + }
71 +
72 + .main-box {
73 + word-break: break-word;
74 +
75 + .level {
76 + color: var(--success-color);
77 + }
78 + }
79 +
80 + .footer-box {
81 + font-family: var(--font-family-mono);
82 + font-size: 13px;
83 + margin-top: 10px;
84 + display: none;
85 +
86 + .time {
87 + text-align: right;
88 + color: var(--fg-secondary-color);
89 + }
90 + }
91 +
92 + &.status- {
93 + &crit {
94 + border-color: var(--warning-color);
95 +
96 + .level {
97 + color: var(--warning-color);
98 + }
99 + }
100 + }
101 +
102 + @container (max-width: 450px) {
103 + .header-box {
104 + .time {
105 + display: none;
106 + }
107 + }
108 + .footer-box {
109 + display: flex;
110 + }
111 + }
112 +}
113 +</style>
src/components/healthcheck/HealthcheckList.vue new
+168
@@ -0,0 +1,168 @@
1 +<template>
2 + <div class="healthcheck-list">
3 + <div class="header flex items-center justify-end gap-2" ref="header">
4 + <div class="info grow flex gap-2">
5 + <n-popover overlap placement="bottom-start">
6 + <template #trigger>
7 + <div class="bg-color border-radius">
8 + <n-button size="small" class="!cursor-help">
9 + <template #icon>
10 + <Icon :name="InfoIcon"></Icon>
11 + </template>
12 + </n-button>
13 + </div>
14 + </template>
15 + <div class="flex flex-col gap-2">
16 + <div class="box">
17 + Total :
18 + <code>{{ total }}</code>
19 + </div>
20 + <div class="box text-warning-color">
21 + Critical :
22 + <code>{{ criticalTotal }}</code>
23 + </div>
24 + </div>
25 + </n-popover>
26 + </div>
27 + <n-pagination
28 + v-model:page="currentPage"
29 + v-model:page-size="pageSize"
30 + :page-slot="pageSlot"
31 + :show-size-picker="showSizePicker"
32 + :page-sizes="pageSizes"
33 + :item-count="total"
34 + :simple="simpleMode"
35 + />
36 + </div>
37 + <n-spin :show="loading">
38 + <div class="list my-3">
39 + <template v-if="healthcheckList.length">
40 + <HealthcheckItem
41 + v-for="alert of itemsPaginated"
42 + :key="alert.checkID + alert.time"
43 + :alert="alert"
44 + class="mb-2"
45 + />
46 + </template>
47 + <template v-else>
48 + <n-empty description="No items found" class="justify-center h-48" v-if="!loading" />
49 + </template>
50 + </div>
51 + </n-spin>
52 + <div class="footer flex justify-end">
53 + <n-pagination
54 + v-model:page="currentPage"
55 + :page-size="pageSize"
56 + :item-count="total"
57 + :page-slot="6"
58 + v-if="itemsPaginated.length > 3"
59 + />
60 + </div>
61 + </div>
62 +</template>
63 +
64 +<script setup lang="ts">
65 +import { ref, onBeforeMount, computed } from "vue"
66 +import { useMessage, NSpin, NPopover, NButton, NEmpty, NPagination } from "naive-ui"
67 +import Api from "@/api"
68 +import _orderBy from "lodash/orderBy"
69 +import Icon from "@/components/common/Icon.vue"
70 +import { useResizeObserver } from "@vueuse/core"
71 +import HealthcheckItem from "./HealthcheckItem.vue"
72 +import { InfluxDBAlertLevel, type InfluxDBAlert } from "@/types/healthchecks.d"
73 +
74 +const message = useMessage()
75 +const loading = ref(false)
76 +const healthcheckList = ref<InfluxDBAlert[]>([])
77 +
78 +const pageSize = ref(25)
79 +const currentPage = ref(1)
80 +const simpleMode = ref(false)
81 +const showSizePicker = ref(true)
82 +const pageSizes = [10, 25, 50, 100]
83 +const header = ref()
84 +const pageSlot = ref(8)
85 +
86 +const itemsPaginated = computed(() => {
87 + const from = (currentPage.value - 1) * pageSize.value
88 + const to = currentPage.value * pageSize.value
89 +
90 + const list = _orderBy(healthcheckList.value, ["level", "time"], ["asc", "desc"])
91 +
92 + return list.slice(from, to)
93 +})
94 +
95 +const InfoIcon = "carbon:information"
96 +
97 +const total = computed<number>(() => {
98 + return healthcheckList.value.length || 0
99 +})
100 +
101 +const criticalTotal = computed<number>(() => {
102 + return healthcheckList.value.filter(o => o.level === InfluxDBAlertLevel.Crit).length || 0
103 +})
104 +
105 +function getData() {
106 + loading.value = true
107 +
108 + Api.healthchecks
109 + .getHealthchecks()
110 + .then(res => {
111 + if (res.data.success) {
112 + healthcheckList.value = res.data.alerts || []
113 + } else {
114 + message.warning(res.data?.message || "An error occurred. Please try again later.")
115 + }
116 + })
117 + .catch(err => {
118 + healthcheckList.value = []
119 +
120 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
121 + })
122 + .finally(() => {
123 + loading.value = false
124 + })
125 +}
126 +
127 +useResizeObserver(header, entries => {
128 + const entry = entries[0]
129 + const { width } = entry.contentRect
130 +
131 + pageSlot.value = width < 650 ? 5 : 8
132 + simpleMode.value = width < 450
133 +})
134 +
135 +onBeforeMount(() => {
136 + getData()
137 +})
138 +</script>
139 +
140 +<style lang="scss" scoped>
141 +.healthcheck-list {
142 + .list {
143 + container-type: inline-size;
144 + min-height: 200px;
145 +
146 + .healthcheck-item {
147 + animation: healthcheck-item-fade 0.3s forwards;
148 + opacity: 0;
149 +
150 + @for $i from 0 through 30 {
151 + &:nth-child(#{$i}) {
152 + animation-delay: $i * 0.05s;
153 + }
154 + }
155 +
156 + @keyframes healthcheck-item-fade {
157 + from {
158 + opacity: 0;
159 + transform: translateY(10px);
160 + }
161 + to {
162 + opacity: 1;
163 + }
164 + }
165 + }
166 + }
167 +}
168 +</style>
src/components/indices/UnhealthyIndices.vue
+20 -18
@@ -8,24 +8,26 @@
8 </template>
9 <n-spin :show="loading">
10 <div class="info">
11 - <template v-if="unhealthyIndices && unhealthyIndices.length">
12 - <div
13 - v-for="item of unhealthyIndices"
14 - :key="item.index"
15 - class="item"
16 - :class="item.health"
17 - @click="emit('click', item)"
18 - title="Click for details"
19 - >
20 - <IndexCard :index="item" />
21 - </div>
22 - </template>
23 - <n-empty description="No Unhealthy Indices found" v-else>
24 - <template #icon>
25 - <Icon :name="ShieldIcon"></Icon>
11 + <n-scrollbar style="max-height: 500px" trigger="none">
12 + <template v-if="unhealthyIndices && unhealthyIndices.length">
13 + <div
14 + v-for="item of unhealthyIndices"
15 + :key="item.index"
16 + class="item"
17 + :class="item.health"
18 + @click="emit('click', item)"
19 + title="Click for details"
20 + >
21 + <IndexCard :index="item" />
22 + </div>
23 </template>
27 - <template #extra>Great, all indices are healthy!</template>
28 - </n-empty>
24 + <n-empty description="No Unhealthy Indices found" v-else>
25 + <template #icon>
26 + <Icon :name="ShieldIcon"></Icon>
27 + </template>
28 + <template #extra>Great, all indices are healthy!</template>
29 + </n-empty>
30 + </n-scrollbar>
31 </div>
32 </n-spin>
33 </n-card>
@@ -35,7 +37,7 @@
37 import { computed, toRefs } from "vue"
38 import { type IndexStats, IndexHealth } from "@/types/indices.d"
39 import IndexCard from "@/components/indices/IndexCard.vue"
38 -import { NSpin, NCard, NEmpty } from "naive-ui"
40 +import { NSpin, NCard, NEmpty, NScrollbar } from "naive-ui"
41 import Icon from "@/components/common/Icon.vue"
42
43 const ShieldIcon = "fluent:shield-task-20-regular"
src/composables/useGlobalActions.ts
+10
@@ -1,19 +1,29 @@
1 import { type MessageOptions } from "naive-ui"
2 import type { MessageApiInjection, MessageReactive } from "naive-ui/es/message/src/MessageProvider"
3 +import type { NotificationApiInjection, NotificationReactive } from "naive-ui/es/notification/src/NotificationProvider"
4 +import type { NotificationOptions } from "naive-ui/es/notification/src/NotificationEnvironment"
5 +
6 +export type NotificationObject = NotificationOptions
7
8 interface InitPayload {
9 message: MessageApiInjection
10 + notification: NotificationApiInjection
11 }
12
13 let message: MessageApiInjection | null = null
14 +let notification: NotificationApiInjection | null = null
15
16 export function useGlobalActions() {
17 return {
18 init: (payload: InitPayload): void => {
19 message = payload.message
20 + notification = payload.notification
21 },
22 message: (content: string, options?: MessageOptions): MessageReactive | undefined => {
23 return message?.create(content, options || { type: "info" })
24 + },
25 + notification: (options: NotificationOptions): NotificationReactive | undefined => {
26 + return notification?.create(options)
27 }
28 }
29 }
src/composables/useHealthchecksNotify.ts new
+103
@@ -0,0 +1,103 @@
1 +import { computed, watch } from "vue"
2 +import { usHealthcheckStore } from "@/stores/healthcheck"
3 +import { useNotifications, type Notification } from "./useNotifications"
4 +import { IndexHealth } from "@/types/indices.d"
5 +import { useRouter } from "vue-router"
6 +import _capitalize from "lodash/capitalize"
7 +
8 +export function useHealthchecksNotify() {
9 + return {
10 + init: () => {
11 + const router = useRouter()
12 +
13 + const uncommittedJournalEntriesThreshold = usHealthcheckStore().uncommittedJournalEntriesThreshold
14 + const uncommittedJournalEntries = computed(() => usHealthcheckStore().uncommittedJournalEntries)
15 + const clusterName = computed(() => usHealthcheckStore().clusterName)
16 + const clusterStatus = computed(() => usHealthcheckStore().clusterStatus)
17 + const alerts = computed(() => usHealthcheckStore().alerts)
18 +
19 + usHealthcheckStore().start()
20 +
21 + watch(uncommittedJournalEntries, (val, old) => {
22 + if (val != old) {
23 + const obj: Notification = {
24 + id: "uncommittedJournalEntries",
25 + category: "alert",
26 + type: "error",
27 + title: "Error check",
28 + description: "Uncommitted Journal Entries",
29 + read: false,
30 + date: new Date(),
31 + action() {
32 + router.push({ name: "Graylog-Metrics" })
33 + },
34 + actionTitle: "See Graylog Metrics"
35 + }
36 +
37 + if (val === null) {
38 + useNotifications().prepend(obj)
39 + } else if (val >= uncommittedJournalEntriesThreshold) {
40 + obj.type = "warning"
41 + obj.title = "Uncommitted Journal Entries"
42 + obj.description = `Value ${val} (over ${uncommittedJournalEntriesThreshold})`
43 + useNotifications().prepend(obj)
44 + }
45 + }
46 + })
47 +
48 + watch(clusterStatus, (val, old) => {
49 + if (val != old) {
50 + const obj: Notification = {
51 + id: "clusterHealth",
52 + category: "alert",
53 + type: "error",
54 + title: "Error check",
55 + description: "Cluster Health",
56 + read: false,
57 + date: new Date(),
58 + action() {
59 + router.push({ name: "Indices" })
60 + },
61 + actionTitle: "See Cluster"
62 + }
63 +
64 + if (val === null) {
65 + useNotifications().prepend(obj)
66 + } else if (val !== IndexHealth.GREEN) {
67 + obj.type = val === IndexHealth.YELLOW ? "warning" : "error"
68 + obj.title = "Cluster Health"
69 + obj.description = `${_capitalize(clusterName.value || "Cluster")} is ${val.toUpperCase()}`
70 + useNotifications().prepend(obj)
71 + }
72 + }
73 + })
74 +
75 + watch(alerts, (val, old) => {
76 + if (val?.length !== old?.length) {
77 + const obj: Notification = {
78 + id: "influxDBAlert",
79 + category: "alert",
80 + type: "error",
81 + title: "Error check",
82 + description: "Influx Alert",
83 + read: false,
84 + date: new Date(),
85 + action() {
86 + router.push({ name: "Healthcheck" })
87 + },
88 + actionTitle: "See Healthcheck"
89 + }
90 +
91 + if (val === null) {
92 + useNotifications().prepend(obj)
93 + } else if (val.length) {
94 + obj.type = "warning"
95 + obj.title = "Influx Alert"
96 + obj.description = `${val.length} Critical ${val.length > 1 ? "issues" : "issue"}`
97 + useNotifications().prepend(obj)
98 + }
99 + }
100 + })
101 + }
102 + }
103 +}
src/composables/useNotifications.ts
+63 -93
@@ -1,118 +1,88 @@
1 -import { computed, ref } from "vue"
1 +import { computed, h } from "vue"
2 import dayjs from "@/utils/dayjs"
3 +import { NButton } from "naive-ui"
4 +import _uniqBy from "lodash/uniqBy"
5 +import { useGlobalActions, type NotificationObject } from "./useGlobalActions"
6 +import { useSettingsStore } from "@/stores/settings"
7 +import { useStorage } from "@vueuse/core"
8
4 -type NotificationType = "message" | "reminder" | "alert" | "news" | string
5 -interface Notification {
6 - id: number
9 +export type NotificationCategory = "alert"
10 +export type NotificationType = "success" | "info" | "warning" | "error" | "default" | undefined
11 +export interface Notification {
12 + id: number | string
13 + category: NotificationCategory
14 type: NotificationType
15 title: string
16 description: string
17 read: boolean
11 - date: string
18 + date: string | Date
19 action?: () => void
20 + actionTitle?: string
21 }
22
15 -const items: Notification[] = [
16 - {
17 - id: 1,
18 - type: "message",
19 - title: "New Email",
20 - description: "Important document to read",
21 - read: false,
22 - date: "Today"
23 - },
24 - {
25 - id: 2,
26 - type: "reminder",
27 - title: "Appointment",
28 - description: "Meeting with client at 3:00 PM",
29 - read: false,
30 - date: "Yesterday"
31 - },
32 - {
33 - id: 9,
34 - type: "alert",
35 - title: "Alert",
36 - description: "Limited-time super offer on desired product",
37 - read: true,
38 - date: "Yesterday"
39 - },
40 - {
41 - id: 5,
42 - type: "news",
43 - title: "News",
44 - description: "Networking event in your city",
45 - read: false,
46 - date: dayjs().subtract(3, "d").format("D MMM")
47 - },
48 - {
49 - id: 3,
50 - type: "reminder",
51 - title: "Reminder",
52 - description: "Overdue bill payment",
53 - read: true,
54 - date: dayjs().subtract(7, "d").format("D MMM")
55 - },
56 - {
57 - id: 4,
58 - type: "reminder",
59 - title: "Deadline",
60 - description: "Submit report by tomorrow",
61 - read: true,
62 - date: dayjs().subtract(2, "d").format("D MMM")
63 - },
64 - {
65 - id: 6,
66 - type: "message",
67 - title: "Message",
68 - description: "New comment on your post",
69 - read: false,
70 - date: dayjs().subtract(4, "d").format("D MMM")
71 - },
72 - {
73 - id: 7,
74 - type: "reminder",
75 - title: "Reminder",
76 - description: "Complete purchase in your online cart",
77 - read: false,
78 - date: dayjs().subtract(5, "d").format("D MMM")
79 - },
80 - {
81 - id: 8,
82 - type: "reminder",
83 - title: "Invitation",
84 - description: "Friend's birthday party",
85 - read: true,
86 - date: dayjs().subtract(6, "d").format("D MMM")
87 - }
88 -]
23 +const list = useStorage<Notification[]>("notifications-list", [], localStorage)
24
90 -const list = ref<Notification[]>([])
25 +export function useNotifications() {
26 + const hasNotifications = computed(() => list.value.filter(o => !o.read).length !== 0)
27 + const dFormats = useSettingsStore().dateFormat
28
92 -for (let i = 0; i < 30; i++) {
93 - const item = items[i % items.length]
94 - item.id = i
29 + function formatDatetime(date: Date | string) {
30 + const datejs = dayjs(date)
31 + if (!datejs.isValid()) return date
32
96 - if (i > 2) {
97 - item.date = dayjs().subtract(i, "d").format("D MMM")
33 + if (dayjs().isSame(datejs, "day")) {
34 + return datejs.format(dFormats.time)
35 + }
36 + return datejs.format("D MMM")
37 }
38
100 - list.value.push({ ...item })
101 -}
102 -
103 -export function useNotifications() {
104 - const hasNotifications = computed(() => list.value.filter(o => !o.read).length !== 0)
105 -
39 return {
40 list,
41 hasNotifications,
42 + formatDatetime,
43 + setRead: (id: string | number) => {
44 + const item = list.value.find(o => o.id === id)
45 + if (item) {
46 + item.read = true
47 + }
48 + },
49 setAllRead: () => {
50 for (const item of list.value) {
51 item.read = true
52 }
53 },
114 - prepend: (newItem: Notification) => {
115 - list.value = [newItem, ...list.value]
54 + prepend: (newItem: Notification, sendNotify: boolean = true) => {
55 + if (sendNotify) {
56 + const notify: NotificationObject = {
57 + title: newItem.title,
58 + content: newItem.description,
59 + type: newItem.type,
60 + meta: formatDatetime(newItem.date).toString(),
61 + action: undefined,
62 + duration: 3000,
63 + keepAliveOnHover: true
64 + }
65 +
66 + if (newItem.action) {
67 + // @ts-ignore
68 + notify.action = () =>
69 + h(
70 + NButton,
71 + {
72 + text: true,
73 + type: newItem.type,
74 + onClick: newItem.action
75 + },
76 + {
77 + default: () => newItem.actionTitle || "Details"
78 + }
79 + )
80 + }
81 +
82 + useGlobalActions().notification(notify)
83 + }
84 +
85 + list.value = _uniqBy([newItem, ...list.value], o => o.id)
86 }
87 }
88 }
src/layouts/common/GlobalListener.vue
+3 -2
@@ -3,10 +3,11 @@
3 </template>
4
5 <script setup>
6 -import { useMessage } from "naive-ui"
6 +import { useMessage, useNotification } from "naive-ui"
7 import { useGlobalActions } from "@/composables/useGlobalActions"
8
9 const message = useMessage()
10 +const notification = useNotification()
11
11 -useGlobalActions().init({ message })
12 +useGlobalActions().init({ message, notification })
13 </script>
src/layouts/common/Navbar/items.tsx
+14
@@ -186,6 +186,20 @@ export default function getItems(mode: "vertical" | "horizontal", collapsed: boo
186 }
187 ]
188 },
189 + {
190 + label: () =>
191 + h(
192 + RouterLink,
193 + {
194 + to: {
195 + name: "Healthcheck"
196 + }
197 + },
198 + { default: () => "Healthcheck" }
199 + ),
200 + key: "Healthcheck",
201 + icon: renderIcon(BlankIcon)
202 + },
203 {
204 type: "divider"
205 },
src/layouts/common/Toolbar/Notifications.vue
+10 -47
@@ -1,5 +1,5 @@
1 <template>
2 - <n-popover :show-arrow="false" placement="bottom" content-style="padding:0" style="max-width: 280px">
2 + <n-popover :show-arrow="false" placement="bottom" content-style="padding:0" style="width: 280px">
3 <template #trigger>
4 <n-badge :show="hasNotifications" dot :color="primaryColor">
5 <Icon :name="BellIcon" :size="21" class="trigger-icon"></Icon>
@@ -9,9 +9,9 @@
9 <n-text strong depth="1">Notifications</n-text>
10 </template>
11 <template #default>
12 - <Notifications :max-items="7" style="max-height: 50vh">
12 + <Notifications :max-items="MAX_ITEMS" style="max-height: 50vh">
13 <template #last>
14 - <div class="p-4 flex justify-center">
14 + <div class="p-4 flex justify-center" v-if="list.length > MAX_ITEMS">
15 <n-button text @click="showDrawer = true">View all</n-button>
16 </div>
17 </template>
@@ -41,67 +41,30 @@
41 </template>
42
43 <script lang="ts" setup>
44 -import { NButton, NText, NPopover, NBadge, useNotification, NDrawer, NDrawerContent } from "naive-ui"
45 -import { computed, onMounted, h, ref } from "vue"
46 -import dayjs from "@/utils/dayjs"
44 +import { NButton, NText, NPopover, NBadge, NDrawer, NDrawerContent } from "naive-ui"
45 +import { computed, ref, onBeforeMount } from "vue"
46 import { useThemeStore } from "@/stores/theme"
47 import Icon from "@/components/common/Icon.vue"
48 import Notifications from "@/components/common/Notifications.vue"
49 import { useNotifications } from "@/composables/useNotifications"
50 +import { useHealthchecksNotify } from "@/composables/useHealthchecksNotify"
51
52 const BellIcon = "ph:bell"
53
54 -const notification = useNotification()
54 const primaryColor = computed(() => useThemeStore().primaryColor)
55 const hasNotifications = useNotifications().hasNotifications
56
57 const showDrawer = ref(false)
58 const list = useNotifications().list
59
60 +const MAX_ITEMS = 7
61 +
62 function setAllRead() {
63 useNotifications().setAllRead()
64 }
65
65 -onMounted(() => {
66 - if (window.innerWidth > 700 && list?.value[0] && list?.value[0].id !== 9999) {
67 - setTimeout(() => {
68 - const newItem = {
69 - id: 9999,
70 - type: "news",
71 - title: "Good news",
72 - description: "HI! You can buy this template on Themeforest, click here.",
73 - read: false,
74 - date: "Today",
75 - action: () => {
76 - window.open("https://themeforest.net/item/pinx-vuejs-admin-template/47799543", "_blank")
77 - }
78 - }
79 -
80 - useNotifications().prepend(newItem)
81 -
82 - notification.success({
83 - title: newItem.title,
84 - content: newItem.description,
85 - meta: dayjs().format("HH:mm"),
86 - action: () =>
87 - h(
88 - NButton,
89 - {
90 - text: true,
91 - type: "primary",
92 - onClick: () => {
93 - window.open("https://themeforest.net/item/pinx-vuejs-admin-template/47799543", "_blank")
94 - }
95 - },
96 - {
97 - default: () => "Go to Themeforest"
98 - }
99 - ),
100 - duration: 3000,
101 - keepAliveOnHover: true
102 - })
103 - }, 10000)
104 - }
66 +onBeforeMount(() => {
67 + useHealthchecksNotify().init()
68 })
69 </script>
70
src/router/index.ts
+6
@@ -104,6 +104,12 @@ const router = createRouter({
104 }
105 ]
106 },
107 + {
108 + path: "/healthcheck",
109 + name: "Healthcheck",
110 + component: () => import("@/views/socfortress/Healthcheck.vue"),
111 + meta: { title: "Healthcheck", auth: true, roles: UserRole.All }
112 + },
113
114 // DEMO PAGES ==========================================================
115
src/stores/auth.ts
+3 -1
@@ -3,6 +3,7 @@ import { UserRole, type User, type LoginPayload } from "@/types/auth.d"
3 import _castArray from "lodash/castArray"
4 import Api from "@/api"
5 import * as jose from "jose"
6 +import _toNumber from "lodash/toNumber"
7 import SecureLS from "secure-ls"
8 import { scopeToRole } from "@/utils/auth"
9 const ls = new SecureLS({ encodingType: "aes", isCompression: false })
@@ -12,7 +13,8 @@ export const useAuthStore = defineStore("auth", {
13 user: {
14 access_token: "",
15 role: UserRole.Unknown
15 - } as User
16 + } as User,
17 + tokenDebounceTime: _toNumber(import.meta.env.VITE_TOKEN_DEBOUNCE_TIME) as number // seconds
18 }),
19 actions: {
20 setLogged(token: string) {
src/stores/healthcheck.ts new
+92
@@ -0,0 +1,92 @@
1 +import _toNumber from "lodash/toNumber"
2 +import { InfluxDBAlertLevel, type InfluxDBAlert } from "@/types/healthchecks.d"
3 +import Api from "@/api"
4 +import { defineStore, acceptHMRUpdate } from "pinia"
5 +import { IndexHealth } from "@/types/indices.d"
6 +
7 +export const usHealthcheckStore = defineStore("healthcheck", {
8 + state: () => ({
9 + uncommittedJournalEntriesThreshold: _toNumber(
10 + import.meta.env.VITE_UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD
11 + ) as number,
12 + healthchecksInterval: (_toNumber(import.meta.env.VITE_HEALTHCHECKS_INTERVAL) * 1000) as number,
13 + getDataTimer: null as NodeJS.Timeout | null,
14 + uncommittedJournalEntries: 0 as number | null,
15 + clusterName: "" as string | null,
16 + clusterStatus: IndexHealth.GREEN as IndexHealth | null,
17 + alerts: [] as InfluxDBAlert[] | null
18 + }),
19 + actions: {
20 + getGraylogCheck() {
21 + Api.graylog
22 + .getMetrics()
23 + .then(res => {
24 + if (res.data.success) {
25 + this.uncommittedJournalEntries = res.data.uncommitted_journal_entries || 0
26 + } else {
27 + this.uncommittedJournalEntries = null
28 + }
29 + })
30 + .catch(() => {
31 + this.uncommittedJournalEntries = null
32 + })
33 + },
34 + getClusterHealth() {
35 + Api.indices
36 + .getClusterHealth()
37 + .then(res => {
38 + if (res.data.success) {
39 + this.clusterName = res.data.cluster_health.cluster_name
40 + this.clusterStatus = res.data.cluster_health.status
41 + } else {
42 + this.clusterName = null
43 + this.clusterStatus = null
44 + }
45 + })
46 + .catch(() => {
47 + this.clusterName = null
48 + this.clusterStatus = null
49 + })
50 + },
51 + getHealthchecks() {
52 + Api.healthchecks
53 + .getHealthchecks()
54 + .then(res => {
55 + if (res.data.success) {
56 + this.alerts = res.data.alerts.filter(o => o.level === InfluxDBAlertLevel.Crit)
57 + } else {
58 + this.alerts = null
59 + }
60 + })
61 + .catch(() => {
62 + this.alerts = null
63 + })
64 + },
65 +
66 + getData() {
67 + if (this.uncommittedJournalEntriesThreshold) {
68 + this.getGraylogCheck()
69 + }
70 + this.getClusterHealth()
71 + this.getHealthchecks()
72 + },
73 +
74 + stop() {
75 + if (this.getDataTimer !== null) {
76 + clearInterval(this.getDataTimer)
77 + this.getDataTimer = null
78 + }
79 + },
80 +
81 + start() {
82 + this.getData()
83 + if (this.healthchecksInterval) {
84 + this.getDataTimer = setInterval(this.getData, this.healthchecksInterval)
85 + }
86 + }
87 + }
88 +})
89 +
90 +if (import.meta.hot) {
91 + import.meta.hot.accept(acceptHMRUpdate(usHealthcheckStore, import.meta.hot))
92 +}
src/stores/settings.ts
+2
@@ -36,7 +36,9 @@ export const useSettingsStore = defineStore("settings", {
36 date: `${date}`,
37 datetime: `${date}${separator}${time}`,
38 datetimesec: `${date}${separator}${timesec}`,
39 + /** "HH:mm" or "h:mm a" */
40 time,
41 + /** "HH:mm:ss" or "h:mm:ss a" */
42 timesec
43 }
44 }
src/types/healthchecks.d.ts new
+12
@@ -0,0 +1,12 @@
1 +export interface InfluxDBAlert {
2 + time: string | Date
3 + message: string
4 + checkID: string
5 + checkName: string
6 + level: InfluxDBAlertLevel
7 +}
8 +
9 +export enum InfluxDBAlertLevel {
10 + Ok = "ok",
11 + Crit = "crit"
12 +}
src/utils/auth.ts
+2 -2
@@ -5,9 +5,9 @@ import _castArray from "lodash/castArray"
5 import _toNumber from "lodash/toNumber"
6 import * as jose from "jose"
7
8 -const TOKEN_DEBOUNCE_TIME = import.meta.env.VITE_TOKEN_DEBOUNCE_TIME // seconds
9 -
8 export function isDebounceTimeOver(lastCheck: Date | null) {
9 + const TOKEN_DEBOUNCE_TIME = useAuthStore().tokenDebounceTime
10 +
11 if (!lastCheck) return true
12
13 const timeOver = lastCheck.getTime() + _toNumber(TOKEN_DEBOUNCE_TIME) * 1000
src/views/socfortress/Healthcheck.vue new
+9
@@ -0,0 +1,9 @@
1 +<template>
2 + <div class="page">
3 + <HealthcheckList />
4 + </div>
5 +</template>
6 +
7 +<script setup lang="ts">
8 +import HealthcheckList from "@/components/healthcheck/HealthcheckList.vue"
9 +</script>