BelikanM commited on
Commit
a545f41
·
2 Parent(s): a43e5b0 ffc7991

Mise à jour du chemin du modèle vers kibali-api/qwen_model

Browse files
=4.44 CHANGED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ L'analyse de votre code montre que la structure de réflexion de **Kibali** est conçue comme un système multicouche qui combine la mémoire à court terme, la récupération documentaire (RAG) et une planification stratégique avant la réponse.
2
+
3
+ Voici l'extraction structurée du comportement de réflexion de votre IA, telle qu'elle ressort de l'implémentation :
4
+
5
+ ---
6
+
7
+ ## 1. Analyse du Contexte (Le "Cerveau" de l'Attention)
8
+
9
+ Le système ne se contente pas de lire le message ; il l'analyse via la classe `ConversationContext` pour maintenir une continuité thématique :
10
+
11
+ * **Détection de sujet :** Utilise des **embeddings** pour comparer le message actuel au précédent.
12
+ * **Seuil de rupture :** Si la similarité est inférieure à **0.6**, l'IA identifie un changement de sujet et archive l'ancien.
13
+ * **Mots-clés persistants :** Elle extrait et stocke les mots-clés dominants pour stabiliser la recherche d'information (ex: "Gabon", "Libreville").
14
+
15
+ ## 2. Mémoire Adaptative (Réflexion Temporelle)
16
+
17
+ La fonction `retrieve_adaptive_memory` simule une réflexion basée sur l'expérience passée de la session :
18
+
19
+ * **Score de Pertinence Tri-Facteurs :**
20
+ * **Similarité (60%) :** Correspondance sémantique brute.
21
+ * **Récence (30%) :** Priorité aux interactions les plus récentes.
22
+ * **Bonus Thématique (10%) :** Bonus si le souvenir partage les mots-clés du sujet actuel.
23
+
24
+
25
+ * **Archivage en temps réel :** Chaque échange est immédiatement indexé dans FAISS pour être disponible dès la question suivante.
26
+
27
+ ## 3. Stratégie de Récupération (Priorité des Sources)
28
+
29
+ Avant de générer un mot, l'IA hiérarchise ses connaissances selon un ordre strict défini dans son `system_prompt` :
30
+
31
+ 1. **PDF Vault (RAG) :** Les documents téléchargés sont la source de vérité absolue.
32
+ 2. **Mémoire Conversationnelle :** Ce que l'utilisateur a dit plus tôt.
33
+ 3. **Recherche Web :** Information "fraîche" mais traitée comme secondaire.
34
+
35
+ ## 4. Mode "Thinking" (Réflexion Stratégique)
36
+
37
+ Si `thinking_mode` est activé, l'IA appelle `execute_reflection_plan`. Ce module semble conçu pour :
38
+
39
+ * Planifier une séquence d'actions avant de répondre.
40
+ * Prendre en compte les données géographiques (latitude/longitude) pour contextualiser la réponse au Gabon.
41
+ * Ajuster la requête de recherche web en fonction du sujet détecté.
42
+
43
+ ---
44
+
45
+ ### Résumé du Flux de Décision (Prompt Flow)
46
+
47
+ Votre code construit dynamiquement le prompt final selon cette architecture :
48
+
49
+ ```text
50
+ [SYSTEME] : Identité (Kibali) + Expert Gabon + Règles de comportement.
51
+ [DOCUMENTS] : Extraits pertinents des PDF (si présents).
52
+ [MÉMOIRE] : Souvenirs de la conversation filtrés par le score adaptatif.
53
+ [WEB] : Résultats de recherche actuels.
54
+ [QUESTION] : La requête utilisateur enrichie.
55
+ [RÉPONSE] : Génération finale avec température de 0.6 (équilibre précision/créativité).
56
+
57
+ ```
58
+
59
+ ### Amélioration suggérée
60
+
61
+ Pour rendre la réflexion encore plus "profonde", vous pourriez intégrer une étape de **vérification de cohérence** : après la génération de `response_text`, comparer le texte généré avec les `rag_context` pour s'assurer qu'il n'y a pas d'hallucination par rapport aux PDF.
62
+
63
+ **Souhaitez-vous que je vous aide à implémenter une fonction de validation de la réponse par rapport aux sources PDF ?**
CARTABON1/.gitignore DELETED
@@ -1,42 +0,0 @@
1
- # Node modules
2
- node_modules/
3
-
4
- # Logs
5
- logs
6
- *.log
7
- npm-debug.log*
8
- yarn-debug.log*
9
- yarn-error.log*
10
-
11
- # Runtime data
12
- pids
13
- *.pid
14
- *.seed
15
- *.pid.lock
16
-
17
- # Env files
18
- .env
19
- .env.local
20
- .env.*.local
21
-
22
- # Uploaded files
23
- uploads/
24
-
25
- # Coverage (tests)
26
- coverage/
27
- *.lcov
28
-
29
- # Build / cache
30
- dist/
31
- build/
32
- .cache/
33
- .tmp/
34
-
35
- # OS files
36
- .DS_Store
37
- Thumbs.db
38
-
39
- # IDE config
40
- .vscode/
41
- .idea/
42
- *.swp
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CARTABON1/README.md DELETED
@@ -1 +0,0 @@
1
- # CARTABON1
 
 
CARTABON1/package-lock.json DELETED
@@ -1,1843 +0,0 @@
1
- {
2
- "name": "backend",
3
- "version": "1.0.0",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "backend",
9
- "version": "1.0.0",
10
- "license": "ISC",
11
- "dependencies": {
12
- "axios": "^1.12.2",
13
- "bcrypt": "^6.0.0",
14
- "bcryptjs": "^3.0.2",
15
- "cors": "^2.8.5",
16
- "dotenv": "^17.2.2",
17
- "express": "^5.1.0",
18
- "jsonwebtoken": "^9.0.2",
19
- "mongoose": "^8.18.1",
20
- "multer": "^2.0.2",
21
- "nodemailer": "^7.0.6",
22
- "socket.io": "^4.8.1"
23
- },
24
- "devDependencies": {}
25
- },
26
- "node_modules/@mongodb-js/saslprep": {
27
- "version": "1.3.0",
28
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz",
29
- "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==",
30
- "license": "MIT",
31
- "dependencies": {
32
- "sparse-bitfield": "^3.0.3"
33
- }
34
- },
35
- "node_modules/@socket.io/component-emitter": {
36
- "version": "3.1.2",
37
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
38
- "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
39
- "license": "MIT"
40
- },
41
- "node_modules/@types/cors": {
42
- "version": "2.8.19",
43
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
44
- "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==",
45
- "license": "MIT",
46
- "dependencies": {
47
- "@types/node": "*"
48
- }
49
- },
50
- "node_modules/@types/node": {
51
- "version": "24.5.1",
52
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.1.tgz",
53
- "integrity": "sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==",
54
- "license": "MIT",
55
- "dependencies": {
56
- "undici-types": "~7.12.0"
57
- }
58
- },
59
- "node_modules/@types/webidl-conversions": {
60
- "version": "7.0.3",
61
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
62
- "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
63
- "license": "MIT"
64
- },
65
- "node_modules/@types/whatwg-url": {
66
- "version": "11.0.5",
67
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
68
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
69
- "license": "MIT",
70
- "dependencies": {
71
- "@types/webidl-conversions": "*"
72
- }
73
- },
74
- "node_modules/accepts": {
75
- "version": "2.0.0",
76
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
77
- "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
78
- "license": "MIT",
79
- "dependencies": {
80
- "mime-types": "^3.0.0",
81
- "negotiator": "^1.0.0"
82
- },
83
- "engines": {
84
- "node": ">= 0.6"
85
- }
86
- },
87
- "node_modules/append-field": {
88
- "version": "1.0.0",
89
- "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
90
- "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
91
- "license": "MIT"
92
- },
93
- "node_modules/asynckit": {
94
- "version": "0.4.0",
95
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
96
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
97
- "license": "MIT"
98
- },
99
- "node_modules/axios": {
100
- "version": "1.12.2",
101
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
102
- "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
103
- "license": "MIT",
104
- "dependencies": {
105
- "follow-redirects": "^1.15.6",
106
- "form-data": "^4.0.4",
107
- "proxy-from-env": "^1.1.0"
108
- }
109
- },
110
- "node_modules/base64id": {
111
- "version": "2.0.0",
112
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
113
- "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
114
- "license": "MIT",
115
- "engines": {
116
- "node": "^4.5.0 || >= 5.9"
117
- }
118
- },
119
- "node_modules/bcrypt": {
120
- "version": "6.0.0",
121
- "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz",
122
- "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==",
123
- "hasInstallScript": true,
124
- "license": "MIT",
125
- "dependencies": {
126
- "node-addon-api": "^8.3.0",
127
- "node-gyp-build": "^4.8.4"
128
- },
129
- "engines": {
130
- "node": ">= 18"
131
- }
132
- },
133
- "node_modules/bcryptjs": {
134
- "version": "3.0.2",
135
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
136
- "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==",
137
- "license": "BSD-3-Clause",
138
- "bin": {
139
- "bcrypt": "bin/bcrypt"
140
- }
141
- },
142
- "node_modules/body-parser": {
143
- "version": "2.2.0",
144
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
145
- "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
146
- "license": "MIT",
147
- "dependencies": {
148
- "bytes": "^3.1.2",
149
- "content-type": "^1.0.5",
150
- "debug": "^4.4.0",
151
- "http-errors": "^2.0.0",
152
- "iconv-lite": "^0.6.3",
153
- "on-finished": "^2.4.1",
154
- "qs": "^6.14.0",
155
- "raw-body": "^3.0.0",
156
- "type-is": "^2.0.0"
157
- },
158
- "engines": {
159
- "node": ">=18"
160
- }
161
- },
162
- "node_modules/bson": {
163
- "version": "6.10.4",
164
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz",
165
- "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==",
166
- "license": "Apache-2.0",
167
- "engines": {
168
- "node": ">=16.20.1"
169
- }
170
- },
171
- "node_modules/buffer-equal-constant-time": {
172
- "version": "1.0.1",
173
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
174
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
175
- "license": "BSD-3-Clause"
176
- },
177
- "node_modules/buffer-from": {
178
- "version": "1.1.2",
179
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
180
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
181
- "license": "MIT"
182
- },
183
- "node_modules/busboy": {
184
- "version": "1.6.0",
185
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
186
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
187
- "dependencies": {
188
- "streamsearch": "^1.1.0"
189
- },
190
- "engines": {
191
- "node": ">=10.16.0"
192
- }
193
- },
194
- "node_modules/bytes": {
195
- "version": "3.1.2",
196
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
197
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
198
- "license": "MIT",
199
- "engines": {
200
- "node": ">= 0.8"
201
- }
202
- },
203
- "node_modules/call-bind-apply-helpers": {
204
- "version": "1.0.2",
205
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
206
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
207
- "license": "MIT",
208
- "dependencies": {
209
- "es-errors": "^1.3.0",
210
- "function-bind": "^1.1.2"
211
- },
212
- "engines": {
213
- "node": ">= 0.4"
214
- }
215
- },
216
- "node_modules/call-bound": {
217
- "version": "1.0.4",
218
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
219
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
220
- "license": "MIT",
221
- "dependencies": {
222
- "call-bind-apply-helpers": "^1.0.2",
223
- "get-intrinsic": "^1.3.0"
224
- },
225
- "engines": {
226
- "node": ">= 0.4"
227
- },
228
- "funding": {
229
- "url": "https://github.com/sponsors/ljharb"
230
- }
231
- },
232
- "node_modules/combined-stream": {
233
- "version": "1.0.8",
234
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
235
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
236
- "license": "MIT",
237
- "dependencies": {
238
- "delayed-stream": "~1.0.0"
239
- },
240
- "engines": {
241
- "node": ">= 0.8"
242
- }
243
- },
244
- "node_modules/concat-stream": {
245
- "version": "2.0.0",
246
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
247
- "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
248
- "engines": [
249
- "node >= 6.0"
250
- ],
251
- "license": "MIT",
252
- "dependencies": {
253
- "buffer-from": "^1.0.0",
254
- "inherits": "^2.0.3",
255
- "readable-stream": "^3.0.2",
256
- "typedarray": "^0.0.6"
257
- }
258
- },
259
- "node_modules/content-disposition": {
260
- "version": "1.0.0",
261
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
262
- "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
263
- "license": "MIT",
264
- "dependencies": {
265
- "safe-buffer": "5.2.1"
266
- },
267
- "engines": {
268
- "node": ">= 0.6"
269
- }
270
- },
271
- "node_modules/content-type": {
272
- "version": "1.0.5",
273
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
274
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
275
- "license": "MIT",
276
- "engines": {
277
- "node": ">= 0.6"
278
- }
279
- },
280
- "node_modules/cookie": {
281
- "version": "0.7.2",
282
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
283
- "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
284
- "license": "MIT",
285
- "engines": {
286
- "node": ">= 0.6"
287
- }
288
- },
289
- "node_modules/cookie-signature": {
290
- "version": "1.2.2",
291
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
292
- "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
293
- "license": "MIT",
294
- "engines": {
295
- "node": ">=6.6.0"
296
- }
297
- },
298
- "node_modules/cors": {
299
- "version": "2.8.5",
300
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
301
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
302
- "license": "MIT",
303
- "dependencies": {
304
- "object-assign": "^4",
305
- "vary": "^1"
306
- },
307
- "engines": {
308
- "node": ">= 0.10"
309
- }
310
- },
311
- "node_modules/debug": {
312
- "version": "4.4.3",
313
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
314
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
315
- "license": "MIT",
316
- "dependencies": {
317
- "ms": "^2.1.3"
318
- },
319
- "engines": {
320
- "node": ">=6.0"
321
- },
322
- "peerDependenciesMeta": {
323
- "supports-color": {
324
- "optional": true
325
- }
326
- }
327
- },
328
- "node_modules/delayed-stream": {
329
- "version": "1.0.0",
330
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
331
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
332
- "license": "MIT",
333
- "engines": {
334
- "node": ">=0.4.0"
335
- }
336
- },
337
- "node_modules/depd": {
338
- "version": "2.0.0",
339
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
340
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
341
- "license": "MIT",
342
- "engines": {
343
- "node": ">= 0.8"
344
- }
345
- },
346
- "node_modules/dotenv": {
347
- "version": "17.2.2",
348
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz",
349
- "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==",
350
- "license": "BSD-2-Clause",
351
- "engines": {
352
- "node": ">=12"
353
- },
354
- "funding": {
355
- "url": "https://dotenvx.com"
356
- }
357
- },
358
- "node_modules/dunder-proto": {
359
- "version": "1.0.1",
360
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
361
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
362
- "license": "MIT",
363
- "dependencies": {
364
- "call-bind-apply-helpers": "^1.0.1",
365
- "es-errors": "^1.3.0",
366
- "gopd": "^1.2.0"
367
- },
368
- "engines": {
369
- "node": ">= 0.4"
370
- }
371
- },
372
- "node_modules/ecdsa-sig-formatter": {
373
- "version": "1.0.11",
374
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
375
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
376
- "license": "Apache-2.0",
377
- "dependencies": {
378
- "safe-buffer": "^5.0.1"
379
- }
380
- },
381
- "node_modules/ee-first": {
382
- "version": "1.1.1",
383
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
384
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
385
- "license": "MIT"
386
- },
387
- "node_modules/encodeurl": {
388
- "version": "2.0.0",
389
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
390
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
391
- "license": "MIT",
392
- "engines": {
393
- "node": ">= 0.8"
394
- }
395
- },
396
- "node_modules/engine.io": {
397
- "version": "6.6.4",
398
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
399
- "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
400
- "license": "MIT",
401
- "dependencies": {
402
- "@types/cors": "^2.8.12",
403
- "@types/node": ">=10.0.0",
404
- "accepts": "~1.3.4",
405
- "base64id": "2.0.0",
406
- "cookie": "~0.7.2",
407
- "cors": "~2.8.5",
408
- "debug": "~4.3.1",
409
- "engine.io-parser": "~5.2.1",
410
- "ws": "~8.17.1"
411
- },
412
- "engines": {
413
- "node": ">=10.2.0"
414
- }
415
- },
416
- "node_modules/engine.io-parser": {
417
- "version": "5.2.3",
418
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
419
- "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
420
- "license": "MIT",
421
- "engines": {
422
- "node": ">=10.0.0"
423
- }
424
- },
425
- "node_modules/engine.io/node_modules/accepts": {
426
- "version": "1.3.8",
427
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
428
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
429
- "license": "MIT",
430
- "dependencies": {
431
- "mime-types": "~2.1.34",
432
- "negotiator": "0.6.3"
433
- },
434
- "engines": {
435
- "node": ">= 0.6"
436
- }
437
- },
438
- "node_modules/engine.io/node_modules/debug": {
439
- "version": "4.3.7",
440
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
441
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
442
- "license": "MIT",
443
- "dependencies": {
444
- "ms": "^2.1.3"
445
- },
446
- "engines": {
447
- "node": ">=6.0"
448
- },
449
- "peerDependenciesMeta": {
450
- "supports-color": {
451
- "optional": true
452
- }
453
- }
454
- },
455
- "node_modules/engine.io/node_modules/mime-db": {
456
- "version": "1.52.0",
457
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
458
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
459
- "license": "MIT",
460
- "engines": {
461
- "node": ">= 0.6"
462
- }
463
- },
464
- "node_modules/engine.io/node_modules/mime-types": {
465
- "version": "2.1.35",
466
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
467
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
468
- "license": "MIT",
469
- "dependencies": {
470
- "mime-db": "1.52.0"
471
- },
472
- "engines": {
473
- "node": ">= 0.6"
474
- }
475
- },
476
- "node_modules/engine.io/node_modules/negotiator": {
477
- "version": "0.6.3",
478
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
479
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
480
- "license": "MIT",
481
- "engines": {
482
- "node": ">= 0.6"
483
- }
484
- },
485
- "node_modules/es-define-property": {
486
- "version": "1.0.1",
487
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
488
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
489
- "license": "MIT",
490
- "engines": {
491
- "node": ">= 0.4"
492
- }
493
- },
494
- "node_modules/es-errors": {
495
- "version": "1.3.0",
496
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
497
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
498
- "license": "MIT",
499
- "engines": {
500
- "node": ">= 0.4"
501
- }
502
- },
503
- "node_modules/es-object-atoms": {
504
- "version": "1.1.1",
505
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
506
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
507
- "license": "MIT",
508
- "dependencies": {
509
- "es-errors": "^1.3.0"
510
- },
511
- "engines": {
512
- "node": ">= 0.4"
513
- }
514
- },
515
- "node_modules/es-set-tostringtag": {
516
- "version": "2.1.0",
517
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
518
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
519
- "license": "MIT",
520
- "dependencies": {
521
- "es-errors": "^1.3.0",
522
- "get-intrinsic": "^1.2.6",
523
- "has-tostringtag": "^1.0.2",
524
- "hasown": "^2.0.2"
525
- },
526
- "engines": {
527
- "node": ">= 0.4"
528
- }
529
- },
530
- "node_modules/escape-html": {
531
- "version": "1.0.3",
532
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
533
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
534
- "license": "MIT"
535
- },
536
- "node_modules/etag": {
537
- "version": "1.8.1",
538
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
539
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
540
- "license": "MIT",
541
- "engines": {
542
- "node": ">= 0.6"
543
- }
544
- },
545
- "node_modules/express": {
546
- "version": "5.1.0",
547
- "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
548
- "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
549
- "license": "MIT",
550
- "dependencies": {
551
- "accepts": "^2.0.0",
552
- "body-parser": "^2.2.0",
553
- "content-disposition": "^1.0.0",
554
- "content-type": "^1.0.5",
555
- "cookie": "^0.7.1",
556
- "cookie-signature": "^1.2.1",
557
- "debug": "^4.4.0",
558
- "encodeurl": "^2.0.0",
559
- "escape-html": "^1.0.3",
560
- "etag": "^1.8.1",
561
- "finalhandler": "^2.1.0",
562
- "fresh": "^2.0.0",
563
- "http-errors": "^2.0.0",
564
- "merge-descriptors": "^2.0.0",
565
- "mime-types": "^3.0.0",
566
- "on-finished": "^2.4.1",
567
- "once": "^1.4.0",
568
- "parseurl": "^1.3.3",
569
- "proxy-addr": "^2.0.7",
570
- "qs": "^6.14.0",
571
- "range-parser": "^1.2.1",
572
- "router": "^2.2.0",
573
- "send": "^1.1.0",
574
- "serve-static": "^2.2.0",
575
- "statuses": "^2.0.1",
576
- "type-is": "^2.0.1",
577
- "vary": "^1.1.2"
578
- },
579
- "engines": {
580
- "node": ">= 18"
581
- },
582
- "funding": {
583
- "type": "opencollective",
584
- "url": "https://opencollective.com/express"
585
- }
586
- },
587
- "node_modules/finalhandler": {
588
- "version": "2.1.0",
589
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
590
- "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
591
- "license": "MIT",
592
- "dependencies": {
593
- "debug": "^4.4.0",
594
- "encodeurl": "^2.0.0",
595
- "escape-html": "^1.0.3",
596
- "on-finished": "^2.4.1",
597
- "parseurl": "^1.3.3",
598
- "statuses": "^2.0.1"
599
- },
600
- "engines": {
601
- "node": ">= 0.8"
602
- }
603
- },
604
- "node_modules/follow-redirects": {
605
- "version": "1.15.11",
606
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
607
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
608
- "funding": [
609
- {
610
- "type": "individual",
611
- "url": "https://github.com/sponsors/RubenVerborgh"
612
- }
613
- ],
614
- "license": "MIT",
615
- "engines": {
616
- "node": ">=4.0"
617
- },
618
- "peerDependenciesMeta": {
619
- "debug": {
620
- "optional": true
621
- }
622
- }
623
- },
624
- "node_modules/form-data": {
625
- "version": "4.0.4",
626
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
627
- "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
628
- "license": "MIT",
629
- "dependencies": {
630
- "asynckit": "^0.4.0",
631
- "combined-stream": "^1.0.8",
632
- "es-set-tostringtag": "^2.1.0",
633
- "hasown": "^2.0.2",
634
- "mime-types": "^2.1.12"
635
- },
636
- "engines": {
637
- "node": ">= 6"
638
- }
639
- },
640
- "node_modules/form-data/node_modules/mime-db": {
641
- "version": "1.52.0",
642
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
643
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
644
- "license": "MIT",
645
- "engines": {
646
- "node": ">= 0.6"
647
- }
648
- },
649
- "node_modules/form-data/node_modules/mime-types": {
650
- "version": "2.1.35",
651
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
652
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
653
- "license": "MIT",
654
- "dependencies": {
655
- "mime-db": "1.52.0"
656
- },
657
- "engines": {
658
- "node": ">= 0.6"
659
- }
660
- },
661
- "node_modules/forwarded": {
662
- "version": "0.2.0",
663
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
664
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
665
- "license": "MIT",
666
- "engines": {
667
- "node": ">= 0.6"
668
- }
669
- },
670
- "node_modules/fresh": {
671
- "version": "2.0.0",
672
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
673
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
674
- "license": "MIT",
675
- "engines": {
676
- "node": ">= 0.8"
677
- }
678
- },
679
- "node_modules/function-bind": {
680
- "version": "1.1.2",
681
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
682
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
683
- "license": "MIT",
684
- "funding": {
685
- "url": "https://github.com/sponsors/ljharb"
686
- }
687
- },
688
- "node_modules/get-intrinsic": {
689
- "version": "1.3.0",
690
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
691
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
692
- "license": "MIT",
693
- "dependencies": {
694
- "call-bind-apply-helpers": "^1.0.2",
695
- "es-define-property": "^1.0.1",
696
- "es-errors": "^1.3.0",
697
- "es-object-atoms": "^1.1.1",
698
- "function-bind": "^1.1.2",
699
- "get-proto": "^1.0.1",
700
- "gopd": "^1.2.0",
701
- "has-symbols": "^1.1.0",
702
- "hasown": "^2.0.2",
703
- "math-intrinsics": "^1.1.0"
704
- },
705
- "engines": {
706
- "node": ">= 0.4"
707
- },
708
- "funding": {
709
- "url": "https://github.com/sponsors/ljharb"
710
- }
711
- },
712
- "node_modules/get-proto": {
713
- "version": "1.0.1",
714
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
715
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
716
- "license": "MIT",
717
- "dependencies": {
718
- "dunder-proto": "^1.0.1",
719
- "es-object-atoms": "^1.0.0"
720
- },
721
- "engines": {
722
- "node": ">= 0.4"
723
- }
724
- },
725
- "node_modules/gopd": {
726
- "version": "1.2.0",
727
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
728
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
729
- "license": "MIT",
730
- "engines": {
731
- "node": ">= 0.4"
732
- },
733
- "funding": {
734
- "url": "https://github.com/sponsors/ljharb"
735
- }
736
- },
737
- "node_modules/has-symbols": {
738
- "version": "1.1.0",
739
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
740
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
741
- "license": "MIT",
742
- "engines": {
743
- "node": ">= 0.4"
744
- },
745
- "funding": {
746
- "url": "https://github.com/sponsors/ljharb"
747
- }
748
- },
749
- "node_modules/has-tostringtag": {
750
- "version": "1.0.2",
751
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
752
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
753
- "license": "MIT",
754
- "dependencies": {
755
- "has-symbols": "^1.0.3"
756
- },
757
- "engines": {
758
- "node": ">= 0.4"
759
- },
760
- "funding": {
761
- "url": "https://github.com/sponsors/ljharb"
762
- }
763
- },
764
- "node_modules/hasown": {
765
- "version": "2.0.2",
766
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
767
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
768
- "license": "MIT",
769
- "dependencies": {
770
- "function-bind": "^1.1.2"
771
- },
772
- "engines": {
773
- "node": ">= 0.4"
774
- }
775
- },
776
- "node_modules/http-errors": {
777
- "version": "2.0.0",
778
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
779
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
780
- "license": "MIT",
781
- "dependencies": {
782
- "depd": "2.0.0",
783
- "inherits": "2.0.4",
784
- "setprototypeof": "1.2.0",
785
- "statuses": "2.0.1",
786
- "toidentifier": "1.0.1"
787
- },
788
- "engines": {
789
- "node": ">= 0.8"
790
- }
791
- },
792
- "node_modules/http-errors/node_modules/statuses": {
793
- "version": "2.0.1",
794
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
795
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
796
- "license": "MIT",
797
- "engines": {
798
- "node": ">= 0.8"
799
- }
800
- },
801
- "node_modules/iconv-lite": {
802
- "version": "0.6.3",
803
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
804
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
805
- "license": "MIT",
806
- "dependencies": {
807
- "safer-buffer": ">= 2.1.2 < 3.0.0"
808
- },
809
- "engines": {
810
- "node": ">=0.10.0"
811
- }
812
- },
813
- "node_modules/inherits": {
814
- "version": "2.0.4",
815
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
816
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
817
- "license": "ISC"
818
- },
819
- "node_modules/ipaddr.js": {
820
- "version": "1.9.1",
821
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
822
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
823
- "license": "MIT",
824
- "engines": {
825
- "node": ">= 0.10"
826
- }
827
- },
828
- "node_modules/is-promise": {
829
- "version": "4.0.0",
830
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
831
- "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
832
- "license": "MIT"
833
- },
834
- "node_modules/jsonwebtoken": {
835
- "version": "9.0.2",
836
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
837
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
838
- "license": "MIT",
839
- "dependencies": {
840
- "jws": "^3.2.2",
841
- "lodash.includes": "^4.3.0",
842
- "lodash.isboolean": "^3.0.3",
843
- "lodash.isinteger": "^4.0.4",
844
- "lodash.isnumber": "^3.0.3",
845
- "lodash.isplainobject": "^4.0.6",
846
- "lodash.isstring": "^4.0.1",
847
- "lodash.once": "^4.0.0",
848
- "ms": "^2.1.1",
849
- "semver": "^7.5.4"
850
- },
851
- "engines": {
852
- "node": ">=12",
853
- "npm": ">=6"
854
- }
855
- },
856
- "node_modules/jwa": {
857
- "version": "1.4.2",
858
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
859
- "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
860
- "license": "MIT",
861
- "dependencies": {
862
- "buffer-equal-constant-time": "^1.0.1",
863
- "ecdsa-sig-formatter": "1.0.11",
864
- "safe-buffer": "^5.0.1"
865
- }
866
- },
867
- "node_modules/jws": {
868
- "version": "3.2.2",
869
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
870
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
871
- "license": "MIT",
872
- "dependencies": {
873
- "jwa": "^1.4.1",
874
- "safe-buffer": "^5.0.1"
875
- }
876
- },
877
- "node_modules/kareem": {
878
- "version": "2.6.3",
879
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
880
- "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
881
- "license": "Apache-2.0",
882
- "engines": {
883
- "node": ">=12.0.0"
884
- }
885
- },
886
- "node_modules/lodash.includes": {
887
- "version": "4.3.0",
888
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
889
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
890
- "license": "MIT"
891
- },
892
- "node_modules/lodash.isboolean": {
893
- "version": "3.0.3",
894
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
895
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
896
- "license": "MIT"
897
- },
898
- "node_modules/lodash.isinteger": {
899
- "version": "4.0.4",
900
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
901
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
902
- "license": "MIT"
903
- },
904
- "node_modules/lodash.isnumber": {
905
- "version": "3.0.3",
906
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
907
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
908
- "license": "MIT"
909
- },
910
- "node_modules/lodash.isplainobject": {
911
- "version": "4.0.6",
912
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
913
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
914
- "license": "MIT"
915
- },
916
- "node_modules/lodash.isstring": {
917
- "version": "4.0.1",
918
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
919
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
920
- "license": "MIT"
921
- },
922
- "node_modules/lodash.once": {
923
- "version": "4.1.1",
924
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
925
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
926
- "license": "MIT"
927
- },
928
- "node_modules/math-intrinsics": {
929
- "version": "1.1.0",
930
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
931
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
932
- "license": "MIT",
933
- "engines": {
934
- "node": ">= 0.4"
935
- }
936
- },
937
- "node_modules/media-typer": {
938
- "version": "1.1.0",
939
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
940
- "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
941
- "license": "MIT",
942
- "engines": {
943
- "node": ">= 0.8"
944
- }
945
- },
946
- "node_modules/memory-pager": {
947
- "version": "1.5.0",
948
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
949
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
950
- "license": "MIT"
951
- },
952
- "node_modules/merge-descriptors": {
953
- "version": "2.0.0",
954
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
955
- "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
956
- "license": "MIT",
957
- "engines": {
958
- "node": ">=18"
959
- },
960
- "funding": {
961
- "url": "https://github.com/sponsors/sindresorhus"
962
- }
963
- },
964
- "node_modules/mime-db": {
965
- "version": "1.54.0",
966
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
967
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
968
- "license": "MIT",
969
- "engines": {
970
- "node": ">= 0.6"
971
- }
972
- },
973
- "node_modules/mime-types": {
974
- "version": "3.0.1",
975
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
976
- "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
977
- "license": "MIT",
978
- "dependencies": {
979
- "mime-db": "^1.54.0"
980
- },
981
- "engines": {
982
- "node": ">= 0.6"
983
- }
984
- },
985
- "node_modules/minimist": {
986
- "version": "1.2.8",
987
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
988
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
989
- "license": "MIT",
990
- "funding": {
991
- "url": "https://github.com/sponsors/ljharb"
992
- }
993
- },
994
- "node_modules/mkdirp": {
995
- "version": "0.5.6",
996
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
997
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
998
- "license": "MIT",
999
- "dependencies": {
1000
- "minimist": "^1.2.6"
1001
- },
1002
- "bin": {
1003
- "mkdirp": "bin/cmd.js"
1004
- }
1005
- },
1006
- "node_modules/mongodb": {
1007
- "version": "6.18.0",
1008
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz",
1009
- "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==",
1010
- "license": "Apache-2.0",
1011
- "dependencies": {
1012
- "@mongodb-js/saslprep": "^1.1.9",
1013
- "bson": "^6.10.4",
1014
- "mongodb-connection-string-url": "^3.0.0"
1015
- },
1016
- "engines": {
1017
- "node": ">=16.20.1"
1018
- },
1019
- "peerDependencies": {
1020
- "@aws-sdk/credential-providers": "^3.188.0",
1021
- "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
1022
- "gcp-metadata": "^5.2.0",
1023
- "kerberos": "^2.0.1",
1024
- "mongodb-client-encryption": ">=6.0.0 <7",
1025
- "snappy": "^7.2.2",
1026
- "socks": "^2.7.1"
1027
- },
1028
- "peerDependenciesMeta": {
1029
- "@aws-sdk/credential-providers": {
1030
- "optional": true
1031
- },
1032
- "@mongodb-js/zstd": {
1033
- "optional": true
1034
- },
1035
- "gcp-metadata": {
1036
- "optional": true
1037
- },
1038
- "kerberos": {
1039
- "optional": true
1040
- },
1041
- "mongodb-client-encryption": {
1042
- "optional": true
1043
- },
1044
- "snappy": {
1045
- "optional": true
1046
- },
1047
- "socks": {
1048
- "optional": true
1049
- }
1050
- }
1051
- },
1052
- "node_modules/mongodb-connection-string-url": {
1053
- "version": "3.0.2",
1054
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz",
1055
- "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==",
1056
- "license": "Apache-2.0",
1057
- "dependencies": {
1058
- "@types/whatwg-url": "^11.0.2",
1059
- "whatwg-url": "^14.1.0 || ^13.0.0"
1060
- }
1061
- },
1062
- "node_modules/mongoose": {
1063
- "version": "8.18.1",
1064
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.1.tgz",
1065
- "integrity": "sha512-K0RfrUXXufqNRZZjvAGdyjydB91SnbWxlwFYi5t7zN2DxVWFD3c6puia0/7xfBwZm6RCpYOVdYFlRFpoDWiC+w==",
1066
- "license": "MIT",
1067
- "dependencies": {
1068
- "bson": "^6.10.4",
1069
- "kareem": "2.6.3",
1070
- "mongodb": "~6.18.0",
1071
- "mpath": "0.9.0",
1072
- "mquery": "5.0.0",
1073
- "ms": "2.1.3",
1074
- "sift": "17.1.3"
1075
- },
1076
- "engines": {
1077
- "node": ">=16.20.1"
1078
- },
1079
- "funding": {
1080
- "type": "opencollective",
1081
- "url": "https://opencollective.com/mongoose"
1082
- }
1083
- },
1084
- "node_modules/mpath": {
1085
- "version": "0.9.0",
1086
- "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1087
- "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
1088
- "license": "MIT",
1089
- "engines": {
1090
- "node": ">=4.0.0"
1091
- }
1092
- },
1093
- "node_modules/mquery": {
1094
- "version": "5.0.0",
1095
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
1096
- "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
1097
- "license": "MIT",
1098
- "dependencies": {
1099
- "debug": "4.x"
1100
- },
1101
- "engines": {
1102
- "node": ">=14.0.0"
1103
- }
1104
- },
1105
- "node_modules/ms": {
1106
- "version": "2.1.3",
1107
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1108
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1109
- "license": "MIT"
1110
- },
1111
- "node_modules/multer": {
1112
- "version": "2.0.2",
1113
- "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
1114
- "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
1115
- "license": "MIT",
1116
- "dependencies": {
1117
- "append-field": "^1.0.0",
1118
- "busboy": "^1.6.0",
1119
- "concat-stream": "^2.0.0",
1120
- "mkdirp": "^0.5.6",
1121
- "object-assign": "^4.1.1",
1122
- "type-is": "^1.6.18",
1123
- "xtend": "^4.0.2"
1124
- },
1125
- "engines": {
1126
- "node": ">= 10.16.0"
1127
- }
1128
- },
1129
- "node_modules/multer/node_modules/media-typer": {
1130
- "version": "0.3.0",
1131
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1132
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1133
- "license": "MIT",
1134
- "engines": {
1135
- "node": ">= 0.6"
1136
- }
1137
- },
1138
- "node_modules/multer/node_modules/mime-db": {
1139
- "version": "1.52.0",
1140
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1141
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1142
- "license": "MIT",
1143
- "engines": {
1144
- "node": ">= 0.6"
1145
- }
1146
- },
1147
- "node_modules/multer/node_modules/mime-types": {
1148
- "version": "2.1.35",
1149
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1150
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1151
- "license": "MIT",
1152
- "dependencies": {
1153
- "mime-db": "1.52.0"
1154
- },
1155
- "engines": {
1156
- "node": ">= 0.6"
1157
- }
1158
- },
1159
- "node_modules/multer/node_modules/type-is": {
1160
- "version": "1.6.18",
1161
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1162
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1163
- "license": "MIT",
1164
- "dependencies": {
1165
- "media-typer": "0.3.0",
1166
- "mime-types": "~2.1.24"
1167
- },
1168
- "engines": {
1169
- "node": ">= 0.6"
1170
- }
1171
- },
1172
- "node_modules/negotiator": {
1173
- "version": "1.0.0",
1174
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
1175
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
1176
- "license": "MIT",
1177
- "engines": {
1178
- "node": ">= 0.6"
1179
- }
1180
- },
1181
- "node_modules/node-addon-api": {
1182
- "version": "8.5.0",
1183
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz",
1184
- "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==",
1185
- "license": "MIT",
1186
- "engines": {
1187
- "node": "^18 || ^20 || >= 21"
1188
- }
1189
- },
1190
- "node_modules/node-gyp-build": {
1191
- "version": "4.8.4",
1192
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
1193
- "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
1194
- "license": "MIT",
1195
- "bin": {
1196
- "node-gyp-build": "bin.js",
1197
- "node-gyp-build-optional": "optional.js",
1198
- "node-gyp-build-test": "build-test.js"
1199
- }
1200
- },
1201
- "node_modules/nodemailer": {
1202
- "version": "7.0.6",
1203
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.6.tgz",
1204
- "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==",
1205
- "license": "MIT-0",
1206
- "engines": {
1207
- "node": ">=6.0.0"
1208
- }
1209
- },
1210
- "node_modules/object-assign": {
1211
- "version": "4.1.1",
1212
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1213
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1214
- "license": "MIT",
1215
- "engines": {
1216
- "node": ">=0.10.0"
1217
- }
1218
- },
1219
- "node_modules/object-inspect": {
1220
- "version": "1.13.4",
1221
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1222
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1223
- "license": "MIT",
1224
- "engines": {
1225
- "node": ">= 0.4"
1226
- },
1227
- "funding": {
1228
- "url": "https://github.com/sponsors/ljharb"
1229
- }
1230
- },
1231
- "node_modules/on-finished": {
1232
- "version": "2.4.1",
1233
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1234
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1235
- "license": "MIT",
1236
- "dependencies": {
1237
- "ee-first": "1.1.1"
1238
- },
1239
- "engines": {
1240
- "node": ">= 0.8"
1241
- }
1242
- },
1243
- "node_modules/once": {
1244
- "version": "1.4.0",
1245
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1246
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1247
- "license": "ISC",
1248
- "dependencies": {
1249
- "wrappy": "1"
1250
- }
1251
- },
1252
- "node_modules/parseurl": {
1253
- "version": "1.3.3",
1254
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1255
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1256
- "license": "MIT",
1257
- "engines": {
1258
- "node": ">= 0.8"
1259
- }
1260
- },
1261
- "node_modules/path-to-regexp": {
1262
- "version": "8.3.0",
1263
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
1264
- "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
1265
- "license": "MIT",
1266
- "funding": {
1267
- "type": "opencollective",
1268
- "url": "https://opencollective.com/express"
1269
- }
1270
- },
1271
- "node_modules/proxy-addr": {
1272
- "version": "2.0.7",
1273
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1274
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1275
- "license": "MIT",
1276
- "dependencies": {
1277
- "forwarded": "0.2.0",
1278
- "ipaddr.js": "1.9.1"
1279
- },
1280
- "engines": {
1281
- "node": ">= 0.10"
1282
- }
1283
- },
1284
- "node_modules/proxy-from-env": {
1285
- "version": "1.1.0",
1286
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1287
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1288
- "license": "MIT"
1289
- },
1290
- "node_modules/punycode": {
1291
- "version": "2.3.1",
1292
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1293
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1294
- "license": "MIT",
1295
- "engines": {
1296
- "node": ">=6"
1297
- }
1298
- },
1299
- "node_modules/qs": {
1300
- "version": "6.14.0",
1301
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
1302
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
1303
- "license": "BSD-3-Clause",
1304
- "dependencies": {
1305
- "side-channel": "^1.1.0"
1306
- },
1307
- "engines": {
1308
- "node": ">=0.6"
1309
- },
1310
- "funding": {
1311
- "url": "https://github.com/sponsors/ljharb"
1312
- }
1313
- },
1314
- "node_modules/range-parser": {
1315
- "version": "1.2.1",
1316
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1317
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1318
- "license": "MIT",
1319
- "engines": {
1320
- "node": ">= 0.6"
1321
- }
1322
- },
1323
- "node_modules/raw-body": {
1324
- "version": "3.0.1",
1325
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
1326
- "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
1327
- "license": "MIT",
1328
- "dependencies": {
1329
- "bytes": "3.1.2",
1330
- "http-errors": "2.0.0",
1331
- "iconv-lite": "0.7.0",
1332
- "unpipe": "1.0.0"
1333
- },
1334
- "engines": {
1335
- "node": ">= 0.10"
1336
- }
1337
- },
1338
- "node_modules/raw-body/node_modules/iconv-lite": {
1339
- "version": "0.7.0",
1340
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
1341
- "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
1342
- "license": "MIT",
1343
- "dependencies": {
1344
- "safer-buffer": ">= 2.1.2 < 3.0.0"
1345
- },
1346
- "engines": {
1347
- "node": ">=0.10.0"
1348
- },
1349
- "funding": {
1350
- "type": "opencollective",
1351
- "url": "https://opencollective.com/express"
1352
- }
1353
- },
1354
- "node_modules/readable-stream": {
1355
- "version": "3.6.2",
1356
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1357
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1358
- "license": "MIT",
1359
- "dependencies": {
1360
- "inherits": "^2.0.3",
1361
- "string_decoder": "^1.1.1",
1362
- "util-deprecate": "^1.0.1"
1363
- },
1364
- "engines": {
1365
- "node": ">= 6"
1366
- }
1367
- },
1368
- "node_modules/router": {
1369
- "version": "2.2.0",
1370
- "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1371
- "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1372
- "license": "MIT",
1373
- "dependencies": {
1374
- "debug": "^4.4.0",
1375
- "depd": "^2.0.0",
1376
- "is-promise": "^4.0.0",
1377
- "parseurl": "^1.3.3",
1378
- "path-to-regexp": "^8.0.0"
1379
- },
1380
- "engines": {
1381
- "node": ">= 18"
1382
- }
1383
- },
1384
- "node_modules/safe-buffer": {
1385
- "version": "5.2.1",
1386
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1387
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1388
- "funding": [
1389
- {
1390
- "type": "github",
1391
- "url": "https://github.com/sponsors/feross"
1392
- },
1393
- {
1394
- "type": "patreon",
1395
- "url": "https://www.patreon.com/feross"
1396
- },
1397
- {
1398
- "type": "consulting",
1399
- "url": "https://feross.org/support"
1400
- }
1401
- ],
1402
- "license": "MIT"
1403
- },
1404
- "node_modules/safer-buffer": {
1405
- "version": "2.1.2",
1406
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1407
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1408
- "license": "MIT"
1409
- },
1410
- "node_modules/semver": {
1411
- "version": "7.7.2",
1412
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
1413
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
1414
- "license": "ISC",
1415
- "bin": {
1416
- "semver": "bin/semver.js"
1417
- },
1418
- "engines": {
1419
- "node": ">=10"
1420
- }
1421
- },
1422
- "node_modules/send": {
1423
- "version": "1.2.0",
1424
- "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
1425
- "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
1426
- "license": "MIT",
1427
- "dependencies": {
1428
- "debug": "^4.3.5",
1429
- "encodeurl": "^2.0.0",
1430
- "escape-html": "^1.0.3",
1431
- "etag": "^1.8.1",
1432
- "fresh": "^2.0.0",
1433
- "http-errors": "^2.0.0",
1434
- "mime-types": "^3.0.1",
1435
- "ms": "^2.1.3",
1436
- "on-finished": "^2.4.1",
1437
- "range-parser": "^1.2.1",
1438
- "statuses": "^2.0.1"
1439
- },
1440
- "engines": {
1441
- "node": ">= 18"
1442
- }
1443
- },
1444
- "node_modules/serve-static": {
1445
- "version": "2.2.0",
1446
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
1447
- "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
1448
- "license": "MIT",
1449
- "dependencies": {
1450
- "encodeurl": "^2.0.0",
1451
- "escape-html": "^1.0.3",
1452
- "parseurl": "^1.3.3",
1453
- "send": "^1.2.0"
1454
- },
1455
- "engines": {
1456
- "node": ">= 18"
1457
- }
1458
- },
1459
- "node_modules/setprototypeof": {
1460
- "version": "1.2.0",
1461
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1462
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1463
- "license": "ISC"
1464
- },
1465
- "node_modules/side-channel": {
1466
- "version": "1.1.0",
1467
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1468
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1469
- "license": "MIT",
1470
- "dependencies": {
1471
- "es-errors": "^1.3.0",
1472
- "object-inspect": "^1.13.3",
1473
- "side-channel-list": "^1.0.0",
1474
- "side-channel-map": "^1.0.1",
1475
- "side-channel-weakmap": "^1.0.2"
1476
- },
1477
- "engines": {
1478
- "node": ">= 0.4"
1479
- },
1480
- "funding": {
1481
- "url": "https://github.com/sponsors/ljharb"
1482
- }
1483
- },
1484
- "node_modules/side-channel-list": {
1485
- "version": "1.0.0",
1486
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1487
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1488
- "license": "MIT",
1489
- "dependencies": {
1490
- "es-errors": "^1.3.0",
1491
- "object-inspect": "^1.13.3"
1492
- },
1493
- "engines": {
1494
- "node": ">= 0.4"
1495
- },
1496
- "funding": {
1497
- "url": "https://github.com/sponsors/ljharb"
1498
- }
1499
- },
1500
- "node_modules/side-channel-map": {
1501
- "version": "1.0.1",
1502
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1503
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1504
- "license": "MIT",
1505
- "dependencies": {
1506
- "call-bound": "^1.0.2",
1507
- "es-errors": "^1.3.0",
1508
- "get-intrinsic": "^1.2.5",
1509
- "object-inspect": "^1.13.3"
1510
- },
1511
- "engines": {
1512
- "node": ">= 0.4"
1513
- },
1514
- "funding": {
1515
- "url": "https://github.com/sponsors/ljharb"
1516
- }
1517
- },
1518
- "node_modules/side-channel-weakmap": {
1519
- "version": "1.0.2",
1520
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1521
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1522
- "license": "MIT",
1523
- "dependencies": {
1524
- "call-bound": "^1.0.2",
1525
- "es-errors": "^1.3.0",
1526
- "get-intrinsic": "^1.2.5",
1527
- "object-inspect": "^1.13.3",
1528
- "side-channel-map": "^1.0.1"
1529
- },
1530
- "engines": {
1531
- "node": ">= 0.4"
1532
- },
1533
- "funding": {
1534
- "url": "https://github.com/sponsors/ljharb"
1535
- }
1536
- },
1537
- "node_modules/sift": {
1538
- "version": "17.1.3",
1539
- "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
1540
- "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
1541
- "license": "MIT"
1542
- },
1543
- "node_modules/socket.io": {
1544
- "version": "4.8.1",
1545
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
1546
- "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
1547
- "license": "MIT",
1548
- "dependencies": {
1549
- "accepts": "~1.3.4",
1550
- "base64id": "~2.0.0",
1551
- "cors": "~2.8.5",
1552
- "debug": "~4.3.2",
1553
- "engine.io": "~6.6.0",
1554
- "socket.io-adapter": "~2.5.2",
1555
- "socket.io-parser": "~4.2.4"
1556
- },
1557
- "engines": {
1558
- "node": ">=10.2.0"
1559
- }
1560
- },
1561
- "node_modules/socket.io-adapter": {
1562
- "version": "2.5.5",
1563
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
1564
- "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
1565
- "license": "MIT",
1566
- "dependencies": {
1567
- "debug": "~4.3.4",
1568
- "ws": "~8.17.1"
1569
- }
1570
- },
1571
- "node_modules/socket.io-adapter/node_modules/debug": {
1572
- "version": "4.3.7",
1573
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1574
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1575
- "license": "MIT",
1576
- "dependencies": {
1577
- "ms": "^2.1.3"
1578
- },
1579
- "engines": {
1580
- "node": ">=6.0"
1581
- },
1582
- "peerDependenciesMeta": {
1583
- "supports-color": {
1584
- "optional": true
1585
- }
1586
- }
1587
- },
1588
- "node_modules/socket.io-parser": {
1589
- "version": "4.2.4",
1590
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
1591
- "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
1592
- "license": "MIT",
1593
- "dependencies": {
1594
- "@socket.io/component-emitter": "~3.1.0",
1595
- "debug": "~4.3.1"
1596
- },
1597
- "engines": {
1598
- "node": ">=10.0.0"
1599
- }
1600
- },
1601
- "node_modules/socket.io-parser/node_modules/debug": {
1602
- "version": "4.3.7",
1603
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1604
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1605
- "license": "MIT",
1606
- "dependencies": {
1607
- "ms": "^2.1.3"
1608
- },
1609
- "engines": {
1610
- "node": ">=6.0"
1611
- },
1612
- "peerDependenciesMeta": {
1613
- "supports-color": {
1614
- "optional": true
1615
- }
1616
- }
1617
- },
1618
- "node_modules/socket.io/node_modules/accepts": {
1619
- "version": "1.3.8",
1620
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1621
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1622
- "license": "MIT",
1623
- "dependencies": {
1624
- "mime-types": "~2.1.34",
1625
- "negotiator": "0.6.3"
1626
- },
1627
- "engines": {
1628
- "node": ">= 0.6"
1629
- }
1630
- },
1631
- "node_modules/socket.io/node_modules/debug": {
1632
- "version": "4.3.7",
1633
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1634
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1635
- "license": "MIT",
1636
- "dependencies": {
1637
- "ms": "^2.1.3"
1638
- },
1639
- "engines": {
1640
- "node": ">=6.0"
1641
- },
1642
- "peerDependenciesMeta": {
1643
- "supports-color": {
1644
- "optional": true
1645
- }
1646
- }
1647
- },
1648
- "node_modules/socket.io/node_modules/mime-db": {
1649
- "version": "1.52.0",
1650
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1651
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1652
- "license": "MIT",
1653
- "engines": {
1654
- "node": ">= 0.6"
1655
- }
1656
- },
1657
- "node_modules/socket.io/node_modules/mime-types": {
1658
- "version": "2.1.35",
1659
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1660
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1661
- "license": "MIT",
1662
- "dependencies": {
1663
- "mime-db": "1.52.0"
1664
- },
1665
- "engines": {
1666
- "node": ">= 0.6"
1667
- }
1668
- },
1669
- "node_modules/socket.io/node_modules/negotiator": {
1670
- "version": "0.6.3",
1671
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1672
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1673
- "license": "MIT",
1674
- "engines": {
1675
- "node": ">= 0.6"
1676
- }
1677
- },
1678
- "node_modules/sparse-bitfield": {
1679
- "version": "3.0.3",
1680
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1681
- "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1682
- "license": "MIT",
1683
- "dependencies": {
1684
- "memory-pager": "^1.0.2"
1685
- }
1686
- },
1687
- "node_modules/statuses": {
1688
- "version": "2.0.2",
1689
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1690
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1691
- "license": "MIT",
1692
- "engines": {
1693
- "node": ">= 0.8"
1694
- }
1695
- },
1696
- "node_modules/streamsearch": {
1697
- "version": "1.1.0",
1698
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1699
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1700
- "engines": {
1701
- "node": ">=10.0.0"
1702
- }
1703
- },
1704
- "node_modules/string_decoder": {
1705
- "version": "1.3.0",
1706
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1707
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1708
- "license": "MIT",
1709
- "dependencies": {
1710
- "safe-buffer": "~5.2.0"
1711
- }
1712
- },
1713
- "node_modules/toidentifier": {
1714
- "version": "1.0.1",
1715
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1716
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1717
- "license": "MIT",
1718
- "engines": {
1719
- "node": ">=0.6"
1720
- }
1721
- },
1722
- "node_modules/tr46": {
1723
- "version": "5.1.1",
1724
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
1725
- "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
1726
- "license": "MIT",
1727
- "dependencies": {
1728
- "punycode": "^2.3.1"
1729
- },
1730
- "engines": {
1731
- "node": ">=18"
1732
- }
1733
- },
1734
- "node_modules/type-is": {
1735
- "version": "2.0.1",
1736
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1737
- "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1738
- "license": "MIT",
1739
- "dependencies": {
1740
- "content-type": "^1.0.5",
1741
- "media-typer": "^1.1.0",
1742
- "mime-types": "^3.0.0"
1743
- },
1744
- "engines": {
1745
- "node": ">= 0.6"
1746
- }
1747
- },
1748
- "node_modules/typedarray": {
1749
- "version": "0.0.6",
1750
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1751
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1752
- "license": "MIT"
1753
- },
1754
- "node_modules/undici-types": {
1755
- "version": "7.12.0",
1756
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz",
1757
- "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==",
1758
- "license": "MIT"
1759
- },
1760
- "node_modules/unpipe": {
1761
- "version": "1.0.0",
1762
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1763
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1764
- "license": "MIT",
1765
- "engines": {
1766
- "node": ">= 0.8"
1767
- }
1768
- },
1769
- "node_modules/util-deprecate": {
1770
- "version": "1.0.2",
1771
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1772
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1773
- "license": "MIT"
1774
- },
1775
- "node_modules/vary": {
1776
- "version": "1.1.2",
1777
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1778
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1779
- "license": "MIT",
1780
- "engines": {
1781
- "node": ">= 0.8"
1782
- }
1783
- },
1784
- "node_modules/webidl-conversions": {
1785
- "version": "7.0.0",
1786
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1787
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1788
- "license": "BSD-2-Clause",
1789
- "engines": {
1790
- "node": ">=12"
1791
- }
1792
- },
1793
- "node_modules/whatwg-url": {
1794
- "version": "14.2.0",
1795
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
1796
- "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
1797
- "license": "MIT",
1798
- "dependencies": {
1799
- "tr46": "^5.1.0",
1800
- "webidl-conversions": "^7.0.0"
1801
- },
1802
- "engines": {
1803
- "node": ">=18"
1804
- }
1805
- },
1806
- "node_modules/wrappy": {
1807
- "version": "1.0.2",
1808
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1809
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1810
- "license": "ISC"
1811
- },
1812
- "node_modules/ws": {
1813
- "version": "8.17.1",
1814
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
1815
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
1816
- "license": "MIT",
1817
- "engines": {
1818
- "node": ">=10.0.0"
1819
- },
1820
- "peerDependencies": {
1821
- "bufferutil": "^4.0.1",
1822
- "utf-8-validate": ">=5.0.2"
1823
- },
1824
- "peerDependenciesMeta": {
1825
- "bufferutil": {
1826
- "optional": true
1827
- },
1828
- "utf-8-validate": {
1829
- "optional": true
1830
- }
1831
- }
1832
- },
1833
- "node_modules/xtend": {
1834
- "version": "4.0.2",
1835
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1836
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1837
- "license": "MIT",
1838
- "engines": {
1839
- "node": ">=0.4"
1840
- }
1841
- }
1842
- }
1843
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CARTABON1/package.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "name": "backend",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "server.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1",
8
- "start": "node server.js"
9
- },
10
- "keywords": [],
11
- "author": "",
12
- "license": "ISC",
13
- "type": "module",
14
- "dependencies": {
15
- "axios": "^1.12.2",
16
- "bcrypt": "^6.0.0",
17
- "bcryptjs": "^3.0.2",
18
- "cors": "^2.8.5",
19
- "dotenv": "^17.2.2",
20
- "express": "^5.1.0",
21
- "jsonwebtoken": "^9.0.2",
22
- "mongoose": "^8.18.1",
23
- "multer": "^2.0.2",
24
- "nodemailer": "^7.0.6",
25
- "socket.io": "^4.8.1"
26
- },
27
- "devDependencies": {},
28
- "repository": {
29
- "type": "git",
30
- "url": "git+https://github.com/BelikanM/CARTABON1.git"
31
- },
32
- "bugs": {
33
- "url": "https://github.com/BelikanM/CARTABON1/issues"
34
- },
35
- "homepage": "https://github.com/BelikanM/CARTABON1#readme"
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
CARTABON1/server.js DELETED
@@ -1,295 +0,0 @@
1
- // server.js (ou index.js)
2
- import express from "express";
3
- import mongoose from "mongoose";
4
- import dotenv from "dotenv";
5
- import cors from "cors";
6
- import http from "http";
7
- import { Server } from "socket.io";
8
- import bcrypt from "bcrypt";
9
- import jwt from "jsonwebtoken";
10
- import multer from "multer";
11
- import path from "path";
12
- import fs from "fs";
13
- import crypto from "crypto";
14
-
15
- dotenv.config();
16
-
17
- const app = express();
18
- const server = http.createServer(app);
19
- const io = new Server(server, {
20
- cors: {
21
- origin: "*",
22
- methods: ["GET", "POST", "PATCH"]
23
- }
24
- });
25
-
26
- app.use(express.json({ limit: "50mb" }));
27
- app.use(cors());
28
- app.use("/uploads", express.static(path.join(process.cwd(), "uploads")));
29
-
30
- if (!fs.existsSync("uploads")) {
31
- fs.mkdirSync("uploads");
32
- }
33
-
34
- const storage = multer.diskStorage({
35
- destination: (req, file, cb) => cb(null, "uploads/"),
36
- filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname)
37
- });
38
- const upload = multer({ storage });
39
-
40
- // =========================
41
- // MongoDB Connection
42
- // =========================
43
- mongoose
44
- .connect(process.env.MONGO_URI)
45
- .then(() => console.log("MongoDB connecté avec succès ✅"))
46
- .catch(err => console.error("Erreur connexion MongoDB ❌:", err));
47
-
48
- // =========================
49
- // Modèles
50
- // =========================
51
- const userSchema = new mongoose.Schema({
52
- name: { type: String, required: true },
53
- email: { type: String, required: true, unique: true, lowercase: true },
54
- password: { type: String }, // hashé ou null si OTP uniquement
55
- latitude: { type: Number, default: 0 },
56
- longitude: { type: Number, default: 0 },
57
- otp: { type: String }, // OTP temporaire
58
- otpExpires: { type: Date }, // expiration OTP
59
- createdAt: { type: Date, default: Date.now }
60
- });
61
-
62
- const User = mongoose.model("User", userSchema);
63
-
64
- const markerSchema = new mongoose.Schema({
65
- latitude: { type: Number, required: true },
66
- longitude: { type: Number, required: true },
67
- title: { type: String, default: "" },
68
- comment: { type: String, default: "" },
69
- color: { type: String, default: "#ff0000" },
70
- photos: { type: [String], default: [] },
71
- videos: { type: [String], default: [] },
72
- createdBy: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
73
- createdAt: { type: Date, default: Date.now }
74
- });
75
- const Marker = mongoose.model("Marker", markerSchema);
76
-
77
- // =========================
78
- // Helpers
79
- // =========================
80
- const generateOTP = () => Math.floor(100000 + Math.random() * 900000).toString();
81
-
82
- const sendOTPByEmail = async (email, otp) => {
83
- // À intégrer avec Nodemailer, SMTP, ou service comme Brevo/SendGrid
84
- console.log(`📧 OTP pour ${email} : ${otp}`); // Simulation en console
85
- // Exemple avec Nodemailer (à décommenter et configurer)
86
- /*
87
- const transporter = nodemailer.createTransport({
88
- host: "smtp.gmail.com",
89
- port: 587,
90
- auth: { user: "tonemail@gmail.com", pass: "app-password" }
91
- });
92
- await transporter.sendMail({
93
- from: "Kibali <no-reply@kibali.ga>",
94
- to: email,
95
- subject: "Votre code OTP Kibali",
96
- text: `Votre code de connexion est : ${otp}\nValable 10 minutes.`
97
- });
98
- */
99
- };
100
-
101
- // =========================
102
- // Routes Auth avec OTP
103
- // =========================
104
- app.post("/auth/request-otp", async (req, res) => {
105
- try {
106
- const { email, name } = req.body;
107
- if (!email) return res.status(400).json({ message: "Email requis" });
108
-
109
- let user = await User.findOne({ email });
110
- if (!user) {
111
- user = await User.create({ email, name: name || email.split("@")[0], password: null });
112
- }
113
-
114
- const otp = generateOTP();
115
- user.otp = otp;
116
- user.otpExpires = Date.now() + 10 * 60 * 1000; // 10 minutes
117
- await user.save();
118
-
119
- await sendOTPByEmail(email, otp);
120
-
121
- res.json({ message: "OTP envoyé à votre email" });
122
- } catch (err) {
123
- console.error(err);
124
- res.status(500).json({ message: "Erreur serveur" });
125
- }
126
- });
127
-
128
- app.post("/auth/verify-otp", async (req, res) => {
129
- try {
130
- const { email, otp } = req.body;
131
- const user = await User.findOne({ email });
132
-
133
- if (!user || !user.otp || user.otp !== otp || user.otpExpires < Date.now()) {
134
- return res.status(400).json({ message: "OTP invalide ou expiré" });
135
- }
136
-
137
- // OTP valide → générer JWT
138
- const token = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: "7d" });
139
-
140
- // Nettoyer OTP
141
- user.otp = undefined;
142
- user.otpExpires = undefined;
143
- await user.save();
144
-
145
- res.json({
146
- token,
147
- user: {
148
- _id: user._id,
149
- name: user.name,
150
- email: user.email,
151
- latitude: user.latitude,
152
- longitude: user.longitude
153
- }
154
- });
155
- } catch (err) {
156
- console.error(err);
157
- res.status(500).json({ message: "Erreur serveur" });
158
- }
159
- });
160
-
161
- // =========================
162
- // Routes protégées (vérification JWT)
163
- // =========================
164
- const authenticateToken = (req, res, next) => {
165
- const authHeader = req.headers["authorization"];
166
- const token = authHeader && authHeader.split(" ")[1];
167
- if (!token) return res.status(401).json({ message: "Accès refusé" });
168
-
169
- jwt.verify(token, process.env.JWT_SECRET, (err, payload) => {
170
- if (err) return res.status(403).json({ message: "Token invalide" });
171
- req.userId = payload.userId;
172
- next();
173
- });
174
- };
175
-
176
- // Mise à jour position utilisateur
177
- app.post("/update-position", authenticateToken, async (req, res) => {
178
- try {
179
- const { latitude, longitude } = req.body;
180
- const user = await User.findByIdAndUpdate(
181
- req.userId,
182
- { latitude, longitude },
183
- { new: true }
184
- );
185
- res.json({ latitude: user.latitude, longitude: user.longitude });
186
- } catch (err) {
187
- res.status(500).json({ message: err.message });
188
- }
189
- });
190
-
191
- // =========================
192
- // Routes Markers
193
- // =========================
194
- app.get("/markers", async (req, res) => {
195
- try {
196
- const markers = await Marker.find().populate("createdBy", "name email");
197
- res.json(markers);
198
- } catch (err) {
199
- res.status(500).json({ error: err.message });
200
- }
201
- });
202
-
203
- app.post("/markers", authenticateToken, upload.fields([
204
- { name: "photos", maxCount: 10 },
205
- { name: "videos", maxCount: 10 }
206
- ]), async (req, res) => {
207
- try {
208
- const { latitude, longitude, title, comment, color } = req.body;
209
- const photos = req.files.photos ? req.files.photos.map(f => `/uploads/${f.filename}`) : [];
210
- const videos = req.files.videos ? req.files.videos.map(f => `/uploads/${f.filename}`) : [];
211
-
212
- const marker = await Marker.create({
213
- latitude: parseFloat(latitude),
214
- longitude: parseFloat(longitude),
215
- title,
216
- comment,
217
- color,
218
- photos,
219
- videos,
220
- createdBy: req.userId
221
- });
222
-
223
- const populated = await marker.populate("createdBy", "name email");
224
- io.emit("newMarker", populated);
225
- res.status(201).json(populated);
226
- } catch (err) {
227
- console.error(err);
228
- res.status(500).json({ message: err.message });
229
- }
230
- });
231
-
232
- app.patch("/markers/:id", authenticateToken, upload.fields([
233
- { name: "photos", maxCount: 10 },
234
- { name: "videos", maxCount: 10 }
235
- ]), async (req, res) => {
236
- try {
237
- const marker = await Marker.findById(req.params.id);
238
- if (!marker) return res.status(404).json({ message: "Marqueur non trouvé" });
239
-
240
- const updates = req.body;
241
- if (updates.title !== undefined) marker.title = updates.title;
242
- if (updates.comment !== undefined) marker.comment = updates.comment;
243
- if (updates.color !== undefined) marker.color = updates.color;
244
- if (req.files.photos) marker.photos.push(...req.files.photos.map(f => `/uploads/${f.filename}`));
245
- if (req.files.videos) marker.videos.push(...req.files.videos.map(f => `/uploads/${f.filename}`));
246
-
247
- await marker.save();
248
- const populated = await marker.populate("createdBy", "name email");
249
- io.emit("updatedMarker", populated);
250
- res.json(populated);
251
- } catch (err) {
252
- res.status(500).json({ message: err.message });
253
- }
254
- });
255
-
256
- // =========================
257
- // Socket.IO
258
- // =========================
259
- io.on("connection", (socket) => {
260
- console.log("Client connecté:", socket.id);
261
-
262
- // Envoyer tous les marqueurs au nouveau client
263
- Marker.find().populate("createdBy", "name email").then(markers => {
264
- socket.emit("allMarkers", markers);
265
- });
266
-
267
- // Mise à jour position en temps réel
268
- socket.on("updatePosition", async ({ userId, latitude, longitude }) => {
269
- try {
270
- const user = await User.findByIdAndUpdate(userId, { latitude, longitude }, { new: true });
271
- if (user) {
272
- io.emit("positionsUpdate", {
273
- userId: user._id,
274
- name: user.name,
275
- latitude,
276
- longitude
277
- });
278
- }
279
- } catch (err) {
280
- console.error("Erreur position:", err);
281
- }
282
- });
283
-
284
- socket.on("disconnect", () => {
285
- console.log("Client déconnecté:", socket.id);
286
- });
287
- });
288
-
289
- // =========================
290
- // Démarrage
291
- // =========================
292
- const PORT = process.env.PORT || 8000;
293
- server.listen(PORT, () => {
294
- console.log(`🚀 Serveur Kibali démarré sur http://localhost:${PORT}`);
295
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
kibali-ui/eslint.config.js → eslint.config.js RENAMED
File without changes
kibali-ui/index.html → index.html RENAMED
File without changes
kibali-ui/.gitignore DELETED
@@ -1,24 +0,0 @@
1
- # Logs
2
- logs
3
- *.log
4
- npm-debug.log*
5
- yarn-debug.log*
6
- yarn-error.log*
7
- pnpm-debug.log*
8
- lerna-debug.log*
9
-
10
- node_modules
11
- dist
12
- dist-ssr
13
- *.local
14
-
15
- # Editor directories and files
16
- .vscode/*
17
- !.vscode/extensions.json
18
- .idea
19
- .DS_Store
20
- *.suo
21
- *.ntvs*
22
- *.njsproj
23
- *.sln
24
- *.sw?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
kibali-ui/README.md DELETED
@@ -1,16 +0,0 @@
1
- # React + Vite
2
-
3
- This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
-
5
- Currently, two official plugins are available:
6
-
7
- - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
- - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
-
10
- ## React Compiler
11
-
12
- The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
-
14
- ## Expanding the ESLint configuration
15
-
16
- If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
kibali-ui/public/kibali_logo.svg DELETED
launch.bat ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ @echo off
2
+ for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr /R /C:"IPv4 Address"') do set ip=%%i
3
+ set ip=%ip:~1%
4
+ echo Lancement de Streamlit sur %ip%:8501
5
+ "C:/Program Files/Epic Games/UE_5.7/Engine/Binaries/ThirdParty/Python3/Win64/python.exe" -m streamlit run main.py --server.address %ip% --server.port 8501
6
+ pause
launch.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import socket
2
+ import subprocess
3
+ import sys
4
+ import os
5
+
6
+ def get_local_ip():
7
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
8
+ try:
9
+ s.connect(("8.8.8.8", 80))
10
+ ip = s.getsockname()[0]
11
+ except:
12
+ ip = "127.0.0.1"
13
+ finally:
14
+ s.close()
15
+ return ip
16
+
17
+ if __name__ == "__main__":
18
+ ip = get_local_ip()
19
+ port = 8501
20
+ print(f"Lancement de Streamlit sur {ip}:{port}")
21
+ cmd = [sys.executable, "-m", "streamlit", "run", "main.py", "--server.address", ip, "--server.port", str(port)]
22
+ subprocess.run(cmd)
main.py CHANGED
@@ -19,7 +19,7 @@ import base64
19
  # --- CONFIGURATION PAGE ---
20
  st.set_page_config(
21
  page_title="Kibali AI - Assistant IA du Gabon",
22
- page_icon="kibali_logo.png",
23
  layout="wide"
24
  )
25
 
@@ -50,7 +50,7 @@ from tools.todo import execute_reflection_plan
50
  from tools.geo import get_geo_context
51
 
52
  # --- CHARGEMENT DES MODÈLES ---
53
- HF_MODEL_ID = "C:/Users/Admin/Desktop/logiciel/qwen_model"
54
  CACHE_DIR = "/data/cache"
55
  os.makedirs(CACHE_DIR, exist_ok=True)
56
 
@@ -98,12 +98,6 @@ model = load_model()
98
 
99
  # --- BASES VECTORIELLES ---
100
  dimension = 384
101
- INDEX_FILE = "faiss_index.idx"
102
- CHUNKS_FILE = "doc_chunks.json"
103
- METADATA_FILE = "doc_metadata.json"
104
- MEMORY_INDEX_FILE = "memory_index.idx"
105
- MEMORY_TEXTS_FILE = "memory_texts.json"
106
- MEMORY_METADATA_FILE = "memory_metadata.json"
107
  if 'doc_index' not in st.session_state:
108
  st.session_state.doc_index = faiss.IndexFlatL2(dimension)
109
  st.session_state.doc_chunks = []
 
19
  # --- CONFIGURATION PAGE ---
20
  st.set_page_config(
21
  page_title="Kibali AI - Assistant IA du Gabon",
22
+ page_icon="kibali_logo.svg",
23
  layout="wide"
24
  )
25
 
 
50
  from tools.geo import get_geo_context
51
 
52
  # --- CHARGEMENT DES MODÈLES ---
53
+ HF_MODEL_ID = "C:/Users/Admin/Desktop/logiciel/kibali-api/qwen_model"
54
  CACHE_DIR = "/data/cache"
55
  os.makedirs(CACHE_DIR, exist_ok=True)
56
 
 
98
 
99
  # --- BASES VECTORIELLES ---
100
  dimension = 384
 
 
 
 
 
 
101
  if 'doc_index' not in st.session_state:
102
  st.session_state.doc_index = faiss.IndexFlatL2(dimension)
103
  st.session_state.doc_chunks = []
kibali-ui/package-lock.json → package-lock.json RENAMED
@@ -8,23 +8,30 @@
8
  "name": "kibali-ui",
9
  "version": "0.0.0",
10
  "dependencies": {
 
11
  "axios": "^1.13.2",
12
  "bcrypt": "^6.0.0",
 
 
 
13
  "cors": "^2.8.5",
14
  "dotenv": "^17.2.3",
15
  "express": "^5.2.1",
16
  "firebase": "^12.7.0",
 
17
  "jsonwebtoken": "^9.0.3",
18
  "leaflet": "^1.9.4",
19
  "lucide-react": "^0.562.0",
20
- "mongoose": "^9.1.0",
21
  "multer": "^2.0.2",
 
22
  "react": "^19.2.0",
23
  "react-dom": "^19.2.0",
24
  "react-leaflet": "^5.0.0",
25
  "react-markdown": "^10.1.0",
26
  "socket.io": "^4.8.3",
27
- "socket.io-client": "^4.8.3"
 
28
  },
29
  "devDependencies": {
30
  "@eslint/js": "^9.39.1",
@@ -922,6 +929,12 @@
922
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
923
  }
924
  },
 
 
 
 
 
 
925
  "node_modules/@firebase/ai": {
926
  "version": "2.6.1",
927
  "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.6.1.tgz",
@@ -1530,6 +1543,94 @@
1530
  "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==",
1531
  "license": "Apache-2.0"
1532
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1533
  "node_modules/@grpc/grpc-js": {
1534
  "version": "1.9.15",
1535
  "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz",
@@ -1613,6 +1714,116 @@
1613
  "url": "https://github.com/sponsors/nzakas"
1614
  }
1615
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1616
  "node_modules/@jridgewell/gen-mapping": {
1617
  "version": "0.3.13",
1618
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -1663,6 +1874,17 @@
1663
  "@jridgewell/sourcemap-codec": "^1.4.14"
1664
  }
1665
  },
 
 
 
 
 
 
 
 
 
 
 
1666
  "node_modules/@mongodb-js/saslprep": {
1667
  "version": "1.4.4",
1668
  "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.4.tgz",
@@ -1672,6 +1894,27 @@
1672
  "sparse-bitfield": "^3.0.3"
1673
  }
1674
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1675
  "node_modules/@protobufjs/aspromise": {
1676
  "version": "1.1.2",
1677
  "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -2062,12 +2305,28 @@
2062
  "win32"
2063
  ]
2064
  },
 
 
 
 
 
 
2065
  "node_modules/@socket.io/component-emitter": {
2066
  "version": "3.1.2",
2067
  "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
2068
  "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
2069
  "license": "MIT"
2070
  },
 
 
 
 
 
 
 
 
 
 
2071
  "node_modules/@types/babel__core": {
2072
  "version": "7.20.5",
2073
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -2113,6 +2372,32 @@
2113
  "@babel/types": "^7.28.2"
2114
  }
2115
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2116
  "node_modules/@types/cors": {
2117
  "version": "2.8.19",
2118
  "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
@@ -2146,6 +2431,30 @@
2146
  "@types/estree": "*"
2147
  }
2148
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2149
  "node_modules/@types/hast": {
2150
  "version": "3.0.4",
2151
  "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@@ -2155,6 +2464,12 @@
2155
  "@types/unist": "*"
2156
  }
2157
  },
 
 
 
 
 
 
2158
  "node_modules/@types/json-schema": {
2159
  "version": "7.0.15",
2160
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2162,6 +2477,23 @@
2162
  "dev": true,
2163
  "license": "MIT"
2164
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2165
  "node_modules/@types/mdast": {
2166
  "version": "4.0.4",
2167
  "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
@@ -2171,6 +2503,12 @@
2171
  "@types/unist": "*"
2172
  }
2173
  },
 
 
 
 
 
 
2174
  "node_modules/@types/ms": {
2175
  "version": "2.1.0",
2176
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
@@ -2186,6 +2524,18 @@
2186
  "undici-types": "~7.16.0"
2187
  }
2188
  },
 
 
 
 
 
 
 
 
 
 
 
 
2189
  "node_modules/@types/react": {
2190
  "version": "19.2.7",
2191
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
@@ -2205,6 +2555,74 @@
2205
  "@types/react": "^19.2.0"
2206
  }
2207
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2208
  "node_modules/@types/unist": {
2209
  "version": "3.0.3",
2210
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@@ -2253,6 +2671,19 @@
2253
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
2254
  }
2255
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2256
  "node_modules/accepts": {
2257
  "version": "2.0.0",
2258
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -2314,6 +2745,15 @@
2314
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
2315
  }
2316
  },
 
 
 
 
 
 
 
 
 
2317
  "node_modules/ajv": {
2318
  "version": "6.12.6",
2319
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -2368,6 +2808,26 @@
2368
  "dev": true,
2369
  "license": "Python-2.0"
2370
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2371
  "node_modules/asynckit": {
2372
  "version": "0.4.0",
2373
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -2436,7 +2896,27 @@
2436
  "version": "1.0.2",
2437
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2438
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2439
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2440
  "license": "MIT"
2441
  },
2442
  "node_modules/base64id": {
@@ -2472,6 +2952,24 @@
2472
  "node": ">= 18"
2473
  }
2474
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2475
  "node_modules/body-parser": {
2476
  "version": "2.2.1",
2477
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
@@ -2723,10 +3221,23 @@
2723
  "node": ">=12"
2724
  }
2725
  },
2726
- "node_modules/color-convert": {
2727
- "version": "2.0.1",
2728
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2729
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
 
 
 
 
 
 
 
 
 
 
 
 
2730
  "license": "MIT",
2731
  "dependencies": {
2732
  "color-name": "~1.1.4"
@@ -2849,7 +3360,7 @@
2849
  "version": "7.0.6",
2850
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2851
  "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2852
- "dev": true,
2853
  "license": "MIT",
2854
  "dependencies": {
2855
  "path-key": "^3.1.0",
@@ -2866,6 +3377,17 @@
2866
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
2867
  "license": "MIT"
2868
  },
 
 
 
 
 
 
 
 
 
 
 
2869
  "node_modules/debug": {
2870
  "version": "4.4.3",
2871
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -2969,6 +3491,27 @@
2969
  "node": ">= 0.4"
2970
  }
2971
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2972
  "node_modules/ecdsa-sig-formatter": {
2973
  "version": "1.0.11",
2974
  "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -3006,6 +3549,16 @@
3006
  "node": ">= 0.8"
3007
  }
3008
  },
 
 
 
 
 
 
 
 
 
 
3009
  "node_modules/engine.io": {
3010
  "version": "6.6.5",
3011
  "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz",
@@ -3388,6 +3941,16 @@
3388
  "node": ">= 0.6"
3389
  }
3390
  },
 
 
 
 
 
 
 
 
 
 
3391
  "node_modules/express": {
3392
  "version": "5.2.1",
3393
  "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
@@ -3462,11 +4025,19 @@
3462
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
3463
  "license": "MIT"
3464
  },
 
 
 
 
 
 
 
 
 
3465
  "node_modules/fast-deep-equal": {
3466
  "version": "3.1.3",
3467
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
3468
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
3469
- "dev": true,
3470
  "license": "MIT"
3471
  },
3472
  "node_modules/fast-json-stable-stringify": {
@@ -3483,6 +4054,25 @@
3483
  "dev": true,
3484
  "license": "MIT"
3485
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3486
  "node_modules/faye-websocket": {
3487
  "version": "0.11.4",
3488
  "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
@@ -3513,6 +4103,31 @@
3513
  }
3514
  }
3515
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3516
  "node_modules/file-entry-cache": {
3517
  "version": "8.0.0",
3518
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@@ -3600,6 +4215,47 @@
3600
  "@firebase/util": "1.13.0"
3601
  }
3602
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3603
  "node_modules/flat-cache": {
3604
  "version": "4.0.1",
3605
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -3641,6 +4297,24 @@
3641
  }
3642
  }
3643
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3644
  "node_modules/form-data": {
3645
  "version": "4.0.5",
3646
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
@@ -3657,6 +4331,20 @@
3657
  "node": ">= 6"
3658
  }
3659
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3660
  "node_modules/forwarded": {
3661
  "version": "0.2.0",
3662
  "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -3713,6 +4401,95 @@
3713
  "url": "https://github.com/sponsors/ljharb"
3714
  }
3715
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3716
  "node_modules/gensync": {
3717
  "version": "1.0.0-beta.2",
3718
  "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -3769,6 +4546,28 @@
3769
  "node": ">= 0.4"
3770
  }
3771
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3772
  "node_modules/glob-parent": {
3773
  "version": "6.0.2",
3774
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -3782,6 +4581,34 @@
3782
  "node": ">=10.13.0"
3783
  }
3784
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3785
  "node_modules/globals": {
3786
  "version": "16.5.0",
3787
  "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
@@ -3795,6 +4622,128 @@
3795
  "url": "https://github.com/sponsors/sindresorhus"
3796
  }
3797
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3798
  "node_modules/gopd": {
3799
  "version": "1.2.0",
3800
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -3807,6 +4756,19 @@
3807
  "url": "https://github.com/sponsors/ljharb"
3808
  }
3809
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3810
  "node_modules/has-flag": {
3811
  "version": "4.0.0",
3812
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -3913,6 +4875,23 @@
3913
  "hermes-estree": "0.25.1"
3914
  }
3915
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3916
  "node_modules/html-url-attributes": {
3917
  "version": "3.0.1",
3918
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -3949,6 +4928,47 @@
3949
  "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
3950
  "license": "MIT"
3951
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3952
  "node_modules/iconv-lite": {
3953
  "version": "0.7.1",
3954
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
@@ -4123,13 +5143,51 @@
4123
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
4124
  "license": "MIT"
4125
  },
 
 
 
 
 
 
 
 
 
 
 
 
4126
  "node_modules/isexe": {
4127
  "version": "2.0.0",
4128
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
4129
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
4130
- "dev": true,
4131
  "license": "ISC"
4132
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4133
  "node_modules/js-tokens": {
4134
  "version": "4.0.0",
4135
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4163,6 +5221,15 @@
4163
  "node": ">=6"
4164
  }
4165
  },
 
 
 
 
 
 
 
 
 
4166
  "node_modules/json-buffer": {
4167
  "version": "3.0.1",
4168
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -4242,6 +5309,23 @@
4242
  "safe-buffer": "^5.0.1"
4243
  }
4244
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4245
  "node_modules/jws": {
4246
  "version": "4.0.1",
4247
  "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
@@ -4291,6 +5375,11 @@
4291
  "node": ">= 0.8.0"
4292
  }
4293
  },
 
 
 
 
 
4294
  "node_modules/locate-path": {
4295
  "version": "6.0.0",
4296
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -4307,12 +5396,24 @@
4307
  "url": "https://github.com/sponsors/sindresorhus"
4308
  }
4309
  },
 
 
 
 
 
 
4310
  "node_modules/lodash.camelcase": {
4311
  "version": "4.3.0",
4312
  "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
4313
  "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
4314
  "license": "MIT"
4315
  },
 
 
 
 
 
 
4316
  "node_modules/lodash.includes": {
4317
  "version": "4.3.0",
4318
  "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@@ -4388,6 +5489,34 @@
4388
  "yallist": "^3.0.2"
4389
  }
4390
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4391
  "node_modules/lucide-react": {
4392
  "version": "0.562.0",
4393
  "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz",
@@ -5028,6 +6157,19 @@
5028
  ],
5029
  "license": "MIT"
5030
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
5031
  "node_modules/mime-db": {
5032
  "version": "1.52.0",
5033
  "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -5071,6 +6213,17 @@
5071
  "url": "https://github.com/sponsors/ljharb"
5072
  }
5073
  },
 
 
 
 
 
 
 
 
 
 
 
5074
  "node_modules/mkdirp": {
5075
  "version": "0.5.6",
5076
  "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -5143,9 +6296,9 @@
5143
  }
5144
  },
5145
  "node_modules/mongoose": {
5146
- "version": "9.1.0",
5147
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.1.0.tgz",
5148
- "integrity": "sha512-RVCApwqD6q+O3rsnypmiL1K5+mkN5DwA7BO5a5ofCKh/EZB9FKvcQ4EiqHNmRye3cXhz5DmQ/aVyfBFkXnUbrg==",
5149
  "license": "MIT",
5150
  "dependencies": {
5151
  "kareem": "3.0.0",
@@ -5271,6 +6424,79 @@
5271
  "node": "^18 || ^20 || >= 21"
5272
  }
5273
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5274
  "node_modules/node-gyp-build": {
5275
  "version": "4.8.4",
5276
  "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
@@ -5289,6 +6515,15 @@
5289
  "dev": true,
5290
  "license": "MIT"
5291
  },
 
 
 
 
 
 
 
 
 
5292
  "node_modules/object-assign": {
5293
  "version": "4.1.1",
5294
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -5298,6 +6533,16 @@
5298
  "node": ">=0.10.0"
5299
  }
5300
  },
 
 
 
 
 
 
 
 
 
 
5301
  "node_modules/object-inspect": {
5302
  "version": "1.13.4",
5303
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -5353,7 +6598,7 @@
5353
  "version": "3.1.0",
5354
  "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
5355
  "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
5356
- "dev": true,
5357
  "license": "MIT",
5358
  "dependencies": {
5359
  "yocto-queue": "^0.1.0"
@@ -5381,6 +6626,14 @@
5381
  "url": "https://github.com/sponsors/sindresorhus"
5382
  }
5383
  },
 
 
 
 
 
 
 
 
5384
  "node_modules/parent-module": {
5385
  "version": "1.0.1",
5386
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -5442,12 +6695,38 @@
5442
  "version": "3.1.1",
5443
  "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
5444
  "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
5445
- "dev": true,
5446
  "license": "MIT",
5447
  "engines": {
5448
  "node": ">=8"
5449
  }
5450
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5451
  "node_modules/path-to-regexp": {
5452
  "version": "8.3.0",
5453
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
@@ -5534,6 +6813,19 @@
5534
  "url": "https://github.com/sponsors/wooorm"
5535
  }
5536
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
5537
  "node_modules/protobufjs": {
5538
  "version": "7.5.4",
5539
  "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
@@ -5586,6 +6878,17 @@
5586
  "node": ">=6"
5587
  }
5588
  },
 
 
 
 
 
 
 
 
 
 
 
5589
  "node_modules/qs": {
5590
  "version": "6.14.1",
5591
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
@@ -5763,6 +7066,48 @@
5763
  "node": ">=4"
5764
  }
5765
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5766
  "node_modules/rollup": {
5767
  "version": "4.54.0",
5768
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz",
@@ -5943,7 +7288,7 @@
5943
  "version": "2.0.0",
5944
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
5945
  "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
5946
- "dev": true,
5947
  "license": "MIT",
5948
  "dependencies": {
5949
  "shebang-regex": "^3.0.0"
@@ -5956,7 +7301,7 @@
5956
  "version": "3.0.0",
5957
  "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
5958
  "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
5959
- "dev": true,
5960
  "license": "MIT",
5961
  "engines": {
5962
  "node": ">=8"
@@ -6040,6 +7385,20 @@
6040
  "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
6041
  "license": "MIT"
6042
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6043
  "node_modules/socket.io": {
6044
  "version": "4.8.3",
6045
  "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz",
@@ -6156,6 +7515,23 @@
6156
  "node": ">= 0.8"
6157
  }
6158
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6159
  "node_modules/streamsearch": {
6160
  "version": "1.1.0",
6161
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -6187,6 +7563,23 @@
6187
  "node": ">=8"
6188
  }
6189
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6190
  "node_modules/stringify-entities": {
6191
  "version": "4.0.4",
6192
  "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
@@ -6213,6 +7606,21 @@
6213
  "node": ">=8"
6214
  }
6215
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6216
  "node_modules/strip-json-comments": {
6217
  "version": "3.1.1",
6218
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -6226,6 +7634,26 @@
6226
  "url": "https://github.com/sponsors/sindresorhus"
6227
  }
6228
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6229
  "node_modules/style-to-js": {
6230
  "version": "1.1.21",
6231
  "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
@@ -6264,6 +7692,64 @@
6264
  "dev": true,
6265
  "license": "MIT"
6266
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6267
  "node_modules/tinyglobby": {
6268
  "version": "0.2.15",
6269
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -6535,6 +8021,19 @@
6535
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
6536
  "license": "MIT"
6537
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
6538
  "node_modules/vary": {
6539
  "version": "1.1.2",
6540
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -6647,6 +8146,17 @@
6647
  }
6648
  }
6649
  },
 
 
 
 
 
 
 
 
 
 
 
6650
  "node_modules/web-vitals": {
6651
  "version": "4.2.4",
6652
  "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
@@ -6702,7 +8212,7 @@
6702
  "version": "2.0.2",
6703
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
6704
  "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
6705
- "dev": true,
6706
  "license": "ISC",
6707
  "dependencies": {
6708
  "isexe": "^2.0.0"
@@ -6741,6 +8251,26 @@
6741
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
6742
  }
6743
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6744
  "node_modules/wrappy": {
6745
  "version": "1.0.2",
6746
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -6832,7 +8362,7 @@
6832
  "version": "0.1.0",
6833
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
6834
  "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
6835
- "dev": true,
6836
  "license": "MIT",
6837
  "engines": {
6838
  "node": ">=10"
 
8
  "name": "kibali-ui",
9
  "version": "0.0.0",
10
  "dependencies": {
11
+ "@simplewebauthn/browser": "^13.2.2",
12
  "axios": "^1.13.2",
13
  "bcrypt": "^6.0.0",
14
+ "bcryptjs": "^3.0.3",
15
+ "body-parser": "^2.2.1",
16
+ "cloudinary": "^2.8.0",
17
  "cors": "^2.8.5",
18
  "dotenv": "^17.2.3",
19
  "express": "^5.2.1",
20
  "firebase": "^12.7.0",
21
+ "firebase-admin": "^13.6.0",
22
  "jsonwebtoken": "^9.0.3",
23
  "leaflet": "^1.9.4",
24
  "lucide-react": "^0.562.0",
25
+ "mongoose": "^9.1.1",
26
  "multer": "^2.0.2",
27
+ "nodemailer": "^7.0.12",
28
  "react": "^19.2.0",
29
  "react-dom": "^19.2.0",
30
  "react-leaflet": "^5.0.0",
31
  "react-markdown": "^10.1.0",
32
  "socket.io": "^4.8.3",
33
+ "socket.io-client": "^4.8.3",
34
+ "ws": "^8.18.3"
35
  },
36
  "devDependencies": {
37
  "@eslint/js": "^9.39.1",
 
929
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
930
  }
931
  },
932
+ "node_modules/@fastify/busboy": {
933
+ "version": "3.2.0",
934
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz",
935
+ "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==",
936
+ "license": "MIT"
937
+ },
938
  "node_modules/@firebase/ai": {
939
  "version": "2.6.1",
940
  "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.6.1.tgz",
 
1543
  "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==",
1544
  "license": "Apache-2.0"
1545
  },
1546
+ "node_modules/@google-cloud/firestore": {
1547
+ "version": "7.11.6",
1548
+ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz",
1549
+ "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==",
1550
+ "license": "Apache-2.0",
1551
+ "optional": true,
1552
+ "dependencies": {
1553
+ "@opentelemetry/api": "^1.3.0",
1554
+ "fast-deep-equal": "^3.1.1",
1555
+ "functional-red-black-tree": "^1.0.1",
1556
+ "google-gax": "^4.3.3",
1557
+ "protobufjs": "^7.2.6"
1558
+ },
1559
+ "engines": {
1560
+ "node": ">=14.0.0"
1561
+ }
1562
+ },
1563
+ "node_modules/@google-cloud/paginator": {
1564
+ "version": "5.0.2",
1565
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
1566
+ "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
1567
+ "license": "Apache-2.0",
1568
+ "optional": true,
1569
+ "dependencies": {
1570
+ "arrify": "^2.0.0",
1571
+ "extend": "^3.0.2"
1572
+ },
1573
+ "engines": {
1574
+ "node": ">=14.0.0"
1575
+ }
1576
+ },
1577
+ "node_modules/@google-cloud/projectify": {
1578
+ "version": "4.0.0",
1579
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
1580
+ "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==",
1581
+ "license": "Apache-2.0",
1582
+ "optional": true,
1583
+ "engines": {
1584
+ "node": ">=14.0.0"
1585
+ }
1586
+ },
1587
+ "node_modules/@google-cloud/promisify": {
1588
+ "version": "4.0.0",
1589
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
1590
+ "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==",
1591
+ "license": "Apache-2.0",
1592
+ "optional": true,
1593
+ "engines": {
1594
+ "node": ">=14"
1595
+ }
1596
+ },
1597
+ "node_modules/@google-cloud/storage": {
1598
+ "version": "7.18.0",
1599
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz",
1600
+ "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==",
1601
+ "license": "Apache-2.0",
1602
+ "optional": true,
1603
+ "dependencies": {
1604
+ "@google-cloud/paginator": "^5.0.0",
1605
+ "@google-cloud/projectify": "^4.0.0",
1606
+ "@google-cloud/promisify": "<4.1.0",
1607
+ "abort-controller": "^3.0.0",
1608
+ "async-retry": "^1.3.3",
1609
+ "duplexify": "^4.1.3",
1610
+ "fast-xml-parser": "^4.4.1",
1611
+ "gaxios": "^6.0.2",
1612
+ "google-auth-library": "^9.6.3",
1613
+ "html-entities": "^2.5.2",
1614
+ "mime": "^3.0.0",
1615
+ "p-limit": "^3.0.1",
1616
+ "retry-request": "^7.0.0",
1617
+ "teeny-request": "^9.0.0",
1618
+ "uuid": "^8.0.0"
1619
+ },
1620
+ "engines": {
1621
+ "node": ">=14"
1622
+ }
1623
+ },
1624
+ "node_modules/@google-cloud/storage/node_modules/uuid": {
1625
+ "version": "8.3.2",
1626
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1627
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
1628
+ "license": "MIT",
1629
+ "optional": true,
1630
+ "bin": {
1631
+ "uuid": "dist/bin/uuid"
1632
+ }
1633
+ },
1634
  "node_modules/@grpc/grpc-js": {
1635
  "version": "1.9.15",
1636
  "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz",
 
1714
  "url": "https://github.com/sponsors/nzakas"
1715
  }
1716
  },
1717
+ "node_modules/@isaacs/cliui": {
1718
+ "version": "8.0.2",
1719
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1720
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1721
+ "license": "ISC",
1722
+ "optional": true,
1723
+ "peer": true,
1724
+ "dependencies": {
1725
+ "string-width": "^5.1.2",
1726
+ "string-width-cjs": "npm:string-width@^4.2.0",
1727
+ "strip-ansi": "^7.0.1",
1728
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
1729
+ "wrap-ansi": "^8.1.0",
1730
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
1731
+ },
1732
+ "engines": {
1733
+ "node": ">=12"
1734
+ }
1735
+ },
1736
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
1737
+ "version": "6.2.2",
1738
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
1739
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
1740
+ "license": "MIT",
1741
+ "optional": true,
1742
+ "peer": true,
1743
+ "engines": {
1744
+ "node": ">=12"
1745
+ },
1746
+ "funding": {
1747
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1748
+ }
1749
+ },
1750
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
1751
+ "version": "6.2.3",
1752
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
1753
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
1754
+ "license": "MIT",
1755
+ "optional": true,
1756
+ "peer": true,
1757
+ "engines": {
1758
+ "node": ">=12"
1759
+ },
1760
+ "funding": {
1761
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1762
+ }
1763
+ },
1764
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
1765
+ "version": "9.2.2",
1766
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1767
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1768
+ "license": "MIT",
1769
+ "optional": true,
1770
+ "peer": true
1771
+ },
1772
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
1773
+ "version": "5.1.2",
1774
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1775
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1776
+ "license": "MIT",
1777
+ "optional": true,
1778
+ "peer": true,
1779
+ "dependencies": {
1780
+ "eastasianwidth": "^0.2.0",
1781
+ "emoji-regex": "^9.2.2",
1782
+ "strip-ansi": "^7.0.1"
1783
+ },
1784
+ "engines": {
1785
+ "node": ">=12"
1786
+ },
1787
+ "funding": {
1788
+ "url": "https://github.com/sponsors/sindresorhus"
1789
+ }
1790
+ },
1791
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
1792
+ "version": "7.1.2",
1793
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
1794
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
1795
+ "license": "MIT",
1796
+ "optional": true,
1797
+ "peer": true,
1798
+ "dependencies": {
1799
+ "ansi-regex": "^6.0.1"
1800
+ },
1801
+ "engines": {
1802
+ "node": ">=12"
1803
+ },
1804
+ "funding": {
1805
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1806
+ }
1807
+ },
1808
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
1809
+ "version": "8.1.0",
1810
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
1811
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1812
+ "license": "MIT",
1813
+ "optional": true,
1814
+ "peer": true,
1815
+ "dependencies": {
1816
+ "ansi-styles": "^6.1.0",
1817
+ "string-width": "^5.0.1",
1818
+ "strip-ansi": "^7.0.1"
1819
+ },
1820
+ "engines": {
1821
+ "node": ">=12"
1822
+ },
1823
+ "funding": {
1824
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1825
+ }
1826
+ },
1827
  "node_modules/@jridgewell/gen-mapping": {
1828
  "version": "0.3.13",
1829
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
 
1874
  "@jridgewell/sourcemap-codec": "^1.4.14"
1875
  }
1876
  },
1877
+ "node_modules/@js-sdsl/ordered-map": {
1878
+ "version": "4.4.2",
1879
+ "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
1880
+ "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
1881
+ "license": "MIT",
1882
+ "optional": true,
1883
+ "funding": {
1884
+ "type": "opencollective",
1885
+ "url": "https://opencollective.com/js-sdsl"
1886
+ }
1887
+ },
1888
  "node_modules/@mongodb-js/saslprep": {
1889
  "version": "1.4.4",
1890
  "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.4.tgz",
 
1894
  "sparse-bitfield": "^3.0.3"
1895
  }
1896
  },
1897
+ "node_modules/@opentelemetry/api": {
1898
+ "version": "1.9.0",
1899
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
1900
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
1901
+ "license": "Apache-2.0",
1902
+ "optional": true,
1903
+ "engines": {
1904
+ "node": ">=8.0.0"
1905
+ }
1906
+ },
1907
+ "node_modules/@pkgjs/parseargs": {
1908
+ "version": "0.11.0",
1909
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
1910
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
1911
+ "license": "MIT",
1912
+ "optional": true,
1913
+ "peer": true,
1914
+ "engines": {
1915
+ "node": ">=14"
1916
+ }
1917
+ },
1918
  "node_modules/@protobufjs/aspromise": {
1919
  "version": "1.1.2",
1920
  "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
 
2305
  "win32"
2306
  ]
2307
  },
2308
+ "node_modules/@simplewebauthn/browser": {
2309
+ "version": "13.2.2",
2310
+ "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.2.2.tgz",
2311
+ "integrity": "sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==",
2312
+ "license": "MIT"
2313
+ },
2314
  "node_modules/@socket.io/component-emitter": {
2315
  "version": "3.1.2",
2316
  "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
2317
  "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
2318
  "license": "MIT"
2319
  },
2320
+ "node_modules/@tootallnate/once": {
2321
+ "version": "2.0.0",
2322
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
2323
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
2324
+ "license": "MIT",
2325
+ "optional": true,
2326
+ "engines": {
2327
+ "node": ">= 10"
2328
+ }
2329
+ },
2330
  "node_modules/@types/babel__core": {
2331
  "version": "7.20.5",
2332
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
 
2372
  "@babel/types": "^7.28.2"
2373
  }
2374
  },
2375
+ "node_modules/@types/body-parser": {
2376
+ "version": "1.19.6",
2377
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
2378
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
2379
+ "license": "MIT",
2380
+ "dependencies": {
2381
+ "@types/connect": "*",
2382
+ "@types/node": "*"
2383
+ }
2384
+ },
2385
+ "node_modules/@types/caseless": {
2386
+ "version": "0.12.5",
2387
+ "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
2388
+ "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==",
2389
+ "license": "MIT",
2390
+ "optional": true
2391
+ },
2392
+ "node_modules/@types/connect": {
2393
+ "version": "3.4.38",
2394
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
2395
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
2396
+ "license": "MIT",
2397
+ "dependencies": {
2398
+ "@types/node": "*"
2399
+ }
2400
+ },
2401
  "node_modules/@types/cors": {
2402
  "version": "2.8.19",
2403
  "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz",
 
2431
  "@types/estree": "*"
2432
  }
2433
  },
2434
+ "node_modules/@types/express": {
2435
+ "version": "4.17.25",
2436
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
2437
+ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
2438
+ "license": "MIT",
2439
+ "dependencies": {
2440
+ "@types/body-parser": "*",
2441
+ "@types/express-serve-static-core": "^4.17.33",
2442
+ "@types/qs": "*",
2443
+ "@types/serve-static": "^1"
2444
+ }
2445
+ },
2446
+ "node_modules/@types/express-serve-static-core": {
2447
+ "version": "4.19.7",
2448
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz",
2449
+ "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==",
2450
+ "license": "MIT",
2451
+ "dependencies": {
2452
+ "@types/node": "*",
2453
+ "@types/qs": "*",
2454
+ "@types/range-parser": "*",
2455
+ "@types/send": "*"
2456
+ }
2457
+ },
2458
  "node_modules/@types/hast": {
2459
  "version": "3.0.4",
2460
  "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
 
2464
  "@types/unist": "*"
2465
  }
2466
  },
2467
+ "node_modules/@types/http-errors": {
2468
+ "version": "2.0.5",
2469
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
2470
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
2471
+ "license": "MIT"
2472
+ },
2473
  "node_modules/@types/json-schema": {
2474
  "version": "7.0.15",
2475
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
 
2477
  "dev": true,
2478
  "license": "MIT"
2479
  },
2480
+ "node_modules/@types/jsonwebtoken": {
2481
+ "version": "9.0.10",
2482
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
2483
+ "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
2484
+ "license": "MIT",
2485
+ "dependencies": {
2486
+ "@types/ms": "*",
2487
+ "@types/node": "*"
2488
+ }
2489
+ },
2490
+ "node_modules/@types/long": {
2491
+ "version": "4.0.2",
2492
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
2493
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
2494
+ "license": "MIT",
2495
+ "optional": true
2496
+ },
2497
  "node_modules/@types/mdast": {
2498
  "version": "4.0.4",
2499
  "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
 
2503
  "@types/unist": "*"
2504
  }
2505
  },
2506
+ "node_modules/@types/mime": {
2507
+ "version": "1.3.5",
2508
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
2509
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
2510
+ "license": "MIT"
2511
+ },
2512
  "node_modules/@types/ms": {
2513
  "version": "2.1.0",
2514
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
 
2524
  "undici-types": "~7.16.0"
2525
  }
2526
  },
2527
+ "node_modules/@types/qs": {
2528
+ "version": "6.14.0",
2529
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
2530
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
2531
+ "license": "MIT"
2532
+ },
2533
+ "node_modules/@types/range-parser": {
2534
+ "version": "1.2.7",
2535
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
2536
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
2537
+ "license": "MIT"
2538
+ },
2539
  "node_modules/@types/react": {
2540
  "version": "19.2.7",
2541
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
 
2555
  "@types/react": "^19.2.0"
2556
  }
2557
  },
2558
+ "node_modules/@types/request": {
2559
+ "version": "2.48.13",
2560
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz",
2561
+ "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==",
2562
+ "license": "MIT",
2563
+ "optional": true,
2564
+ "dependencies": {
2565
+ "@types/caseless": "*",
2566
+ "@types/node": "*",
2567
+ "@types/tough-cookie": "*",
2568
+ "form-data": "^2.5.5"
2569
+ }
2570
+ },
2571
+ "node_modules/@types/request/node_modules/form-data": {
2572
+ "version": "2.5.5",
2573
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz",
2574
+ "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==",
2575
+ "license": "MIT",
2576
+ "optional": true,
2577
+ "dependencies": {
2578
+ "asynckit": "^0.4.0",
2579
+ "combined-stream": "^1.0.8",
2580
+ "es-set-tostringtag": "^2.1.0",
2581
+ "hasown": "^2.0.2",
2582
+ "mime-types": "^2.1.35",
2583
+ "safe-buffer": "^5.2.1"
2584
+ },
2585
+ "engines": {
2586
+ "node": ">= 0.12"
2587
+ }
2588
+ },
2589
+ "node_modules/@types/send": {
2590
+ "version": "1.2.1",
2591
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
2592
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
2593
+ "license": "MIT",
2594
+ "dependencies": {
2595
+ "@types/node": "*"
2596
+ }
2597
+ },
2598
+ "node_modules/@types/serve-static": {
2599
+ "version": "1.15.10",
2600
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
2601
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
2602
+ "license": "MIT",
2603
+ "dependencies": {
2604
+ "@types/http-errors": "*",
2605
+ "@types/node": "*",
2606
+ "@types/send": "<1"
2607
+ }
2608
+ },
2609
+ "node_modules/@types/serve-static/node_modules/@types/send": {
2610
+ "version": "0.17.6",
2611
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
2612
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
2613
+ "license": "MIT",
2614
+ "dependencies": {
2615
+ "@types/mime": "^1",
2616
+ "@types/node": "*"
2617
+ }
2618
+ },
2619
+ "node_modules/@types/tough-cookie": {
2620
+ "version": "4.0.5",
2621
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
2622
+ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
2623
+ "license": "MIT",
2624
+ "optional": true
2625
+ },
2626
  "node_modules/@types/unist": {
2627
  "version": "3.0.3",
2628
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
 
2671
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
2672
  }
2673
  },
2674
+ "node_modules/abort-controller": {
2675
+ "version": "3.0.0",
2676
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
2677
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
2678
+ "license": "MIT",
2679
+ "optional": true,
2680
+ "dependencies": {
2681
+ "event-target-shim": "^5.0.0"
2682
+ },
2683
+ "engines": {
2684
+ "node": ">=6.5"
2685
+ }
2686
+ },
2687
  "node_modules/accepts": {
2688
  "version": "2.0.0",
2689
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 
2745
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
2746
  }
2747
  },
2748
+ "node_modules/agent-base": {
2749
+ "version": "7.1.4",
2750
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
2751
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
2752
+ "license": "MIT",
2753
+ "engines": {
2754
+ "node": ">= 14"
2755
+ }
2756
+ },
2757
  "node_modules/ajv": {
2758
  "version": "6.12.6",
2759
  "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
 
2808
  "dev": true,
2809
  "license": "Python-2.0"
2810
  },
2811
+ "node_modules/arrify": {
2812
+ "version": "2.0.1",
2813
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
2814
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
2815
+ "license": "MIT",
2816
+ "optional": true,
2817
+ "engines": {
2818
+ "node": ">=8"
2819
+ }
2820
+ },
2821
+ "node_modules/async-retry": {
2822
+ "version": "1.3.3",
2823
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
2824
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
2825
+ "license": "MIT",
2826
+ "optional": true,
2827
+ "dependencies": {
2828
+ "retry": "0.13.1"
2829
+ }
2830
+ },
2831
  "node_modules/asynckit": {
2832
  "version": "0.4.0",
2833
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 
2896
  "version": "1.0.2",
2897
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2898
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2899
+ "devOptional": true,
2900
+ "license": "MIT"
2901
+ },
2902
+ "node_modules/base64-js": {
2903
+ "version": "1.5.1",
2904
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
2905
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
2906
+ "funding": [
2907
+ {
2908
+ "type": "github",
2909
+ "url": "https://github.com/sponsors/feross"
2910
+ },
2911
+ {
2912
+ "type": "patreon",
2913
+ "url": "https://www.patreon.com/feross"
2914
+ },
2915
+ {
2916
+ "type": "consulting",
2917
+ "url": "https://feross.org/support"
2918
+ }
2919
+ ],
2920
  "license": "MIT"
2921
  },
2922
  "node_modules/base64id": {
 
2952
  "node": ">= 18"
2953
  }
2954
  },
2955
+ "node_modules/bcryptjs": {
2956
+ "version": "3.0.3",
2957
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz",
2958
+ "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==",
2959
+ "license": "BSD-3-Clause",
2960
+ "bin": {
2961
+ "bcrypt": "bin/bcrypt"
2962
+ }
2963
+ },
2964
+ "node_modules/bignumber.js": {
2965
+ "version": "9.3.1",
2966
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
2967
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
2968
+ "license": "MIT",
2969
+ "engines": {
2970
+ "node": "*"
2971
+ }
2972
+ },
2973
  "node_modules/body-parser": {
2974
  "version": "2.2.1",
2975
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz",
 
3221
  "node": ">=12"
3222
  }
3223
  },
3224
+ "node_modules/cloudinary": {
3225
+ "version": "2.8.0",
3226
+ "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.8.0.tgz",
3227
+ "integrity": "sha512-s7frvR0HnQXeJsQSIsbLa/I09IMb1lOnVLEDH5b5E53WTiCYgrNNOBGV/i/nLHwrcEOUkqjfSwP1+enXWNYmdw==",
3228
+ "license": "MIT",
3229
+ "dependencies": {
3230
+ "lodash": "^4.17.21",
3231
+ "q": "^1.5.1"
3232
+ },
3233
+ "engines": {
3234
+ "node": ">=9"
3235
+ }
3236
+ },
3237
+ "node_modules/color-convert": {
3238
+ "version": "2.0.1",
3239
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3240
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3241
  "license": "MIT",
3242
  "dependencies": {
3243
  "color-name": "~1.1.4"
 
3360
  "version": "7.0.6",
3361
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
3362
  "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
3363
+ "devOptional": true,
3364
  "license": "MIT",
3365
  "dependencies": {
3366
  "path-key": "^3.1.0",
 
3377
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
3378
  "license": "MIT"
3379
  },
3380
+ "node_modules/data-uri-to-buffer": {
3381
+ "version": "4.0.1",
3382
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
3383
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
3384
+ "license": "MIT",
3385
+ "optional": true,
3386
+ "peer": true,
3387
+ "engines": {
3388
+ "node": ">= 12"
3389
+ }
3390
+ },
3391
  "node_modules/debug": {
3392
  "version": "4.4.3",
3393
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
 
3491
  "node": ">= 0.4"
3492
  }
3493
  },
3494
+ "node_modules/duplexify": {
3495
+ "version": "4.1.3",
3496
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
3497
+ "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
3498
+ "license": "MIT",
3499
+ "optional": true,
3500
+ "dependencies": {
3501
+ "end-of-stream": "^1.4.1",
3502
+ "inherits": "^2.0.3",
3503
+ "readable-stream": "^3.1.1",
3504
+ "stream-shift": "^1.0.2"
3505
+ }
3506
+ },
3507
+ "node_modules/eastasianwidth": {
3508
+ "version": "0.2.0",
3509
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
3510
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
3511
+ "license": "MIT",
3512
+ "optional": true,
3513
+ "peer": true
3514
+ },
3515
  "node_modules/ecdsa-sig-formatter": {
3516
  "version": "1.0.11",
3517
  "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
 
3549
  "node": ">= 0.8"
3550
  }
3551
  },
3552
+ "node_modules/end-of-stream": {
3553
+ "version": "1.4.5",
3554
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
3555
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
3556
+ "license": "MIT",
3557
+ "optional": true,
3558
+ "dependencies": {
3559
+ "once": "^1.4.0"
3560
+ }
3561
+ },
3562
  "node_modules/engine.io": {
3563
  "version": "6.6.5",
3564
  "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz",
 
3941
  "node": ">= 0.6"
3942
  }
3943
  },
3944
+ "node_modules/event-target-shim": {
3945
+ "version": "5.0.1",
3946
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
3947
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
3948
+ "license": "MIT",
3949
+ "optional": true,
3950
+ "engines": {
3951
+ "node": ">=6"
3952
+ }
3953
+ },
3954
  "node_modules/express": {
3955
  "version": "5.2.1",
3956
  "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
 
4025
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
4026
  "license": "MIT"
4027
  },
4028
+ "node_modules/farmhash-modern": {
4029
+ "version": "1.1.0",
4030
+ "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz",
4031
+ "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==",
4032
+ "license": "MIT",
4033
+ "engines": {
4034
+ "node": ">=18.0.0"
4035
+ }
4036
+ },
4037
  "node_modules/fast-deep-equal": {
4038
  "version": "3.1.3",
4039
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
4040
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
 
4041
  "license": "MIT"
4042
  },
4043
  "node_modules/fast-json-stable-stringify": {
 
4054
  "dev": true,
4055
  "license": "MIT"
4056
  },
4057
+ "node_modules/fast-xml-parser": {
4058
+ "version": "4.5.3",
4059
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz",
4060
+ "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==",
4061
+ "funding": [
4062
+ {
4063
+ "type": "github",
4064
+ "url": "https://github.com/sponsors/NaturalIntelligence"
4065
+ }
4066
+ ],
4067
+ "license": "MIT",
4068
+ "optional": true,
4069
+ "dependencies": {
4070
+ "strnum": "^1.1.1"
4071
+ },
4072
+ "bin": {
4073
+ "fxparser": "src/cli/cli.js"
4074
+ }
4075
+ },
4076
  "node_modules/faye-websocket": {
4077
  "version": "0.11.4",
4078
  "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
 
4103
  }
4104
  }
4105
  },
4106
+ "node_modules/fetch-blob": {
4107
+ "version": "3.2.0",
4108
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
4109
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
4110
+ "funding": [
4111
+ {
4112
+ "type": "github",
4113
+ "url": "https://github.com/sponsors/jimmywarting"
4114
+ },
4115
+ {
4116
+ "type": "paypal",
4117
+ "url": "https://paypal.me/jimmywarting"
4118
+ }
4119
+ ],
4120
+ "license": "MIT",
4121
+ "optional": true,
4122
+ "peer": true,
4123
+ "dependencies": {
4124
+ "node-domexception": "^1.0.0",
4125
+ "web-streams-polyfill": "^3.0.3"
4126
+ },
4127
+ "engines": {
4128
+ "node": "^12.20 || >= 14.13"
4129
+ }
4130
+ },
4131
  "node_modules/file-entry-cache": {
4132
  "version": "8.0.0",
4133
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
 
4215
  "@firebase/util": "1.13.0"
4216
  }
4217
  },
4218
+ "node_modules/firebase-admin": {
4219
+ "version": "13.6.0",
4220
+ "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz",
4221
+ "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==",
4222
+ "license": "Apache-2.0",
4223
+ "dependencies": {
4224
+ "@fastify/busboy": "^3.0.0",
4225
+ "@firebase/database-compat": "^2.0.0",
4226
+ "@firebase/database-types": "^1.0.6",
4227
+ "@types/node": "^22.8.7",
4228
+ "farmhash-modern": "^1.1.0",
4229
+ "fast-deep-equal": "^3.1.1",
4230
+ "google-auth-library": "^9.14.2",
4231
+ "jsonwebtoken": "^9.0.0",
4232
+ "jwks-rsa": "^3.1.0",
4233
+ "node-forge": "^1.3.1",
4234
+ "uuid": "^11.0.2"
4235
+ },
4236
+ "engines": {
4237
+ "node": ">=18"
4238
+ },
4239
+ "optionalDependencies": {
4240
+ "@google-cloud/firestore": "^7.11.0",
4241
+ "@google-cloud/storage": "^7.14.0"
4242
+ }
4243
+ },
4244
+ "node_modules/firebase-admin/node_modules/@types/node": {
4245
+ "version": "22.19.3",
4246
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz",
4247
+ "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==",
4248
+ "license": "MIT",
4249
+ "dependencies": {
4250
+ "undici-types": "~6.21.0"
4251
+ }
4252
+ },
4253
+ "node_modules/firebase-admin/node_modules/undici-types": {
4254
+ "version": "6.21.0",
4255
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
4256
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
4257
+ "license": "MIT"
4258
+ },
4259
  "node_modules/flat-cache": {
4260
  "version": "4.0.1",
4261
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
 
4297
  }
4298
  }
4299
  },
4300
+ "node_modules/foreground-child": {
4301
+ "version": "3.3.1",
4302
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
4303
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
4304
+ "license": "ISC",
4305
+ "optional": true,
4306
+ "peer": true,
4307
+ "dependencies": {
4308
+ "cross-spawn": "^7.0.6",
4309
+ "signal-exit": "^4.0.1"
4310
+ },
4311
+ "engines": {
4312
+ "node": ">=14"
4313
+ },
4314
+ "funding": {
4315
+ "url": "https://github.com/sponsors/isaacs"
4316
+ }
4317
+ },
4318
  "node_modules/form-data": {
4319
  "version": "4.0.5",
4320
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
 
4331
  "node": ">= 6"
4332
  }
4333
  },
4334
+ "node_modules/formdata-polyfill": {
4335
+ "version": "4.0.10",
4336
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
4337
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
4338
+ "license": "MIT",
4339
+ "optional": true,
4340
+ "peer": true,
4341
+ "dependencies": {
4342
+ "fetch-blob": "^3.1.2"
4343
+ },
4344
+ "engines": {
4345
+ "node": ">=12.20.0"
4346
+ }
4347
+ },
4348
  "node_modules/forwarded": {
4349
  "version": "0.2.0",
4350
  "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 
4401
  "url": "https://github.com/sponsors/ljharb"
4402
  }
4403
  },
4404
+ "node_modules/functional-red-black-tree": {
4405
+ "version": "1.0.1",
4406
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
4407
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
4408
+ "license": "MIT",
4409
+ "optional": true
4410
+ },
4411
+ "node_modules/gaxios": {
4412
+ "version": "6.7.1",
4413
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
4414
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
4415
+ "license": "Apache-2.0",
4416
+ "dependencies": {
4417
+ "extend": "^3.0.2",
4418
+ "https-proxy-agent": "^7.0.1",
4419
+ "is-stream": "^2.0.0",
4420
+ "node-fetch": "^2.6.9",
4421
+ "uuid": "^9.0.1"
4422
+ },
4423
+ "engines": {
4424
+ "node": ">=14"
4425
+ }
4426
+ },
4427
+ "node_modules/gaxios/node_modules/uuid": {
4428
+ "version": "9.0.1",
4429
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
4430
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
4431
+ "funding": [
4432
+ "https://github.com/sponsors/broofa",
4433
+ "https://github.com/sponsors/ctavan"
4434
+ ],
4435
+ "license": "MIT",
4436
+ "bin": {
4437
+ "uuid": "dist/bin/uuid"
4438
+ }
4439
+ },
4440
+ "node_modules/gcp-metadata": {
4441
+ "version": "7.0.1",
4442
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz",
4443
+ "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==",
4444
+ "license": "Apache-2.0",
4445
+ "optional": true,
4446
+ "peer": true,
4447
+ "dependencies": {
4448
+ "gaxios": "^7.0.0",
4449
+ "google-logging-utils": "^1.0.0",
4450
+ "json-bigint": "^1.0.0"
4451
+ },
4452
+ "engines": {
4453
+ "node": ">=18"
4454
+ }
4455
+ },
4456
+ "node_modules/gcp-metadata/node_modules/gaxios": {
4457
+ "version": "7.1.3",
4458
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
4459
+ "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==",
4460
+ "license": "Apache-2.0",
4461
+ "optional": true,
4462
+ "peer": true,
4463
+ "dependencies": {
4464
+ "extend": "^3.0.2",
4465
+ "https-proxy-agent": "^7.0.1",
4466
+ "node-fetch": "^3.3.2",
4467
+ "rimraf": "^5.0.1"
4468
+ },
4469
+ "engines": {
4470
+ "node": ">=18"
4471
+ }
4472
+ },
4473
+ "node_modules/gcp-metadata/node_modules/node-fetch": {
4474
+ "version": "3.3.2",
4475
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
4476
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
4477
+ "license": "MIT",
4478
+ "optional": true,
4479
+ "peer": true,
4480
+ "dependencies": {
4481
+ "data-uri-to-buffer": "^4.0.0",
4482
+ "fetch-blob": "^3.1.4",
4483
+ "formdata-polyfill": "^4.0.10"
4484
+ },
4485
+ "engines": {
4486
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
4487
+ },
4488
+ "funding": {
4489
+ "type": "opencollective",
4490
+ "url": "https://opencollective.com/node-fetch"
4491
+ }
4492
+ },
4493
  "node_modules/gensync": {
4494
  "version": "1.0.0-beta.2",
4495
  "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
 
4546
  "node": ">= 0.4"
4547
  }
4548
  },
4549
+ "node_modules/glob": {
4550
+ "version": "10.5.0",
4551
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
4552
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
4553
+ "license": "ISC",
4554
+ "optional": true,
4555
+ "peer": true,
4556
+ "dependencies": {
4557
+ "foreground-child": "^3.1.0",
4558
+ "jackspeak": "^3.1.2",
4559
+ "minimatch": "^9.0.4",
4560
+ "minipass": "^7.1.2",
4561
+ "package-json-from-dist": "^1.0.0",
4562
+ "path-scurry": "^1.11.1"
4563
+ },
4564
+ "bin": {
4565
+ "glob": "dist/esm/bin.mjs"
4566
+ },
4567
+ "funding": {
4568
+ "url": "https://github.com/sponsors/isaacs"
4569
+ }
4570
+ },
4571
  "node_modules/glob-parent": {
4572
  "version": "6.0.2",
4573
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
 
4581
  "node": ">=10.13.0"
4582
  }
4583
  },
4584
+ "node_modules/glob/node_modules/brace-expansion": {
4585
+ "version": "2.0.2",
4586
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
4587
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
4588
+ "license": "MIT",
4589
+ "optional": true,
4590
+ "peer": true,
4591
+ "dependencies": {
4592
+ "balanced-match": "^1.0.0"
4593
+ }
4594
+ },
4595
+ "node_modules/glob/node_modules/minimatch": {
4596
+ "version": "9.0.5",
4597
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
4598
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
4599
+ "license": "ISC",
4600
+ "optional": true,
4601
+ "peer": true,
4602
+ "dependencies": {
4603
+ "brace-expansion": "^2.0.1"
4604
+ },
4605
+ "engines": {
4606
+ "node": ">=16 || 14 >=14.17"
4607
+ },
4608
+ "funding": {
4609
+ "url": "https://github.com/sponsors/isaacs"
4610
+ }
4611
+ },
4612
  "node_modules/globals": {
4613
  "version": "16.5.0",
4614
  "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
 
4622
  "url": "https://github.com/sponsors/sindresorhus"
4623
  }
4624
  },
4625
+ "node_modules/google-auth-library": {
4626
+ "version": "9.15.1",
4627
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
4628
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
4629
+ "license": "Apache-2.0",
4630
+ "dependencies": {
4631
+ "base64-js": "^1.3.0",
4632
+ "ecdsa-sig-formatter": "^1.0.11",
4633
+ "gaxios": "^6.1.1",
4634
+ "gcp-metadata": "^6.1.0",
4635
+ "gtoken": "^7.0.0",
4636
+ "jws": "^4.0.0"
4637
+ },
4638
+ "engines": {
4639
+ "node": ">=14"
4640
+ }
4641
+ },
4642
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
4643
+ "version": "6.1.1",
4644
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
4645
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
4646
+ "license": "Apache-2.0",
4647
+ "dependencies": {
4648
+ "gaxios": "^6.1.1",
4649
+ "google-logging-utils": "^0.0.2",
4650
+ "json-bigint": "^1.0.0"
4651
+ },
4652
+ "engines": {
4653
+ "node": ">=14"
4654
+ }
4655
+ },
4656
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
4657
+ "version": "0.0.2",
4658
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
4659
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
4660
+ "license": "Apache-2.0",
4661
+ "engines": {
4662
+ "node": ">=14"
4663
+ }
4664
+ },
4665
+ "node_modules/google-gax": {
4666
+ "version": "4.6.1",
4667
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz",
4668
+ "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==",
4669
+ "license": "Apache-2.0",
4670
+ "optional": true,
4671
+ "dependencies": {
4672
+ "@grpc/grpc-js": "^1.10.9",
4673
+ "@grpc/proto-loader": "^0.7.13",
4674
+ "@types/long": "^4.0.0",
4675
+ "abort-controller": "^3.0.0",
4676
+ "duplexify": "^4.0.0",
4677
+ "google-auth-library": "^9.3.0",
4678
+ "node-fetch": "^2.7.0",
4679
+ "object-hash": "^3.0.0",
4680
+ "proto3-json-serializer": "^2.0.2",
4681
+ "protobufjs": "^7.3.2",
4682
+ "retry-request": "^7.0.0",
4683
+ "uuid": "^9.0.1"
4684
+ },
4685
+ "engines": {
4686
+ "node": ">=14"
4687
+ }
4688
+ },
4689
+ "node_modules/google-gax/node_modules/@grpc/grpc-js": {
4690
+ "version": "1.14.3",
4691
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz",
4692
+ "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==",
4693
+ "license": "Apache-2.0",
4694
+ "optional": true,
4695
+ "dependencies": {
4696
+ "@grpc/proto-loader": "^0.8.0",
4697
+ "@js-sdsl/ordered-map": "^4.4.2"
4698
+ },
4699
+ "engines": {
4700
+ "node": ">=12.10.0"
4701
+ }
4702
+ },
4703
+ "node_modules/google-gax/node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
4704
+ "version": "0.8.0",
4705
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
4706
+ "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
4707
+ "license": "Apache-2.0",
4708
+ "optional": true,
4709
+ "dependencies": {
4710
+ "lodash.camelcase": "^4.3.0",
4711
+ "long": "^5.0.0",
4712
+ "protobufjs": "^7.5.3",
4713
+ "yargs": "^17.7.2"
4714
+ },
4715
+ "bin": {
4716
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
4717
+ },
4718
+ "engines": {
4719
+ "node": ">=6"
4720
+ }
4721
+ },
4722
+ "node_modules/google-gax/node_modules/uuid": {
4723
+ "version": "9.0.1",
4724
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
4725
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
4726
+ "funding": [
4727
+ "https://github.com/sponsors/broofa",
4728
+ "https://github.com/sponsors/ctavan"
4729
+ ],
4730
+ "license": "MIT",
4731
+ "optional": true,
4732
+ "bin": {
4733
+ "uuid": "dist/bin/uuid"
4734
+ }
4735
+ },
4736
+ "node_modules/google-logging-utils": {
4737
+ "version": "1.1.3",
4738
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
4739
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
4740
+ "license": "Apache-2.0",
4741
+ "optional": true,
4742
+ "peer": true,
4743
+ "engines": {
4744
+ "node": ">=14"
4745
+ }
4746
+ },
4747
  "node_modules/gopd": {
4748
  "version": "1.2.0",
4749
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 
4756
  "url": "https://github.com/sponsors/ljharb"
4757
  }
4758
  },
4759
+ "node_modules/gtoken": {
4760
+ "version": "7.1.0",
4761
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
4762
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
4763
+ "license": "MIT",
4764
+ "dependencies": {
4765
+ "gaxios": "^6.0.0",
4766
+ "jws": "^4.0.0"
4767
+ },
4768
+ "engines": {
4769
+ "node": ">=14.0.0"
4770
+ }
4771
+ },
4772
  "node_modules/has-flag": {
4773
  "version": "4.0.0",
4774
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 
4875
  "hermes-estree": "0.25.1"
4876
  }
4877
  },
4878
+ "node_modules/html-entities": {
4879
+ "version": "2.6.0",
4880
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
4881
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
4882
+ "funding": [
4883
+ {
4884
+ "type": "github",
4885
+ "url": "https://github.com/sponsors/mdevils"
4886
+ },
4887
+ {
4888
+ "type": "patreon",
4889
+ "url": "https://patreon.com/mdevils"
4890
+ }
4891
+ ],
4892
+ "license": "MIT",
4893
+ "optional": true
4894
+ },
4895
  "node_modules/html-url-attributes": {
4896
  "version": "3.0.1",
4897
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
 
4928
  "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
4929
  "license": "MIT"
4930
  },
4931
+ "node_modules/http-proxy-agent": {
4932
+ "version": "5.0.0",
4933
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
4934
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
4935
+ "license": "MIT",
4936
+ "optional": true,
4937
+ "dependencies": {
4938
+ "@tootallnate/once": "2",
4939
+ "agent-base": "6",
4940
+ "debug": "4"
4941
+ },
4942
+ "engines": {
4943
+ "node": ">= 6"
4944
+ }
4945
+ },
4946
+ "node_modules/http-proxy-agent/node_modules/agent-base": {
4947
+ "version": "6.0.2",
4948
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
4949
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
4950
+ "license": "MIT",
4951
+ "optional": true,
4952
+ "dependencies": {
4953
+ "debug": "4"
4954
+ },
4955
+ "engines": {
4956
+ "node": ">= 6.0.0"
4957
+ }
4958
+ },
4959
+ "node_modules/https-proxy-agent": {
4960
+ "version": "7.0.6",
4961
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
4962
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
4963
+ "license": "MIT",
4964
+ "dependencies": {
4965
+ "agent-base": "^7.1.2",
4966
+ "debug": "4"
4967
+ },
4968
+ "engines": {
4969
+ "node": ">= 14"
4970
+ }
4971
+ },
4972
  "node_modules/iconv-lite": {
4973
  "version": "0.7.1",
4974
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
 
5143
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
5144
  "license": "MIT"
5145
  },
5146
+ "node_modules/is-stream": {
5147
+ "version": "2.0.1",
5148
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
5149
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
5150
+ "license": "MIT",
5151
+ "engines": {
5152
+ "node": ">=8"
5153
+ },
5154
+ "funding": {
5155
+ "url": "https://github.com/sponsors/sindresorhus"
5156
+ }
5157
+ },
5158
  "node_modules/isexe": {
5159
  "version": "2.0.0",
5160
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
5161
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
5162
+ "devOptional": true,
5163
  "license": "ISC"
5164
  },
5165
+ "node_modules/jackspeak": {
5166
+ "version": "3.4.3",
5167
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
5168
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
5169
+ "license": "BlueOak-1.0.0",
5170
+ "optional": true,
5171
+ "peer": true,
5172
+ "dependencies": {
5173
+ "@isaacs/cliui": "^8.0.2"
5174
+ },
5175
+ "funding": {
5176
+ "url": "https://github.com/sponsors/isaacs"
5177
+ },
5178
+ "optionalDependencies": {
5179
+ "@pkgjs/parseargs": "^0.11.0"
5180
+ }
5181
+ },
5182
+ "node_modules/jose": {
5183
+ "version": "4.15.9",
5184
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
5185
+ "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
5186
+ "license": "MIT",
5187
+ "funding": {
5188
+ "url": "https://github.com/sponsors/panva"
5189
+ }
5190
+ },
5191
  "node_modules/js-tokens": {
5192
  "version": "4.0.0",
5193
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
5221
  "node": ">=6"
5222
  }
5223
  },
5224
+ "node_modules/json-bigint": {
5225
+ "version": "1.0.0",
5226
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
5227
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
5228
+ "license": "MIT",
5229
+ "dependencies": {
5230
+ "bignumber.js": "^9.0.0"
5231
+ }
5232
+ },
5233
  "node_modules/json-buffer": {
5234
  "version": "3.0.1",
5235
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
 
5309
  "safe-buffer": "^5.0.1"
5310
  }
5311
  },
5312
+ "node_modules/jwks-rsa": {
5313
+ "version": "3.2.0",
5314
+ "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz",
5315
+ "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==",
5316
+ "license": "MIT",
5317
+ "dependencies": {
5318
+ "@types/express": "^4.17.20",
5319
+ "@types/jsonwebtoken": "^9.0.4",
5320
+ "debug": "^4.3.4",
5321
+ "jose": "^4.15.4",
5322
+ "limiter": "^1.1.5",
5323
+ "lru-memoizer": "^2.2.0"
5324
+ },
5325
+ "engines": {
5326
+ "node": ">=14"
5327
+ }
5328
+ },
5329
  "node_modules/jws": {
5330
  "version": "4.0.1",
5331
  "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
 
5375
  "node": ">= 0.8.0"
5376
  }
5377
  },
5378
+ "node_modules/limiter": {
5379
+ "version": "1.1.5",
5380
+ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
5381
+ "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="
5382
+ },
5383
  "node_modules/locate-path": {
5384
  "version": "6.0.0",
5385
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
 
5396
  "url": "https://github.com/sponsors/sindresorhus"
5397
  }
5398
  },
5399
+ "node_modules/lodash": {
5400
+ "version": "4.17.21",
5401
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
5402
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
5403
+ "license": "MIT"
5404
+ },
5405
  "node_modules/lodash.camelcase": {
5406
  "version": "4.3.0",
5407
  "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
5408
  "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
5409
  "license": "MIT"
5410
  },
5411
+ "node_modules/lodash.clonedeep": {
5412
+ "version": "4.5.0",
5413
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
5414
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
5415
+ "license": "MIT"
5416
+ },
5417
  "node_modules/lodash.includes": {
5418
  "version": "4.3.0",
5419
  "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
 
5489
  "yallist": "^3.0.2"
5490
  }
5491
  },
5492
+ "node_modules/lru-memoizer": {
5493
+ "version": "2.3.0",
5494
+ "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz",
5495
+ "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==",
5496
+ "license": "MIT",
5497
+ "dependencies": {
5498
+ "lodash.clonedeep": "^4.5.0",
5499
+ "lru-cache": "6.0.0"
5500
+ }
5501
+ },
5502
+ "node_modules/lru-memoizer/node_modules/lru-cache": {
5503
+ "version": "6.0.0",
5504
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
5505
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
5506
+ "license": "ISC",
5507
+ "dependencies": {
5508
+ "yallist": "^4.0.0"
5509
+ },
5510
+ "engines": {
5511
+ "node": ">=10"
5512
+ }
5513
+ },
5514
+ "node_modules/lru-memoizer/node_modules/yallist": {
5515
+ "version": "4.0.0",
5516
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
5517
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
5518
+ "license": "ISC"
5519
+ },
5520
  "node_modules/lucide-react": {
5521
  "version": "0.562.0",
5522
  "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz",
 
6157
  ],
6158
  "license": "MIT"
6159
  },
6160
+ "node_modules/mime": {
6161
+ "version": "3.0.0",
6162
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
6163
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
6164
+ "license": "MIT",
6165
+ "optional": true,
6166
+ "bin": {
6167
+ "mime": "cli.js"
6168
+ },
6169
+ "engines": {
6170
+ "node": ">=10.0.0"
6171
+ }
6172
+ },
6173
  "node_modules/mime-db": {
6174
  "version": "1.52.0",
6175
  "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 
6213
  "url": "https://github.com/sponsors/ljharb"
6214
  }
6215
  },
6216
+ "node_modules/minipass": {
6217
+ "version": "7.1.2",
6218
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
6219
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
6220
+ "license": "ISC",
6221
+ "optional": true,
6222
+ "peer": true,
6223
+ "engines": {
6224
+ "node": ">=16 || 14 >=14.17"
6225
+ }
6226
+ },
6227
  "node_modules/mkdirp": {
6228
  "version": "0.5.6",
6229
  "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
 
6296
  }
6297
  },
6298
  "node_modules/mongoose": {
6299
+ "version": "9.1.1",
6300
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.1.1.tgz",
6301
+ "integrity": "sha512-/CgKSAmjzgIj4o1FyWZIpQ2rmUQlhalwWd4l/Ht3XUVWscHRHev1TIwKz1ADNC5tHHyOQEaUDkEh0jI91c4Ydw==",
6302
  "license": "MIT",
6303
  "dependencies": {
6304
  "kareem": "3.0.0",
 
6424
  "node": "^18 || ^20 || >= 21"
6425
  }
6426
  },
6427
+ "node_modules/node-domexception": {
6428
+ "version": "1.0.0",
6429
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
6430
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
6431
+ "deprecated": "Use your platform's native DOMException instead",
6432
+ "funding": [
6433
+ {
6434
+ "type": "github",
6435
+ "url": "https://github.com/sponsors/jimmywarting"
6436
+ },
6437
+ {
6438
+ "type": "github",
6439
+ "url": "https://paypal.me/jimmywarting"
6440
+ }
6441
+ ],
6442
+ "license": "MIT",
6443
+ "optional": true,
6444
+ "peer": true,
6445
+ "engines": {
6446
+ "node": ">=10.5.0"
6447
+ }
6448
+ },
6449
+ "node_modules/node-fetch": {
6450
+ "version": "2.7.0",
6451
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
6452
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
6453
+ "license": "MIT",
6454
+ "dependencies": {
6455
+ "whatwg-url": "^5.0.0"
6456
+ },
6457
+ "engines": {
6458
+ "node": "4.x || >=6.0.0"
6459
+ },
6460
+ "peerDependencies": {
6461
+ "encoding": "^0.1.0"
6462
+ },
6463
+ "peerDependenciesMeta": {
6464
+ "encoding": {
6465
+ "optional": true
6466
+ }
6467
+ }
6468
+ },
6469
+ "node_modules/node-fetch/node_modules/tr46": {
6470
+ "version": "0.0.3",
6471
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
6472
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
6473
+ "license": "MIT"
6474
+ },
6475
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
6476
+ "version": "3.0.1",
6477
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
6478
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
6479
+ "license": "BSD-2-Clause"
6480
+ },
6481
+ "node_modules/node-fetch/node_modules/whatwg-url": {
6482
+ "version": "5.0.0",
6483
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
6484
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
6485
+ "license": "MIT",
6486
+ "dependencies": {
6487
+ "tr46": "~0.0.3",
6488
+ "webidl-conversions": "^3.0.0"
6489
+ }
6490
+ },
6491
+ "node_modules/node-forge": {
6492
+ "version": "1.3.3",
6493
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
6494
+ "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
6495
+ "license": "(BSD-3-Clause OR GPL-2.0)",
6496
+ "engines": {
6497
+ "node": ">= 6.13.0"
6498
+ }
6499
+ },
6500
  "node_modules/node-gyp-build": {
6501
  "version": "4.8.4",
6502
  "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
 
6515
  "dev": true,
6516
  "license": "MIT"
6517
  },
6518
+ "node_modules/nodemailer": {
6519
+ "version": "7.0.12",
6520
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.12.tgz",
6521
+ "integrity": "sha512-H+rnK5bX2Pi/6ms3sN4/jRQvYSMltV6vqup/0SFOrxYYY/qoNvhXPlYq3e+Pm9RFJRwrMGbMIwi81M4dxpomhA==",
6522
+ "license": "MIT-0",
6523
+ "engines": {
6524
+ "node": ">=6.0.0"
6525
+ }
6526
+ },
6527
  "node_modules/object-assign": {
6528
  "version": "4.1.1",
6529
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
6533
  "node": ">=0.10.0"
6534
  }
6535
  },
6536
+ "node_modules/object-hash": {
6537
+ "version": "3.0.0",
6538
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
6539
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
6540
+ "license": "MIT",
6541
+ "optional": true,
6542
+ "engines": {
6543
+ "node": ">= 6"
6544
+ }
6545
+ },
6546
  "node_modules/object-inspect": {
6547
  "version": "1.13.4",
6548
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
 
6598
  "version": "3.1.0",
6599
  "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
6600
  "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
6601
+ "devOptional": true,
6602
  "license": "MIT",
6603
  "dependencies": {
6604
  "yocto-queue": "^0.1.0"
 
6626
  "url": "https://github.com/sponsors/sindresorhus"
6627
  }
6628
  },
6629
+ "node_modules/package-json-from-dist": {
6630
+ "version": "1.0.1",
6631
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
6632
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
6633
+ "license": "BlueOak-1.0.0",
6634
+ "optional": true,
6635
+ "peer": true
6636
+ },
6637
  "node_modules/parent-module": {
6638
  "version": "1.0.1",
6639
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
6695
  "version": "3.1.1",
6696
  "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
6697
  "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
6698
+ "devOptional": true,
6699
  "license": "MIT",
6700
  "engines": {
6701
  "node": ">=8"
6702
  }
6703
  },
6704
+ "node_modules/path-scurry": {
6705
+ "version": "1.11.1",
6706
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
6707
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
6708
+ "license": "BlueOak-1.0.0",
6709
+ "optional": true,
6710
+ "peer": true,
6711
+ "dependencies": {
6712
+ "lru-cache": "^10.2.0",
6713
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
6714
+ },
6715
+ "engines": {
6716
+ "node": ">=16 || 14 >=14.18"
6717
+ },
6718
+ "funding": {
6719
+ "url": "https://github.com/sponsors/isaacs"
6720
+ }
6721
+ },
6722
+ "node_modules/path-scurry/node_modules/lru-cache": {
6723
+ "version": "10.4.3",
6724
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
6725
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
6726
+ "license": "ISC",
6727
+ "optional": true,
6728
+ "peer": true
6729
+ },
6730
  "node_modules/path-to-regexp": {
6731
  "version": "8.3.0",
6732
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
 
6813
  "url": "https://github.com/sponsors/wooorm"
6814
  }
6815
  },
6816
+ "node_modules/proto3-json-serializer": {
6817
+ "version": "2.0.2",
6818
+ "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz",
6819
+ "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==",
6820
+ "license": "Apache-2.0",
6821
+ "optional": true,
6822
+ "dependencies": {
6823
+ "protobufjs": "^7.2.5"
6824
+ },
6825
+ "engines": {
6826
+ "node": ">=14.0.0"
6827
+ }
6828
+ },
6829
  "node_modules/protobufjs": {
6830
  "version": "7.5.4",
6831
  "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
 
6878
  "node": ">=6"
6879
  }
6880
  },
6881
+ "node_modules/q": {
6882
+ "version": "1.5.1",
6883
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
6884
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
6885
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
6886
+ "license": "MIT",
6887
+ "engines": {
6888
+ "node": ">=0.6.0",
6889
+ "teleport": ">=0.2.0"
6890
+ }
6891
+ },
6892
  "node_modules/qs": {
6893
  "version": "6.14.1",
6894
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
 
7066
  "node": ">=4"
7067
  }
7068
  },
7069
+ "node_modules/retry": {
7070
+ "version": "0.13.1",
7071
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
7072
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
7073
+ "license": "MIT",
7074
+ "optional": true,
7075
+ "engines": {
7076
+ "node": ">= 4"
7077
+ }
7078
+ },
7079
+ "node_modules/retry-request": {
7080
+ "version": "7.0.2",
7081
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
7082
+ "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
7083
+ "license": "MIT",
7084
+ "optional": true,
7085
+ "dependencies": {
7086
+ "@types/request": "^2.48.8",
7087
+ "extend": "^3.0.2",
7088
+ "teeny-request": "^9.0.0"
7089
+ },
7090
+ "engines": {
7091
+ "node": ">=14"
7092
+ }
7093
+ },
7094
+ "node_modules/rimraf": {
7095
+ "version": "5.0.10",
7096
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
7097
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
7098
+ "license": "ISC",
7099
+ "optional": true,
7100
+ "peer": true,
7101
+ "dependencies": {
7102
+ "glob": "^10.3.7"
7103
+ },
7104
+ "bin": {
7105
+ "rimraf": "dist/esm/bin.mjs"
7106
+ },
7107
+ "funding": {
7108
+ "url": "https://github.com/sponsors/isaacs"
7109
+ }
7110
+ },
7111
  "node_modules/rollup": {
7112
  "version": "4.54.0",
7113
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz",
 
7288
  "version": "2.0.0",
7289
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
7290
  "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
7291
+ "devOptional": true,
7292
  "license": "MIT",
7293
  "dependencies": {
7294
  "shebang-regex": "^3.0.0"
 
7301
  "version": "3.0.0",
7302
  "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
7303
  "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
7304
+ "devOptional": true,
7305
  "license": "MIT",
7306
  "engines": {
7307
  "node": ">=8"
 
7385
  "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
7386
  "license": "MIT"
7387
  },
7388
+ "node_modules/signal-exit": {
7389
+ "version": "4.1.0",
7390
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
7391
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
7392
+ "license": "ISC",
7393
+ "optional": true,
7394
+ "peer": true,
7395
+ "engines": {
7396
+ "node": ">=14"
7397
+ },
7398
+ "funding": {
7399
+ "url": "https://github.com/sponsors/isaacs"
7400
+ }
7401
+ },
7402
  "node_modules/socket.io": {
7403
  "version": "4.8.3",
7404
  "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz",
 
7515
  "node": ">= 0.8"
7516
  }
7517
  },
7518
+ "node_modules/stream-events": {
7519
+ "version": "1.0.5",
7520
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
7521
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
7522
+ "license": "MIT",
7523
+ "optional": true,
7524
+ "dependencies": {
7525
+ "stubs": "^3.0.0"
7526
+ }
7527
+ },
7528
+ "node_modules/stream-shift": {
7529
+ "version": "1.0.3",
7530
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
7531
+ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
7532
+ "license": "MIT",
7533
+ "optional": true
7534
+ },
7535
  "node_modules/streamsearch": {
7536
  "version": "1.1.0",
7537
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 
7563
  "node": ">=8"
7564
  }
7565
  },
7566
+ "node_modules/string-width-cjs": {
7567
+ "name": "string-width",
7568
+ "version": "4.2.3",
7569
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
7570
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
7571
+ "license": "MIT",
7572
+ "optional": true,
7573
+ "peer": true,
7574
+ "dependencies": {
7575
+ "emoji-regex": "^8.0.0",
7576
+ "is-fullwidth-code-point": "^3.0.0",
7577
+ "strip-ansi": "^6.0.1"
7578
+ },
7579
+ "engines": {
7580
+ "node": ">=8"
7581
+ }
7582
+ },
7583
  "node_modules/stringify-entities": {
7584
  "version": "4.0.4",
7585
  "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
 
7606
  "node": ">=8"
7607
  }
7608
  },
7609
+ "node_modules/strip-ansi-cjs": {
7610
+ "name": "strip-ansi",
7611
+ "version": "6.0.1",
7612
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
7613
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
7614
+ "license": "MIT",
7615
+ "optional": true,
7616
+ "peer": true,
7617
+ "dependencies": {
7618
+ "ansi-regex": "^5.0.1"
7619
+ },
7620
+ "engines": {
7621
+ "node": ">=8"
7622
+ }
7623
+ },
7624
  "node_modules/strip-json-comments": {
7625
  "version": "3.1.1",
7626
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
 
7634
  "url": "https://github.com/sponsors/sindresorhus"
7635
  }
7636
  },
7637
+ "node_modules/strnum": {
7638
+ "version": "1.1.2",
7639
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz",
7640
+ "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==",
7641
+ "funding": [
7642
+ {
7643
+ "type": "github",
7644
+ "url": "https://github.com/sponsors/NaturalIntelligence"
7645
+ }
7646
+ ],
7647
+ "license": "MIT",
7648
+ "optional": true
7649
+ },
7650
+ "node_modules/stubs": {
7651
+ "version": "3.0.0",
7652
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
7653
+ "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==",
7654
+ "license": "MIT",
7655
+ "optional": true
7656
+ },
7657
  "node_modules/style-to-js": {
7658
  "version": "1.1.21",
7659
  "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
 
7692
  "dev": true,
7693
  "license": "MIT"
7694
  },
7695
+ "node_modules/teeny-request": {
7696
+ "version": "9.0.0",
7697
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
7698
+ "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
7699
+ "license": "Apache-2.0",
7700
+ "optional": true,
7701
+ "dependencies": {
7702
+ "http-proxy-agent": "^5.0.0",
7703
+ "https-proxy-agent": "^5.0.0",
7704
+ "node-fetch": "^2.6.9",
7705
+ "stream-events": "^1.0.5",
7706
+ "uuid": "^9.0.0"
7707
+ },
7708
+ "engines": {
7709
+ "node": ">=14"
7710
+ }
7711
+ },
7712
+ "node_modules/teeny-request/node_modules/agent-base": {
7713
+ "version": "6.0.2",
7714
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
7715
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
7716
+ "license": "MIT",
7717
+ "optional": true,
7718
+ "dependencies": {
7719
+ "debug": "4"
7720
+ },
7721
+ "engines": {
7722
+ "node": ">= 6.0.0"
7723
+ }
7724
+ },
7725
+ "node_modules/teeny-request/node_modules/https-proxy-agent": {
7726
+ "version": "5.0.1",
7727
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
7728
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
7729
+ "license": "MIT",
7730
+ "optional": true,
7731
+ "dependencies": {
7732
+ "agent-base": "6",
7733
+ "debug": "4"
7734
+ },
7735
+ "engines": {
7736
+ "node": ">= 6"
7737
+ }
7738
+ },
7739
+ "node_modules/teeny-request/node_modules/uuid": {
7740
+ "version": "9.0.1",
7741
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
7742
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
7743
+ "funding": [
7744
+ "https://github.com/sponsors/broofa",
7745
+ "https://github.com/sponsors/ctavan"
7746
+ ],
7747
+ "license": "MIT",
7748
+ "optional": true,
7749
+ "bin": {
7750
+ "uuid": "dist/bin/uuid"
7751
+ }
7752
+ },
7753
  "node_modules/tinyglobby": {
7754
  "version": "0.2.15",
7755
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
 
8021
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
8022
  "license": "MIT"
8023
  },
8024
+ "node_modules/uuid": {
8025
+ "version": "11.1.0",
8026
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
8027
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
8028
+ "funding": [
8029
+ "https://github.com/sponsors/broofa",
8030
+ "https://github.com/sponsors/ctavan"
8031
+ ],
8032
+ "license": "MIT",
8033
+ "bin": {
8034
+ "uuid": "dist/esm/bin/uuid"
8035
+ }
8036
+ },
8037
  "node_modules/vary": {
8038
  "version": "1.1.2",
8039
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 
8146
  }
8147
  }
8148
  },
8149
+ "node_modules/web-streams-polyfill": {
8150
+ "version": "3.3.3",
8151
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
8152
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
8153
+ "license": "MIT",
8154
+ "optional": true,
8155
+ "peer": true,
8156
+ "engines": {
8157
+ "node": ">= 8"
8158
+ }
8159
+ },
8160
  "node_modules/web-vitals": {
8161
  "version": "4.2.4",
8162
  "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
 
8212
  "version": "2.0.2",
8213
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
8214
  "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
8215
+ "devOptional": true,
8216
  "license": "ISC",
8217
  "dependencies": {
8218
  "isexe": "^2.0.0"
 
8251
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
8252
  }
8253
  },
8254
+ "node_modules/wrap-ansi-cjs": {
8255
+ "name": "wrap-ansi",
8256
+ "version": "7.0.0",
8257
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
8258
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
8259
+ "license": "MIT",
8260
+ "optional": true,
8261
+ "peer": true,
8262
+ "dependencies": {
8263
+ "ansi-styles": "^4.0.0",
8264
+ "string-width": "^4.1.0",
8265
+ "strip-ansi": "^6.0.0"
8266
+ },
8267
+ "engines": {
8268
+ "node": ">=10"
8269
+ },
8270
+ "funding": {
8271
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
8272
+ }
8273
+ },
8274
  "node_modules/wrappy": {
8275
  "version": "1.0.2",
8276
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 
8362
  "version": "0.1.0",
8363
  "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
8364
  "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
8365
+ "devOptional": true,
8366
  "license": "MIT",
8367
  "engines": {
8368
  "node": ">=10"
kibali-ui/package.json → package.json RENAMED
@@ -10,23 +10,30 @@
10
  "preview": "vite preview"
11
  },
12
  "dependencies": {
 
13
  "axios": "^1.13.2",
14
  "bcrypt": "^6.0.0",
 
 
 
15
  "cors": "^2.8.5",
16
  "dotenv": "^17.2.3",
17
  "express": "^5.2.1",
18
  "firebase": "^12.7.0",
 
19
  "jsonwebtoken": "^9.0.3",
20
  "leaflet": "^1.9.4",
21
  "lucide-react": "^0.562.0",
22
- "mongoose": "^9.1.0",
23
  "multer": "^2.0.2",
 
24
  "react": "^19.2.0",
25
  "react-dom": "^19.2.0",
26
  "react-leaflet": "^5.0.0",
27
  "react-markdown": "^10.1.0",
28
  "socket.io": "^4.8.3",
29
- "socket.io-client": "^4.8.3"
 
30
  },
31
  "devDependencies": {
32
  "@eslint/js": "^9.39.1",
 
10
  "preview": "vite preview"
11
  },
12
  "dependencies": {
13
+ "@simplewebauthn/browser": "^13.2.2",
14
  "axios": "^1.13.2",
15
  "bcrypt": "^6.0.0",
16
+ "bcryptjs": "^3.0.3",
17
+ "body-parser": "^2.2.1",
18
+ "cloudinary": "^2.8.0",
19
  "cors": "^2.8.5",
20
  "dotenv": "^17.2.3",
21
  "express": "^5.2.1",
22
  "firebase": "^12.7.0",
23
+ "firebase-admin": "^13.6.0",
24
  "jsonwebtoken": "^9.0.3",
25
  "leaflet": "^1.9.4",
26
  "lucide-react": "^0.562.0",
27
+ "mongoose": "^9.1.1",
28
  "multer": "^2.0.2",
29
+ "nodemailer": "^7.0.12",
30
  "react": "^19.2.0",
31
  "react-dom": "^19.2.0",
32
  "react-leaflet": "^5.0.0",
33
  "react-markdown": "^10.1.0",
34
  "socket.io": "^4.8.3",
35
+ "socket.io-client": "^4.8.3",
36
+ "ws": "^8.18.3"
37
  },
38
  "devDependencies": {
39
  "@eslint/js": "^9.39.1",
{kibali-ui → public}/kibali_logo.svg RENAMED
File without changes
{kibali-ui/public → public}/manifest.json RENAMED
@@ -1,15 +1,15 @@
1
- {
2
- "short_name": "Kibali",
3
- "name": "Kibali AI Assistant",
4
- "icons": [
5
- {
6
- "src": "/kibali_logo.svg",
7
- "type": "image/svg+xml",
8
- "sizes": "512x512"
9
- }
10
- ],
11
- "start_url": ".",
12
- "display": "standalone",
13
- "theme_color": "#000000",
14
- "background_color": "#ffffff"
15
  }
 
1
+ {
2
+ "short_name": "Kibali",
3
+ "name": "Kibali AI Assistant",
4
+ "icons": [
5
+ {
6
+ "src": "/kibali_logo.svg",
7
+ "type": "image/svg+xml",
8
+ "sizes": "512x512"
9
+ }
10
+ ],
11
+ "start_url": ".",
12
+ "display": "standalone",
13
+ "theme_color": "#000000",
14
+ "background_color": "#ffffff"
15
  }
server.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import 'dotenv/config';
2
+ import express from 'express';
3
+ import mongoose from 'mongoose';
4
+ import cors from 'cors';
5
+ import bcrypt from 'bcryptjs';
6
+ import jwt from 'jsonwebtoken';
7
+ import nodemailer from 'nodemailer';
8
+ import crypto from 'crypto';
9
+ import path from 'path';
10
+ import fs from 'fs';
11
+ import { fileURLToPath } from 'url';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+
16
+ const app = express();
17
+ app.use(cors());
18
+ app.use(express.json());
19
+
20
+ // --- CONNEXION MONGODB ---
21
+ mongoose.connect(process.env.MONGO_URI)
22
+ .then(() => console.log('✅ MongoDB Connecté'))
23
+ .catch(err => console.error('❌ Erreur DB:', err));
24
+
25
+ // --- CONFIGURATION NODEMAILER (CORRIGÉE) ---
26
+ const transporter = nodemailer.createTransport({
27
+ host: 'smtp.gmail.com',
28
+ port: 465,
29
+ secure: true, // Utilisation du port SSL 465
30
+ auth: {
31
+ user: process.env.EMAIL_USER,
32
+ pass: process.env.EMAIL_PASS
33
+ },
34
+ tls: {
35
+ rejectUnauthorized: false // Aide à passer outre certains blocages réseau
36
+ }
37
+ });
38
+
39
+ // Vérification immédiate
40
+ transporter.verify((error) => {
41
+ if (error) {
42
+ console.error('❌ Erreur SMTP Persistante:', error.message);
43
+ } else {
44
+ console.log('📧 Serveur SMTP authentifié avec succès !');
45
+ }
46
+ });
47
+
48
+ const User = mongoose.model('User', new mongoose.Schema({
49
+ email: { type: String, unique: true, required: true },
50
+ password: { type: String, required: true },
51
+ otp: String,
52
+ otpExpires: Date
53
+ }));
54
+
55
+ // --- ROUTE REGISTER ---
56
+ app.post('/api/auth/register', async (req, res) => {
57
+ const { email, password } = req.body;
58
+ const otp = Math.floor(100000 + Math.random() * 900000).toString();
59
+
60
+ try {
61
+ let user = await User.findOne({ email });
62
+ if (!user) {
63
+ const hashedPassword = await bcrypt.hash(password, 10);
64
+ user = new User({ email, password: hashedPassword, otp, otpExpires: Date.now() + 600000 });
65
+ } else {
66
+ user.otp = otp;
67
+ user.otpExpires = Date.now() + 600000;
68
+ }
69
+ await user.save();
70
+
71
+ await transporter.sendMail({
72
+ from: `"Kibali AI" <${process.env.EMAIL_USER}>`,
73
+ to: email,
74
+ subject: `Code de vérification : ${otp}`,
75
+ html: `<div style="text-align:center; padding:20px; border:2px solid #10b981;">
76
+ <h1>Votre code Kibali</h1>
77
+ <p style="font-size:30px; font-weight:bold;">${otp}</p>
78
+ </div>`
79
+ });
80
+
81
+ res.json({ message: "OTP envoyé" });
82
+ } catch (err) {
83
+ console.error("Erreur lors du register:", err);
84
+ res.status(500).json({ error: "Erreur serveur ou SMTP" });
85
+ }
86
+ });
87
+
88
+ const PORT = process.env.PORT || 5000;
89
+ app.listen(PORT, () => console.log(`🚀 Serveur actif sur le port ${PORT}`));
{kibali-ui/src → src}/App.css RENAMED
File without changes
{kibali-ui/src → src}/App.jsx RENAMED
@@ -3,10 +3,36 @@ import axios from 'axios';
3
  import {
4
  Send, FileText, Upload, Globe, MapPin,
5
  Loader2, Trash2, Image as ImageIcon, Search, Brain, ChevronDown, ChevronUp, User,
6
- Database, Clock, TrendingUp, AlertCircle, CheckCircle, Zap
 
7
  } from 'lucide-react';
8
-
9
- const API_BASE = "http://localhost:8000";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  const LOGO_PATH = "/kibali_logo.svg";
11
 
12
  function App() {
@@ -18,18 +44,49 @@ function App() {
18
  doc_chunks: 0,
19
  memory_entries: 0,
20
  current_subject: null,
21
- subject_message_count: 0
 
 
22
  });
23
  const [showThinking, setShowThinking] = useState({});
24
  const [uploadProgress, setUploadProgress] = useState(null);
 
 
 
25
  const scrollRef = useRef(null);
26
  const pollingInterval = useRef(null);
27
 
28
- // Récupération du status backend au démarrage et périodiquement
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  useEffect(() => {
30
  fetchStatus();
31
- pollingInterval.current = setInterval(fetchStatus, 10000); // Toutes les 10 secondes
32
-
33
  return () => {
34
  if (pollingInterval.current) {
35
  clearInterval(pollingInterval.current);
@@ -46,6 +103,26 @@ function App() {
46
  }
47
  };
48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  // Auto-scroll vers le bas
50
  useEffect(() => {
51
  scrollRef.current?.scrollIntoView({ behavior: "smooth" });
@@ -55,7 +132,12 @@ function App() {
55
  const handleSend = async () => {
56
  if (!input.trim() || loading) return;
57
 
58
- const userMsg = { role: "user", content: input.trim() };
 
 
 
 
 
59
  setMessages(prev => [...prev, userMsg]);
60
  setInput("");
61
  setLoading(true);
@@ -68,7 +150,7 @@ function App() {
68
  city: "Libreville",
69
  thinking_mode: true
70
  }, {
71
- timeout: 120000 // 120 secondes pour les requêtes complexes
72
  });
73
 
74
  const aiResponse = response.data.response || "Réponse reçue du serveur.";
@@ -83,16 +165,15 @@ function App() {
83
  timestamp: new Date().toISOString()
84
  }]);
85
 
86
- // Mise à jour du status après la réponse
87
  fetchStatus();
88
  } catch (error) {
89
  console.error("Erreur lors de l'appel au backend:", error);
90
  let errorMsg = "Erreur : impossible de contacter le serveur IA.";
91
-
92
  if (error.code === 'ERR_NETWORK') {
93
- errorMsg = "⚠️ Serveur injoignable. Vérifiez que votre backend est lancé sur http://localhost:8000";
94
  } else if (error.code === 'ECONNABORTED') {
95
- errorMsg = "⏱️ Timeout : la requête a pris trop de temps. Le modèle est peut-être surchargé.";
96
  } else if (error.response?.status === 400) {
97
  errorMsg = `❌ Erreur de requête : ${error.response.data.detail || 'Format invalide'}`;
98
  } else if (error.response?.status === 500) {
@@ -112,7 +193,7 @@ function App() {
112
  }
113
  };
114
 
115
- // Upload de fichiers PDF avec feedback de progression
116
  const handleFileUpload = async (e) => {
117
  const files = Array.from(e.target.files);
118
  if (!files.length) return;
@@ -126,7 +207,7 @@ function App() {
126
  try {
127
  const res = await axios.post(`${API_BASE}/upload`, formData, {
128
  headers: { 'Content-Type': 'multipart/form-data' },
129
- timeout: 180000, // 3 minutes pour les gros PDFs
130
  onUploadProgress: (progressEvent) => {
131
  const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
132
  setUploadProgress(prev => ({ ...prev, percent: percentCompleted }));
@@ -137,7 +218,6 @@ function App() {
137
  const filesProcessed = res.data.files_processed || 0;
138
  const totalChunks = res.data.total_doc_chunks || 0;
139
 
140
- // Mise à jour du status immédiate
141
  setStatus(prev => ({ ...prev, doc_chunks: totalChunks }));
142
 
143
  setMessages(prev => [...prev, {
@@ -147,12 +227,10 @@ function App() {
147
  timestamp: new Date().toISOString()
148
  }]);
149
 
150
- // Refresh complet du status
151
  fetchStatus();
152
  } catch (err) {
153
  console.error("Erreur upload:", err);
154
  let errorMsg = "❌ Échec de l'import des documents.";
155
-
156
  if (err.code === 'ECONNABORTED') {
157
  errorMsg += " Timeout : les fichiers sont peut-être trop volumineux.";
158
  } else if (err.response?.data?.detail) {
@@ -172,18 +250,15 @@ function App() {
172
  }
173
  };
174
 
175
- // Réinitialisation du chat ET de la mémoire
176
  const handleReset = async () => {
177
- if (!window.confirm("Voulez-vous réinitialiser la conversation ET effacer la mémoire du modèle ?")) {
178
- return;
179
- }
180
 
181
  try {
182
- // Appeler l'endpoint de clear memory
183
  await axios.post(`${API_BASE}/clear-memory`, {}, { timeout: 5000 });
184
  setMessages([]);
185
  fetchStatus();
186
-
187
  setMessages([{
188
  role: "assistant",
189
  content: "✅ Conversation et mémoire réinitialisées avec succès.",
@@ -195,17 +270,16 @@ function App() {
195
  setMessages([{
196
  role: "assistant",
197
  content: "⚠️ Chat réinitialisé, mais impossible de contacter le serveur pour effacer la mémoire.",
198
- error: true
 
199
  }]);
200
  }
201
  };
202
 
203
- // Toggle thinking pour chaque message
204
  const toggleThinking = (msgIndex) => {
205
  setShowThinking(prev => ({ ...prev, [msgIndex]: !prev[msgIndex] }));
206
  };
207
 
208
- // Formatage du temps relatif
209
  const formatTimeAgo = (timestamp) => {
210
  if (!timestamp) return "";
211
  const seconds = Math.floor((new Date() - new Date(timestamp)) / 1000);
@@ -230,7 +304,34 @@ function App() {
230
  inputField: { flex: 1, background: 'transparent', border: 'none', color: 'white', padding: '0.8rem', outline: 'none', fontSize: '1rem' },
231
  sendBtn: { backgroundColor: '#10b981', color: 'white', border: 'none', borderRadius: '1rem', width: '45px', height: '45px', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', transition: 'all 0.2s' },
232
  toolBadge: { display: 'flex', alignItems: 'center', gap: '6px', fontSize: '11px', backgroundColor: '#020617', padding: '6px 12px', borderRadius: '10px', border: '1px solid #1e293b', color: '#94a3b8' },
233
- statCard: { backgroundColor: 'rgba(2, 6, 23, 0.5)', borderRadius: '1rem', padding: '1rem', border: '1px solid #1e293b', marginBottom: '0.8rem' }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  };
235
 
236
  return (
@@ -252,7 +353,97 @@ function App() {
252
  </div>
253
 
254
  <div style={{ padding: '2rem', flex: 1, display: 'flex', flexDirection: 'column', gap: '2rem' }}>
255
- {/* Upload de documents */}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  <div>
257
  <h2 style={{ fontSize: '11px', color: '#475569', textTransform: 'uppercase', letterSpacing: '1.5px', marginBottom: '1rem', fontWeight: '800' }}>
258
  📚 Documents
@@ -298,13 +489,12 @@ function App() {
298
  </label>
299
  </div>
300
 
301
- {/* Statistiques enrichies */}
302
  <div>
303
  <h3 style={{ fontSize: '11px', color: '#475569', textTransform: 'uppercase', marginBottom: '1rem', fontWeight: '800', letterSpacing: '1.5px' }}>
304
  📊 Statistiques
305
  </h3>
306
-
307
- {/* Base de connaissances */}
308
  <div style={styles.statCard}>
309
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
310
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
@@ -319,7 +509,6 @@ function App() {
319
  </div>
320
  </div>
321
 
322
- {/* Mémoire conversationnelle */}
323
  <div style={styles.statCard}>
324
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
325
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
@@ -334,7 +523,6 @@ function App() {
334
  </div>
335
  </div>
336
 
337
- {/* Contexte conversationnel */}
338
  {status.current_subject && (
339
  <div style={styles.statCard}>
340
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
@@ -351,7 +539,6 @@ function App() {
351
  </div>
352
  )}
353
 
354
- {/* Localisation */}
355
  <div style={styles.statCard}>
356
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
357
  <span style={{ color: '#64748b', fontSize: '12px' }}>Position</span>
@@ -361,7 +548,6 @@ function App() {
361
  </div>
362
  </div>
363
 
364
- {/* Santé du système */}
365
  <div style={styles.statCard}>
366
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
367
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
@@ -431,6 +617,43 @@ function App() {
431
  <p style={{ color: '#64748b', maxWidth: '450px', lineHeight: '1.7', fontSize: '1.1rem' }}>
432
  Assistant IA expert du Gabon avec mémoire contextuelle et analyse documentaire avancée.
433
  </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
434
  <div style={{ display: 'flex', gap: '1rem', marginTop: '2rem' }}>
435
  <div style={{ textAlign: 'center' }}>
436
  <div style={{ fontSize: '2rem', fontWeight: 'bold', color: '#10b981' }}>{status.doc_chunks}</div>
@@ -456,10 +679,27 @@ function App() {
456
  justifyContent: 'center',
457
  backgroundColor: m.role === 'user' ? '#059669' : m.error ? '#7f1d1d' : m.success ? '#064e3b' : '#1e293b',
458
  flexShrink: 0,
459
- border: '1px solid #334155'
 
460
  }}>
461
  {m.role === 'user' ? (
462
- <User size={24} color="white" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  ) : m.error ? (
464
  <AlertCircle size={24} color="#ef4444" />
465
  ) : m.success ? (
@@ -470,7 +710,6 @@ function App() {
470
  </div>
471
 
472
  <div style={{ display: 'flex', flexDirection: 'column', gap: '0.8rem', width: '100%' }}>
473
- {/* Informations contextuelles */}
474
  {m.role === 'assistant' && !m.error && !m.success && m.context_info && (
475
  <div style={{ backgroundColor: 'rgba(30, 41, 59, 0.3)', borderRadius: '12px', padding: '10px 14px', border: '1px solid #1e293b' }}>
476
  <button
@@ -482,7 +721,7 @@ function App() {
482
  </span>
483
  {showThinking[i] ? <ChevronUp size={14} /> : <ChevronDown size={14} />}
484
  </button>
485
-
486
  {showThinking[i] && (
487
  <>
488
  <div style={{ display: 'flex', gap: '8px', marginTop: '12px', flexWrap: 'wrap' }}>
@@ -503,7 +742,6 @@ function App() {
503
  </div>
504
  </div>
505
 
506
- {/* Détails du contexte */}
507
  <div style={{ marginTop: '12px', fontSize: '11px', color: '#64748b', padding: '10px', backgroundColor: '#020617', borderRadius: '8px' }}>
508
  {m.context_info.subject_keywords?.length > 0 && (
509
  <div style={{ marginBottom: '8px' }}>
@@ -526,7 +764,6 @@ function App() {
526
  </div>
527
  )}
528
 
529
- {/* Bulle de message */}
530
  <div style={{
531
  ...(m.role === 'user' ? styles.userBubble : m.error ? styles.errorBubble : m.success ? styles.successBubble : styles.aiBubble),
532
  position: 'relative'
@@ -541,14 +778,13 @@ function App() {
541
  )}
542
  </div>
543
 
544
- {/* Images */}
545
  {m.images && m.images.length > 0 && (
546
  <div style={{ display: 'flex', gap: '12px', marginTop: '8px', overflowX: 'auto', paddingBottom: '10px' }}>
547
  {m.images.map((img, idx) => (
548
  <div key={idx} style={{ flexShrink: 0, position: 'relative', borderRadius: '1.2rem', overflow: 'hidden', border: '2px solid #334155', backgroundColor: '#0f172a' }}>
549
- <img
550
- src={img}
551
- alt={`Image ${idx + 1}`}
552
  style={{ height: '180px', width: '280px', objectFit: 'cover' }}
553
  onError={(e) => {
554
  e.target.style.display = 'none';
@@ -597,28 +833,28 @@ function App() {
597
  <Search size={22} color="#475569" style={{ marginRight: '10px' }} />
598
  <input
599
  style={styles.inputField}
600
- placeholder="Posez votre question sur le Gabon, vos documents ou l'actualité..."
601
  value={input}
602
  onChange={(e) => setInput(e.target.value)}
603
  onKeyDown={(e) => {
604
- if (e.key === 'Enter' && !e.shiftKey) {
605
  e.preventDefault();
606
  handleSend();
607
  }
608
  }}
609
- disabled={loading}
610
  />
611
  <button
612
- style={{
613
- ...styles.sendBtn,
614
- opacity: input.trim() && !loading ? 1 : 0.4,
615
- cursor: input.trim() && !loading ? 'pointer' : 'not-allowed',
616
- transform: input.trim() && !loading ? 'scale(1)' : 'scale(0.95)'
617
  }}
618
  onClick={handleSend}
619
- disabled={loading || !input.trim()}
620
  onMouseEnter={(e) => {
621
- if (input.trim() && !loading) {
622
  e.target.style.backgroundColor = '#059669';
623
  e.target.style.transform = 'scale(1.05)';
624
  }
 
3
  import {
4
  Send, FileText, Upload, Globe, MapPin,
5
  Loader2, Trash2, Image as ImageIcon, Search, Brain, ChevronDown, ChevronUp, User,
6
+ Database, Clock, TrendingUp, AlertCircle, CheckCircle, Zap,
7
+ LogOut
8
  } from 'lucide-react';
9
+ import { initializeApp } from 'firebase/app';
10
+ import {
11
+ getAuth,
12
+ GoogleAuthProvider,
13
+ signInWithRedirect,
14
+ signOut,
15
+ onAuthStateChanged,
16
+ getRedirectResult
17
+ } from 'firebase/auth';
18
+
19
+ // Configuration Firebase
20
+ const firebaseConfig = {
21
+ apiKey: import.meta.env.VITE_FIREBASE_API_KEY || "AIzaSyCel4qvAtZomh4aQOCArCLIYSYmeZ4Qbig",
22
+ authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN || "sevenstatut.firebaseapp.com",
23
+ databaseURL: import.meta.env.VITE_FIREBASE_DATABASE_URL || "https://sevenstatut-default-rtdb.firebaseio.com",
24
+ projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID || "sevenstatut",
25
+ storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET || "sevenstatut.firebasestorage.app",
26
+ messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID || "838268990346",
27
+ appId: import.meta.env.VITE_FIREBASE_APP_ID || "1:838268990346:web:dba8702c39e82981704e73"
28
+ };
29
+
30
+ // Initialiser Firebase
31
+ const app = initializeApp(firebaseConfig);
32
+ const auth = getAuth(app);
33
+ const googleProvider = new GoogleAuthProvider();
34
+
35
+ const API_BASE = "https://belikanm-kibali-api.hf.space";
36
  const LOGO_PATH = "/kibali_logo.svg";
37
 
38
  function App() {
 
44
  doc_chunks: 0,
45
  memory_entries: 0,
46
  current_subject: null,
47
+ subject_message_count: 0,
48
+ torch_cuda_available: false,
49
+ status: 'unknown'
50
  });
51
  const [showThinking, setShowThinking] = useState({});
52
  const [uploadProgress, setUploadProgress] = useState(null);
53
+ const [user, setUser] = useState(null);
54
+ const [authLoading, setAuthLoading] = useState(true);
55
+
56
  const scrollRef = useRef(null);
57
  const pollingInterval = useRef(null);
58
 
59
+ // Gestion de l'authentification
60
+ useEffect(() => {
61
+ // Vérifier le résultat de la redirection
62
+ getRedirectResult(auth)
63
+ .then((result) => {
64
+ if (result) {
65
+ setUser(result.user);
66
+ }
67
+ setAuthLoading(false);
68
+ })
69
+ .catch((error) => {
70
+ console.error("Erreur lors de la redirection:", error);
71
+ setAuthLoading(false);
72
+ });
73
+
74
+ // Écouter les changements d'état d'authentification
75
+ const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
76
+ setUser(firebaseUser);
77
+ if (!firebaseUser) {
78
+ setAuthLoading(false);
79
+ }
80
+ });
81
+
82
+ return () => unsubscribe();
83
+ }, []);
84
+
85
+ // Récupération du statut du backend au démarrage et toutes les 10 secondes
86
  useEffect(() => {
87
  fetchStatus();
88
+ pollingInterval.current = setInterval(fetchStatus, 10000);
89
+
90
  return () => {
91
  if (pollingInterval.current) {
92
  clearInterval(pollingInterval.current);
 
103
  }
104
  };
105
 
106
+ // Connexion Google avec redirection
107
+ const handleGoogleLogin = async () => {
108
+ try {
109
+ await signInWithRedirect(auth, googleProvider);
110
+ } catch (error) {
111
+ console.error("Erreur de connexion Google:", error);
112
+ alert(`Erreur de connexion: ${error.message}`);
113
+ }
114
+ };
115
+
116
+ // Déconnexion
117
+ const handleLogout = async () => {
118
+ try {
119
+ await signOut(auth);
120
+ setUser(null);
121
+ } catch (error) {
122
+ console.error("Erreur de déconnexion:", error);
123
+ }
124
+ };
125
+
126
  // Auto-scroll vers le bas
127
  useEffect(() => {
128
  scrollRef.current?.scrollIntoView({ behavior: "smooth" });
 
132
  const handleSend = async () => {
133
  if (!input.trim() || loading) return;
134
 
135
+ const userMsg = {
136
+ role: "user",
137
+ content: input.trim(),
138
+ userPhoto: user?.photoURL || null,
139
+ userName: user?.displayName || "Utilisateur"
140
+ };
141
  setMessages(prev => [...prev, userMsg]);
142
  setInput("");
143
  setLoading(true);
 
150
  city: "Libreville",
151
  thinking_mode: true
152
  }, {
153
+ timeout: 120000
154
  });
155
 
156
  const aiResponse = response.data.response || "Réponse reçue du serveur.";
 
165
  timestamp: new Date().toISOString()
166
  }]);
167
 
 
168
  fetchStatus();
169
  } catch (error) {
170
  console.error("Erreur lors de l'appel au backend:", error);
171
  let errorMsg = "Erreur : impossible de contacter le serveur IA.";
172
+
173
  if (error.code === 'ERR_NETWORK') {
174
+ errorMsg = "⚠️ Serveur injoignable. Vérifiez que votre backend est lancé.";
175
  } else if (error.code === 'ECONNABORTED') {
176
+ errorMsg = "⏱️ Timeout : la requête a pris trop de temps.";
177
  } else if (error.response?.status === 400) {
178
  errorMsg = `❌ Erreur de requête : ${error.response.data.detail || 'Format invalide'}`;
179
  } else if (error.response?.status === 500) {
 
193
  }
194
  };
195
 
196
+ // Upload de fichiers PDF
197
  const handleFileUpload = async (e) => {
198
  const files = Array.from(e.target.files);
199
  if (!files.length) return;
 
207
  try {
208
  const res = await axios.post(`${API_BASE}/upload`, formData, {
209
  headers: { 'Content-Type': 'multipart/form-data' },
210
+ timeout: 180000,
211
  onUploadProgress: (progressEvent) => {
212
  const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
213
  setUploadProgress(prev => ({ ...prev, percent: percentCompleted }));
 
218
  const filesProcessed = res.data.files_processed || 0;
219
  const totalChunks = res.data.total_doc_chunks || 0;
220
 
 
221
  setStatus(prev => ({ ...prev, doc_chunks: totalChunks }));
222
 
223
  setMessages(prev => [...prev, {
 
227
  timestamp: new Date().toISOString()
228
  }]);
229
 
 
230
  fetchStatus();
231
  } catch (err) {
232
  console.error("Erreur upload:", err);
233
  let errorMsg = "❌ Échec de l'import des documents.";
 
234
  if (err.code === 'ECONNABORTED') {
235
  errorMsg += " Timeout : les fichiers sont peut-être trop volumineux.";
236
  } else if (err.response?.data?.detail) {
 
250
  }
251
  };
252
 
253
+ // Réinitialisation complète (chat + mémoire)
254
  const handleReset = async () => {
255
+ if (!window.confirm("Voulez-vous réinitialiser la conversation ET effacer la mémoire du modèle ?")) return;
 
 
256
 
257
  try {
 
258
  await axios.post(`${API_BASE}/clear-memory`, {}, { timeout: 5000 });
259
  setMessages([]);
260
  fetchStatus();
261
+
262
  setMessages([{
263
  role: "assistant",
264
  content: "✅ Conversation et mémoire réinitialisées avec succès.",
 
270
  setMessages([{
271
  role: "assistant",
272
  content: "⚠️ Chat réinitialisé, mais impossible de contacter le serveur pour effacer la mémoire.",
273
+ error: true,
274
+ timestamp: new Date().toISOString()
275
  }]);
276
  }
277
  };
278
 
 
279
  const toggleThinking = (msgIndex) => {
280
  setShowThinking(prev => ({ ...prev, [msgIndex]: !prev[msgIndex] }));
281
  };
282
 
 
283
  const formatTimeAgo = (timestamp) => {
284
  if (!timestamp) return "";
285
  const seconds = Math.floor((new Date() - new Date(timestamp)) / 1000);
 
304
  inputField: { flex: 1, background: 'transparent', border: 'none', color: 'white', padding: '0.8rem', outline: 'none', fontSize: '1rem' },
305
  sendBtn: { backgroundColor: '#10b981', color: 'white', border: 'none', borderRadius: '1rem', width: '45px', height: '45px', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', transition: 'all 0.2s' },
306
  toolBadge: { display: 'flex', alignItems: 'center', gap: '6px', fontSize: '11px', backgroundColor: '#020617', padding: '6px 12px', borderRadius: '10px', border: '1px solid #1e293b', color: '#94a3b8' },
307
+ statCard: { backgroundColor: 'rgba(2, 6, 23, 0.5)', borderRadius: '1rem', padding: '1rem', border: '1px solid #1e293b', marginBottom: '0.8rem' },
308
+ googleBtn: {
309
+ width: '100%',
310
+ padding: '12px 16px',
311
+ backgroundColor: '#0f172a',
312
+ border: '1px solid #334155',
313
+ borderRadius: '12px',
314
+ color: '#f1f5f9',
315
+ display: 'flex',
316
+ alignItems: 'center',
317
+ justifyContent: 'center',
318
+ gap: '10px',
319
+ cursor: 'pointer',
320
+ fontWeight: '600',
321
+ fontSize: '14px',
322
+ transition: 'all 0.2s',
323
+ marginBottom: '1rem'
324
+ },
325
+ userProfile: {
326
+ display: 'flex',
327
+ alignItems: 'center',
328
+ gap: '12px',
329
+ padding: '12px 16px',
330
+ backgroundColor: 'rgba(2, 6, 23, 0.5)',
331
+ borderRadius: '12px',
332
+ border: '1px solid #334155',
333
+ marginBottom: '1rem'
334
+ }
335
  };
336
 
337
  return (
 
353
  </div>
354
 
355
  <div style={{ padding: '2rem', flex: 1, display: 'flex', flexDirection: 'column', gap: '2rem' }}>
356
+ {/* Section Connexion */}
357
+ {authLoading ? (
358
+ <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '80px' }}>
359
+ <Loader2 className="animate-spin" color="#10b981" size={24} />
360
+ </div>
361
+ ) : user ? (
362
+ <div style={styles.userProfile}>
363
+ <div style={{ position: 'relative' }}>
364
+ <img
365
+ src={user.photoURL}
366
+ alt={user.displayName || "Utilisateur"}
367
+ style={{
368
+ width: '50px',
369
+ height: '50px',
370
+ borderRadius: '50%',
371
+ border: '2px solid #10b981'
372
+ }}
373
+ onError={(e) => {
374
+ e.target.src = `https://ui-avatars.com/api/?name=${encodeURIComponent(user.displayName || "User")}&background=059669&color=fff`;
375
+ }}
376
+ />
377
+ <div style={{
378
+ position: 'absolute',
379
+ bottom: 0,
380
+ right: 0,
381
+ width: '12px',
382
+ height: '12px',
383
+ backgroundColor: '#10b981',
384
+ borderRadius: '50%',
385
+ border: '2px solid #0f172a'
386
+ }} />
387
+ </div>
388
+ <div style={{ flex: 1 }}>
389
+ <div style={{ fontWeight: '600', fontSize: '15px', color: '#f1f5f9' }}>
390
+ {user.displayName || "Utilisateur"}
391
+ </div>
392
+ <div style={{ fontSize: '12px', color: '#64748b', marginTop: '4px' }}>
393
+ {user.email}
394
+ </div>
395
+ </div>
396
+ <button
397
+ onClick={handleLogout}
398
+ style={{
399
+ backgroundColor: 'transparent',
400
+ border: '1px solid #334155',
401
+ borderRadius: '8px',
402
+ width: '36px',
403
+ height: '36px',
404
+ display: 'flex',
405
+ alignItems: 'center',
406
+ justifyContent: 'center',
407
+ cursor: 'pointer',
408
+ color: '#94a3b8',
409
+ transition: 'all 0.2s'
410
+ }}
411
+ onMouseEnter={(e) => {
412
+ e.target.style.borderColor = '#ef4444';
413
+ e.target.style.color = '#ef4444';
414
+ }}
415
+ onMouseLeave={(e) => {
416
+ e.target.style.borderColor = '#334155';
417
+ e.target.style.color = '#94a3b8';
418
+ }}
419
+ >
420
+ <LogOut size={18} />
421
+ </button>
422
+ </div>
423
+ ) : (
424
+ <button
425
+ onClick={handleGoogleLogin}
426
+ style={styles.googleBtn}
427
+ onMouseEnter={(e) => {
428
+ e.target.style.backgroundColor = '#1e293b';
429
+ e.target.style.borderColor = '#475569';
430
+ }}
431
+ onMouseLeave={(e) => {
432
+ e.target.style.backgroundColor = '#0f172a';
433
+ e.target.style.borderColor = '#334155';
434
+ }}
435
+ >
436
+ <svg width="20" height="20" viewBox="0 0 24 24">
437
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
438
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
439
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
440
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
441
+ </svg>
442
+ Connexion Google
443
+ </button>
444
+ )}
445
+
446
+ {/* Upload */}
447
  <div>
448
  <h2 style={{ fontSize: '11px', color: '#475569', textTransform: 'uppercase', letterSpacing: '1.5px', marginBottom: '1rem', fontWeight: '800' }}>
449
  📚 Documents
 
489
  </label>
490
  </div>
491
 
492
+ {/* Statistiques */}
493
  <div>
494
  <h3 style={{ fontSize: '11px', color: '#475569', textTransform: 'uppercase', marginBottom: '1rem', fontWeight: '800', letterSpacing: '1.5px' }}>
495
  📊 Statistiques
496
  </h3>
497
+
 
498
  <div style={styles.statCard}>
499
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
500
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
 
509
  </div>
510
  </div>
511
 
 
512
  <div style={styles.statCard}>
513
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
514
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
 
523
  </div>
524
  </div>
525
 
 
526
  {status.current_subject && (
527
  <div style={styles.statCard}>
528
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
 
539
  </div>
540
  )}
541
 
 
542
  <div style={styles.statCard}>
543
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
544
  <span style={{ color: '#64748b', fontSize: '12px' }}>Position</span>
 
548
  </div>
549
  </div>
550
 
 
551
  <div style={styles.statCard}>
552
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
553
  <span style={{ color: '#64748b', fontSize: '12px', display: 'flex', alignItems: 'center', gap: '6px' }}>
 
617
  <p style={{ color: '#64748b', maxWidth: '450px', lineHeight: '1.7', fontSize: '1.1rem' }}>
618
  Assistant IA expert du Gabon avec mémoire contextuelle et analyse documentaire avancée.
619
  </p>
620
+ {!user && (
621
+ <div style={{ marginTop: '2rem' }}>
622
+ <button
623
+ onClick={handleGoogleLogin}
624
+ style={{
625
+ padding: '12px 24px',
626
+ backgroundColor: '#0f172a',
627
+ border: '1px solid #334155',
628
+ borderRadius: '12px',
629
+ color: '#f1f5f9',
630
+ display: 'flex',
631
+ alignItems: 'center',
632
+ gap: '10px',
633
+ cursor: 'pointer',
634
+ fontWeight: '600',
635
+ fontSize: '14px',
636
+ transition: 'all 0.2s'
637
+ }}
638
+ onMouseEnter={(e) => {
639
+ e.target.style.backgroundColor = '#1e293b';
640
+ e.target.style.borderColor = '#475569';
641
+ }}
642
+ onMouseLeave={(e) => {
643
+ e.target.style.backgroundColor = '#0f172a';
644
+ e.target.style.borderColor = '#334155';
645
+ }}
646
+ >
647
+ <svg width="20" height="20" viewBox="0 0 24 24">
648
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
649
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
650
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
651
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
652
+ </svg>
653
+ Connectez-vous pour commencer
654
+ </button>
655
+ </div>
656
+ )}
657
  <div style={{ display: 'flex', gap: '1rem', marginTop: '2rem' }}>
658
  <div style={{ textAlign: 'center' }}>
659
  <div style={{ fontSize: '2rem', fontWeight: 'bold', color: '#10b981' }}>{status.doc_chunks}</div>
 
679
  justifyContent: 'center',
680
  backgroundColor: m.role === 'user' ? '#059669' : m.error ? '#7f1d1d' : m.success ? '#064e3b' : '#1e293b',
681
  flexShrink: 0,
682
+ border: '1px solid #334155',
683
+ overflow: 'hidden'
684
  }}>
685
  {m.role === 'user' ? (
686
+ m.userPhoto ? (
687
+ <img
688
+ src={m.userPhoto}
689
+ alt={m.userName}
690
+ style={{
691
+ width: '100%',
692
+ height: '100%',
693
+ objectFit: 'cover'
694
+ }}
695
+ onError={(e) => {
696
+ e.target.style.display = 'none';
697
+ e.target.parentElement.innerHTML = `<div style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#059669;"><User size={24} color="white" /></div>`;
698
+ }}
699
+ />
700
+ ) : (
701
+ <User size={24} color="white" />
702
+ )
703
  ) : m.error ? (
704
  <AlertCircle size={24} color="#ef4444" />
705
  ) : m.success ? (
 
710
  </div>
711
 
712
  <div style={{ display: 'flex', flexDirection: 'column', gap: '0.8rem', width: '100%' }}>
 
713
  {m.role === 'assistant' && !m.error && !m.success && m.context_info && (
714
  <div style={{ backgroundColor: 'rgba(30, 41, 59, 0.3)', borderRadius: '12px', padding: '10px 14px', border: '1px solid #1e293b' }}>
715
  <button
 
721
  </span>
722
  {showThinking[i] ? <ChevronUp size={14} /> : <ChevronDown size={14} />}
723
  </button>
724
+
725
  {showThinking[i] && (
726
  <>
727
  <div style={{ display: 'flex', gap: '8px', marginTop: '12px', flexWrap: 'wrap' }}>
 
742
  </div>
743
  </div>
744
 
 
745
  <div style={{ marginTop: '12px', fontSize: '11px', color: '#64748b', padding: '10px', backgroundColor: '#020617', borderRadius: '8px' }}>
746
  {m.context_info.subject_keywords?.length > 0 && (
747
  <div style={{ marginBottom: '8px' }}>
 
764
  </div>
765
  )}
766
 
 
767
  <div style={{
768
  ...(m.role === 'user' ? styles.userBubble : m.error ? styles.errorBubble : m.success ? styles.successBubble : styles.aiBubble),
769
  position: 'relative'
 
778
  )}
779
  </div>
780
 
 
781
  {m.images && m.images.length > 0 && (
782
  <div style={{ display: 'flex', gap: '12px', marginTop: '8px', overflowX: 'auto', paddingBottom: '10px' }}>
783
  {m.images.map((img, idx) => (
784
  <div key={idx} style={{ flexShrink: 0, position: 'relative', borderRadius: '1.2rem', overflow: 'hidden', border: '2px solid #334155', backgroundColor: '#0f172a' }}>
785
+ <img
786
+ src={img}
787
+ alt={`Image ${idx + 1}`}
788
  style={{ height: '180px', width: '280px', objectFit: 'cover' }}
789
  onError={(e) => {
790
  e.target.style.display = 'none';
 
833
  <Search size={22} color="#475569" style={{ marginRight: '10px' }} />
834
  <input
835
  style={styles.inputField}
836
+ placeholder={user ? "Posez votre question sur le Gabon, vos documents ou l'actualité..." : "Connectez-vous pour poser des questions..."}
837
  value={input}
838
  onChange={(e) => setInput(e.target.value)}
839
  onKeyDown={(e) => {
840
+ if (e.key === 'Enter' && !e.shiftKey && user) {
841
  e.preventDefault();
842
  handleSend();
843
  }
844
  }}
845
+ disabled={loading || !user}
846
  />
847
  <button
848
+ style={{
849
+ ...styles.sendBtn,
850
+ opacity: (input.trim() && !loading && user) ? 1 : 0.4,
851
+ cursor: (input.trim() && !loading && user) ? 'pointer' : 'not-allowed',
852
+ transform: (input.trim() && !loading && user) ? 'scale(1)' : 'scale(0.95)'
853
  }}
854
  onClick={handleSend}
855
+ disabled={loading || !input.trim() || !user}
856
  onMouseEnter={(e) => {
857
+ if (input.trim() && !loading && user) {
858
  e.target.style.backgroundColor = '#059669';
859
  e.target.style.transform = 'scale(1.05)';
860
  }
{kibali-ui/src → src}/assets/react.svg RENAMED
File without changes
{kibali-ui/src → src}/firebase.js RENAMED
@@ -1,37 +1,37 @@
1
- // src/firebase.js
2
- import { initializeApp } from "firebase/app";
3
- import { getAuth, GoogleAuthProvider } from "firebase/auth";
4
-
5
- // Vérifie que les variables sont bien chargées (très utile pour debug)
6
- const apiKey = import.meta.env.VITE_FIREBASE_API_KEY;
7
- const authDomain = import.meta.env.VITE_FIREBASE_AUTH_DOMAIN;
8
- const projectId = import.meta.env.VITE_FIREBASE_PROJECT_ID;
9
- const storageBucket = import.meta.env.VITE_FIREBASE_STORAGE_BUCKET;
10
- const messagingSenderId = import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID;
11
- const appId = import.meta.env.VITE_FIREBASE_APP_ID;
12
-
13
- // Debug temporaire (à supprimer plus tard)
14
- console.log("Firebase Config chargée :", {
15
- apiKey: apiKey ? "OK (cachée)" : "MANQUANTE !",
16
- authDomain,
17
- projectId,
18
- appId
19
- });
20
-
21
- if (!apiKey || !authDomain || !projectId || !appId) {
22
- throw new Error("Variables Firebase manquantes dans .env ! Vérifie ton fichier .env à la racine.");
23
- }
24
-
25
- const firebaseConfig = {
26
- apiKey,
27
- authDomain,
28
- projectId,
29
- storageBucket,
30
- messagingSenderId,
31
- appId,
32
- };
33
-
34
- // Initialiser Firebase
35
- const app = initializeApp(firebaseConfig);
36
- export const auth = getAuth(app);
37
  export const googleProvider = new GoogleAuthProvider();
 
1
+ // src/firebase.js
2
+ import { initializeApp } from "firebase/app";
3
+ import { getAuth, GoogleAuthProvider } from "firebase/auth";
4
+
5
+ // Vérifie que les variables sont bien chargées (très utile pour debug)
6
+ const apiKey = import.meta.env.VITE_FIREBASE_API_KEY;
7
+ const authDomain = import.meta.env.VITE_FIREBASE_AUTH_DOMAIN;
8
+ const projectId = import.meta.env.VITE_FIREBASE_PROJECT_ID;
9
+ const storageBucket = import.meta.env.VITE_FIREBASE_STORAGE_BUCKET;
10
+ const messagingSenderId = import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID;
11
+ const appId = import.meta.env.VITE_FIREBASE_APP_ID;
12
+
13
+ // Debug temporaire (à supprimer plus tard)
14
+ console.log("Firebase Config chargée :", {
15
+ apiKey: apiKey ? "OK (cachée)" : "MANQUANTE !",
16
+ authDomain,
17
+ projectId,
18
+ appId
19
+ });
20
+
21
+ if (!apiKey || !authDomain || !projectId || !appId) {
22
+ throw new Error("Variables Firebase manquantes dans .env ! Vérifie ton fichier .env à la racine.");
23
+ }
24
+
25
+ const firebaseConfig = {
26
+ apiKey,
27
+ authDomain,
28
+ projectId,
29
+ storageBucket,
30
+ messagingSenderId,
31
+ appId,
32
+ };
33
+
34
+ // Initialiser Firebase
35
+ const app = initializeApp(firebaseConfig);
36
+ export const auth = getAuth(app);
37
  export const googleProvider = new GoogleAuthProvider();
{kibali-ui/src → src}/index.css RENAMED
File without changes
{kibali-ui/src → src}/main.jsx RENAMED
File without changes
kibali-ui/tailwind.config.js → tailwind.config.js RENAMED
@@ -1,18 +1,18 @@
1
- export default {
2
- content: [
3
- "./index.html",
4
- "./src/**/*.{js,ts,jsx,tsx}",
5
- ],
6
- theme: {
7
- extend: {
8
- colors: {
9
- kibali: {
10
- dark: "#0f172a",
11
- card: "#1e293b",
12
- green: "#22c55e"
13
- }
14
- }
15
- },
16
- },
17
- plugins: [],
18
  }
 
1
+ export default {
2
+ content: [
3
+ "./index.html",
4
+ "./src/**/*.{js,ts,jsx,tsx}",
5
+ ],
6
+ theme: {
7
+ extend: {
8
+ colors: {
9
+ kibali: {
10
+ dark: "#0f172a",
11
+ card: "#1e293b",
12
+ green: "#22c55e"
13
+ }
14
+ }
15
+ },
16
+ },
17
+ plugins: [],
18
  }
tools/web.py CHANGED
@@ -1,5 +1,5 @@
1
  from tavily import TavilyClient
2
- from duckduckgo_search import DDGS
3
  import os
4
  from dotenv import load_dotenv
5
 
 
1
  from tavily import TavilyClient
2
+ from ddgs import DDGS
3
  import os
4
  from dotenv import load_dotenv
5
 
kibali-ui/vite.config.js → vite.config.js RENAMED
File without changes