overmind-mcp 2.8.3 → 2.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.mcp.json.example +20 -20
  2. package/README.md +143 -143
  3. package/bin/overmind-pool.mjs +248 -248
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/lib/config.d.ts +1 -0
  6. package/dist/lib/config.d.ts.map +1 -1
  7. package/dist/lib/config.js +2 -1
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
  10. package/dist/lib/orchestration/dispatcher.js +0 -1
  11. package/dist/lib/orchestration/dispatcher.js.map +1 -1
  12. package/dist/services/AntigravityRunner.d.ts +42 -0
  13. package/dist/services/AntigravityRunner.d.ts.map +1 -0
  14. package/dist/services/AntigravityRunner.js +404 -0
  15. package/dist/services/AntigravityRunner.js.map +1 -0
  16. package/dist/services/ClaudeRunner.d.ts.map +1 -1
  17. package/dist/services/ClaudeRunner.js.map +1 -1
  18. package/dist/services/GeminiRunner.d.ts +22 -0
  19. package/dist/services/GeminiRunner.d.ts.map +1 -1
  20. package/dist/services/GeminiRunner.js +115 -91
  21. package/dist/services/GeminiRunner.js.map +1 -1
  22. package/dist/services/KiloRunner.d.ts.map +1 -1
  23. package/dist/services/KiloRunner.js +6 -1
  24. package/dist/services/KiloRunner.js.map +1 -1
  25. package/dist/services/NousHermesRunner.d.ts +1 -0
  26. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  27. package/dist/services/NousHermesRunner.js +366 -555
  28. package/dist/services/NousHermesRunner.js.map +1 -1
  29. package/dist/tools/config_example.d.ts +1 -0
  30. package/dist/tools/config_example.d.ts.map +1 -1
  31. package/dist/tools/config_example.js +45 -2
  32. package/dist/tools/config_example.js.map +1 -1
  33. package/dist/tools/manage_agents.d.ts +1 -1
  34. package/dist/tools/run_agent.d.ts +1 -0
  35. package/dist/tools/run_agent.d.ts.map +1 -1
  36. package/dist/tools/run_agent.js +27 -3
  37. package/dist/tools/run_agent.js.map +1 -1
  38. package/dist/tools/run_agents_parallel.d.ts +1 -0
  39. package/dist/tools/run_agents_parallel.d.ts.map +1 -1
  40. package/dist/tools/run_gemini.d.ts +13 -0
  41. package/dist/tools/run_gemini.d.ts.map +1 -1
  42. package/dist/tools/run_gemini.js +6 -2
  43. package/dist/tools/run_gemini.js.map +1 -1
  44. package/docs/agent-http-tutorial.md +524 -524
  45. package/docs/provider-config-map.md +379 -0
  46. package/package.json +1 -1
@@ -0,0 +1,379 @@
1
+ # Hermes x Overmind — Config Provider Map
2
+
3
+ ## Ordre de resolution (qui gagne, qui perd)
4
+
5
+ Chaque variable suit cette priorite (la premiere gagne):
6
+
7
+ ```
8
+ HERMES_HOME/.env (C:\Users\Deamon\AppData\Local\hermes\.env)
9
+
10
+ settings_[agent].json → env (apres interpolation $VAR par process.env)
11
+
12
+ Workflow/.env (C:\Users\Deamon\Desktop\Backup\Serveur MCP\Workflow\.env)
13
+
14
+ process.env (env du parent, heredite par le spawn)
15
+ ```
16
+
17
+ **MAIS** pour `OPENROUTER_API_KEY` uniquement:
18
+ - Hermes lit d'abord `HERMES_HOME/.env` puis `os.environ`
19
+ - Si present dans `auth.json` avec status `exhausted` → skip
20
+ - Si present dans `HERMES_HOME/.env` (meme vide `""`) → **PREND LA PRIORITE sur process.env**
21
+
22
+ **MAIS** pour tous les autres providers (zai, minimax-cn, etc.):
23
+ - Hermes lit `HERMES_HOME/.env` → si vide/null → lit `os.environ`
24
+ - `os.environ` contient tout ce que le parent a passe (donc le `.env` du Workflow)
25
+
26
+ ---
27
+
28
+ ## Les 4 fichiers cles
29
+
30
+ | Fichier | Role |
31
+ |---|---|
32
+ | `HERMES_HOME/.env` | API keys globales Hermes |
33
+ | `Workflow/.env` | Variables du workflow (DB, tokens, etc.) |
34
+ | `settings_[agent].json` | Config par agent (model, provider, tokens, MCP) |
35
+ | `HERMES_HOME/.hermes/config.yaml` | Config systeme Hermes (model.default, provider, etc.) |
36
+ | `HERMES_HOME/auth.json` | Credential pool — status des tokens (ok/exhausted) |
37
+
38
+ ---
39
+
40
+ ## Provider → Ce qu'Hermes attend
41
+
42
+ ### Z.AI (id: `zai`)
43
+
44
+ | Param | Valeur attendue | Source dans Hermes |
45
+ |---|---|---|
46
+ | Provider ID | `zai` | config.yaml ou settings |
47
+ | API Key | Une de: `GLM_API_KEY`, `ZAI_API_KEY`, `Z_AI_API_KEY` | `HERMES_HOME/.env` → `os.environ` |
48
+ | Base URL | `https://api.z.ai/api/paas/v4` | hardcoded dans ProviderConfig |
49
+ | Model | `glm-5.1` | settings `env.ANTHROPIC_MODEL` |
50
+
51
+ ```json
52
+ // settings_[agent].json — Z.AI correct
53
+ {
54
+ "env": {
55
+ "ANTHROPIC_AUTH_TOKEN": "$GLM_API_KEY",
56
+ "ANTHROPIC_BASE_URL": "https://api.z.ai/api/paas/v4",
57
+ "ANTHROPIC_MODEL": "glm-5.1"
58
+ }
59
+ }
60
+ ```
61
+
62
+ ```bash
63
+ # .env minimal pour Z.AI
64
+ GLM_API_KEY=ton_token_zai_ici
65
+ ```
66
+
67
+ **auth.json** stocke aussi la cle sous `Z_AI_API_KEY` (label: `GLM_API_KEY`, status: `ok`).
68
+
69
+ ---
70
+
71
+ ### MiniMax CN (id: `minimax-cn`)
72
+
73
+ | Param | Valeur attendue | Source dans Hermes |
74
+ |---|---|---|
75
+ | Provider ID | `minimax-cn` | config.yaml ou settings |
76
+ | API Key | `MINIMAX_CN_API_KEY` **uniquement** | `HERMES_HOME/.env` → `os.environ` |
77
+ | Base URL | `https://api.minimaxi.com/anthropic` | hardcoded dans ProviderConfig |
78
+ | Model | `MiniMax-M2.7` | settings `env.ANTHROPIC_MODEL` |
79
+
80
+ ```json
81
+ // settings_[agent].json — MiniMax correct
82
+ {
83
+ "env": {
84
+ "ANTHROPIC_AUTH_TOKEN": "$MINIMAX_CN_API_KEY",
85
+ "ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
86
+ "ANTHROPIC_MODEL": "MiniMax-M2.7"
87
+ }
88
+ }
89
+ ```
90
+
91
+ ```bash
92
+ # .env minimal pour MiniMax
93
+ MINIMAX_CN_API_KEY=ton_token_minimax_ici
94
+ ```
95
+
96
+ **auth.json** stocke sous `MINIMAX_CN_API_KEY`.
97
+
98
+ ---
99
+
100
+ ### OpenRouter — BANNIR pour LLM
101
+
102
+ | Param | Valeur attendue | Source |
103
+ |---|---|---|
104
+ | Provider ID | — | Ne PAS utiliser |
105
+ | API Key | `OPENROUTER_API_KEY` | `HERMES_HOME/.env` → `os.environ` |
106
+ | Base URL | `https://openrouter.ai/api/v1` | hardcoded |
107
+ | Guardrail | — | Force 404 si active |
108
+
109
+ **PROBLEME:** Si `OPENROUTER_API_KEY` est present (meme dans `OVERMIND_EMBEDDING_KEY` route via NousHermesRunner), Hermes le detecte et tente OpenRouter pour l'inference.
110
+
111
+ **auth.json** a une entree OpenRouter — si le status est `exhausted`, Hermes ne retries plus mais peut quand meme picker le provider "openrouter" dans le credential pool.
112
+
113
+ ---
114
+
115
+ ## Comment Hermes decide quel provider utiliser
116
+
117
+ ```
118
+ 1. Si `provider` explicite dans settings.json → utilise ce provider
119
+ 2. Sinon si `ANTHROPIC_BASE_URL` contient openrouter → "openrouter"
120
+ 3. Sinon lit model name → compare avec model_defaults par provider
121
+ - "glm-*" → "zai"
122
+ - "MiniMax-*" → "minimax-cn"
123
+ 4. Sinon fallback: "minimax-cn" (model.default dans config.yaml)
124
+ ```
125
+
126
+ Le model resolve le provider. Donc `ANTHROPIC_MODEL=glm-5.1` sans provider explicite → `zai`. `ANTHROPIC_MODEL=MiniMax-M2.7` → `minimax-cn`.
127
+
128
+ ---
129
+
130
+ ## Comment NousHermesRunner passe les vars a Hermes
131
+
132
+ Le runner lit `settings_[agent].json` → applique `interpolateEnvVars()` qui remplace `$VAR` par `process.env[VAR]` → envoie le tout dans `agentCustomEnv` au processus Hermes.
133
+
134
+ ```typescript
135
+ // Ce que NousHermesRunner.ts passe a Hermes (ligne 261-269)
136
+ const agentCustomEnv = {
137
+ ...process.env, // HERMES_HOME/.env + Workflow/.env fusionnes
138
+ PYTHONIOENCODING: 'utf-8', // ...
139
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '', // VIDE maintenant (fixe)
140
+ NVIDIA_API_KEY: process.env.NVIDIA_API_KEY || process.env.NVAPI_KEY,
141
+ ANTHROPIC_AUTH_TOKEN: s.env.ANTHROPIC_AUTH_TOKEN, // deja interpolate
142
+ ANTHROPIC_BASE_URL: s.env.ANTHROPIC_BASE_URL, // deja interpolate
143
+ ANTHROPIC_MODEL: s.env.ANTHROPIC_MODEL, // deja interpolate
144
+ };
145
+ ```
146
+
147
+ Puis lance Hermes avec `--env-file` pour discord_llm + Workflow `.env` (via startpipeline.js).
148
+
149
+ ---
150
+
151
+ ## Le probleme de OPENROUTER_API_KEY
152
+
153
+ **AVANT le fix:**
154
+ ```typescript
155
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || process.env.OVERMIND_EMBEDDING_KEY,
156
+ ```
157
+ → Si `OPENROUTER_API_KEY` vide mais `OVERMIND_EMBEDDING_KEY` present → passe quand meme une cle OpenRouter a Hermes → Hermes detecte `OPENROUTER_API_KEY` dans credential pool → tente OpenRouter → 404 guardrail.
158
+
159
+ **APRES le fix:**
160
+ ```typescript
161
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
162
+ ```
163
+ → `OVERMIND_EMBEDDING_KEY` n'est plus redirige. Si `OPENROUTER_API_KEY` absent du `.env`, Hermes recoit string vide et ne pick pas OpenRouter.
164
+
165
+ ---
166
+
167
+ ## Comment Hermes obtient la API Key (le vrai flux)
168
+
169
+ Le `ANTHROPIC_AUTH_TOKEN` dans `settings.json` **ne passe pas directement** dans le body de la requete API. Hermes utilise son propre credential pool:
170
+
171
+ ```
172
+ settings_[agent].json
173
+ "env": {
174
+ "ANTHROPIC_AUTH_TOKEN": "$GLM_API_KEY", ← Runner remplace $GLM_API_KEY → "token_reel"
175
+ "ANTHROPIC_BASE_URL": "https://api.z.ai/api/paas/v4",
176
+ "ANTHROPIC_MODEL": "glm-5.1"
177
+ }
178
+ ↓ (interpolateEnvVars par NousHermesRunner)
179
+ agentCustomEnv envoye a Hermes:
180
+ ANTHROPIC_AUTH_TOKEN=token_reel
181
+ ANTHROPIC_BASE_URL=https://api.z.ai/api/paas/v4
182
+ ANTHROPIC_MODEL=glm-5.1
183
+
184
+ MAIS Hermes ne lit PAS ANTHROPIC_AUTH_TOKEN directement.
185
+ Hermes lit le CREDENTIAL POOL (auth.json) + les .env vars listees dans api_key_env_vars.
186
+
187
+ Credential pool est seed par:
188
+ GLM_API_KEY, ZAI_API_KEY, Z_AI_API_KEY → "zai"
189
+ MINIMAX_CN_API_KEY → "minimax-cn"
190
+
191
+ Le ANTHROPIC_AUTH_TOKEN dans settings.json sert a RIEN pour le credential pool.
192
+ Il est juste envoye dans agentCustomEnv mais Hermes l'ignore.
193
+ ```
194
+
195
+ Le `$GLM_API_KEY` dans `ANTHROPIC_AUTH_TOKEN` est juste une convenience pour que le token traverse le runner et arrive dans `process.env` du subprocess Hermes. C'est `process.env.GLM_API_KEY` qui seed le credential pool.
196
+
197
+ ---
198
+
199
+ ## Le flow complet (Z.AI par exemple)
200
+
201
+ 1. `Workflow/.env` contient `GLM_API_KEY=<VOTRE_TOKEN_ZAI>`
202
+ 2. `startpipeline.js` charge `.env` → `process.env.GLM_API_KEY`
203
+ 3. ` NousHermesRunner` lit `settings_zai.json` → `interpolateEnvVars()`
204
+ - `$GLM_API_KEY` → `process.env["GLM_API_KEY"]` → `"<TOKEN>"`
205
+ - `ANTHROPIC_AUTH_TOKEN="<TOKEN>"` (valeur concrete maintenant)
206
+ 4. `agentCustomEnv` envoye a Hermes:
207
+ - `ANTHROPIC_AUTH_TOKEN=<TOKEN>`
208
+ - `ANTHROPIC_BASE_URL=https://api.z.ai/api/paas/v4`
209
+ - `ANTHROPIC_MODEL=glm-5.1`
210
+ 5. Hermes fait son propre lookup:
211
+ - `load_pool("zai")` → `_resolve_api_key_provider_secret("zai")`
212
+ - Cherche `GLM_API_KEY` via `_get_env_prefer_dotenv()` dans `HERMES_HOME/.env` puis `os.environ`
213
+ - Trouve `GLM_API_KEY=<TOKEN>` dans `os.environ` (herite du parent)
214
+ - Stocke dans `auth.json` avec status `ok`
215
+ 6. API call → utilise le credential pool entry pour `zai`
216
+
217
+ **Meme valeur, deux lectures differentes** — les deux convergent parce que le token est identique dans `HERMES_HOME/.env` et dans `process.env` (qui herite du `.env` charge). Si `GLM_API_KEY` est absent du `.env` mais present dans `HERMES_HOME/.env` → ca marche aussi (HERMES_HOME/.env est lu en priorite par `_get_env_prefer_dotenv`).
218
+
219
+ ---
220
+
221
+ ## OPENROUTER et Les Embeddings
222
+
223
+ **`OVERMIND_EMBEDDING_KEY`** = clef OpenRouter pour les **embeddings uniquement** (PostgresMemoryProvider du Workflow). Elle est dans le `.env` Overmind par defaut. Hermes n'a pas besoin de la voir pour l'LLM inference.
224
+
225
+ **NousHermesRunner ne doit jamais forwarder de clef OpenRouter a Hermes.** OpenRouter n'est pas un provider LLM dans ce setup. Si `OPENROUTER_API_KEY` arrive jusqu'a Hermes, il detecte la clef et tente OpenRouter pour l'inference → 404 guardrail.
226
+
227
+ **Fix applique:**
228
+ ```typescript
229
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
230
+ ```
231
+ On envoit un string vide si absent, pour etre explicite: "OpenRouter nest pas configure pour LLM ici."
232
+
233
+ ---
234
+
235
+ ## Checklist pour ajouter un nouveau provider
236
+
237
+ 1. **Verifier le ProviderConfig** dans `hermes-agent/hermes_cli/auth.py`
238
+ - Verifier `api_key_env_vars` (les vars que Hermes cherche)
239
+ - Verifier `inference_base_url` (URL par defaut)
240
+ - Verifier `base_url_env_var` (optionnel, surcharge URL)
241
+
242
+ 2. **Ajouter dans Workflow/.env**
243
+ ```bash
244
+ MAISON_API_KEY=cle_api_du_fournisseur
245
+ ```
246
+
247
+ 3. **Ajouter dans settings_[agent].json**
248
+ ```json
249
+ {
250
+ "env": {
251
+ "ANTHROPIC_AUTH_TOKEN": "$MAISON_API_KEY",
252
+ "ANTHROPIC_BASE_URL": "https://api.fournisseur.com/v1",
253
+ "ANTHROPIC_MODEL": "model-name"
254
+ }
255
+ }
256
+ ```
257
+
258
+ 4. **Verifier auth.json** — apres premiere utilisation, Hermes stocke le token avec status.
259
+ - Si `exhausted` → Hermes skip ce provider automatiquement
260
+ - Si `ok` → utilise le token
261
+
262
+ 5. **NE JAMAIS** faire de mapping `AUTRE_CHOSE_API_KEY → OPENROUTER_API_KEY` — ca force OpenRouter.
263
+
264
+ 6. **Pour eviter OpenRouter:** pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env`
265
+
266
+ ---
267
+
268
+ ## Resume
269
+
270
+ || Tu veux... | Utilise ces vars |
271
+ |---|---|
272
+ | Z.AI (glm-5.1) | `GLM_API_KEY` dans `.env` + settings `$GLM_API_KEY` |
273
+ | MiniMax CN | `MINIMAX_CN_API_KEY` dans `.env` + settings `$MINIMAX_CN_API_KEY` |
274
+ | Embeddings OpenRouter | `OVERMIND_EMBEDDING_KEY` (pour embeddings, PAS LLM) |
275
+ | Eviter OpenRouter LLM | Pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env` |
276
+
277
+ ---
278
+
279
+ ## Gemini / Antigravity (id: `gemini`)
280
+
281
+ **Ancien `gemini-cli` (npm `@google/gemini-cli`) est remplacé.**
282
+
283
+ Le runner `gemini` dans Overmind utilise maintenant **Antigravity CLI**, bundlé dans **Antigravity IDE**. Le fichier `GeminiRunner.ts` a été refactorisé pour utiliser le CLI d'Antigravity au lieu du package npm `gemini-cli`.
284
+
285
+ ### Ce qui a changé
286
+
287
+ | Avant | Après |
288
+ |---|---|
289
+ | `GeminiRunner` → spawn `node .../@google/gemini-cli/bundle/gemini.js` | `GeminiRunner` → spawn `Antigravity IDE.exe` avec `--mode`, `--prompt-file`, etc. |
290
+ | Auth via sync `.gemini/` OAuth | Auth via OAuth interne Antigravity (pas de sync) |
291
+ | Config `.overmind/gemini/` | Config `.antigravity/<agent>/` local |
292
+ | Modes limitées | Modes: GENERAL, CONTEXT_CHECK, PLAN, COMMAND, CASCADE, EVAL, ANTIGRAVITY_REVIEW, MQUERY, COMMIT_MESSAGE, CHECKPOINT, FAST_APPLY |
293
+
294
+ ### Installation
295
+
296
+ Antigravity IDE est déjà installé sur cette machine:
297
+
298
+ ```bash
299
+ C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\Antigravity IDE.exe
300
+ ```
301
+
302
+ Le runner vérifie sa présence et retourne `ANTIGRAVITY_NOT_INSTALLED` si absent.
303
+
304
+ ### Chemins clés
305
+
306
+ | Ressource | Path |
307
+ |---|---|
308
+ | CLI Executable | `C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\Antigravity IDE.exe` |
309
+ | Resources App | `C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\resources\app` |
310
+ | Language Server | `C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\resources\app\bin\language_server_windows_x64.exe` |
311
+ | CLI Node | `C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\resources\app\out\cli.js` |
312
+
313
+ ### Utilisation Overmind (run_agent)
314
+
315
+ Le runner `gemini` est utilisé via `run_agent.ts` — même nom, nouvelle implémentation:
316
+
317
+ ```typescript
318
+ // run_agent avec runner: 'gemini'
319
+ const result = await runAgent({
320
+ runner: 'gemini', // ← GeminiRunner qui utilise Antigravity CLI en interne
321
+ prompt: 'Analyse ce code',
322
+ agentName: 'expert_python',
323
+ mode: 'GENERAL', // GENERAL, PLAN, COMMAND, CASCADE, EVAL, etc.
324
+ autoResume: false,
325
+ configPath: './Workflow',
326
+ });
327
+
328
+ // ou directement via run_gemini.ts
329
+ const result = await runGeminiAgent({
330
+ prompt: '...',
331
+ mode: 'PLAN',
332
+ });
333
+ ```
334
+
335
+ ### Modes Antigravity (paramètre `mode`)
336
+
337
+ | Mode | Usage |
338
+ |---|---|
339
+ | `GENERAL` | Mode par défaut, tâches polyvalentes |
340
+ | `CONTEXT_CHECK` | Vérification de contexte code |
341
+ | `PLAN` | Planification de tâches complexes |
342
+ | `COMMAND` | Exécution de commandes shell |
343
+ | `CASCADE` | Exécution en cascade multi-agents |
344
+ | `EVAL` | Évaluation et revue de code |
345
+ | `ANTIGRAVITY_REVIEW` | Revue automatique Antigravity |
346
+ | `MQUERY` | Recherche multi-source |
347
+ | `COMMIT_MESSAGE` | Génération de messages de commit |
348
+ | `CHECKPOINT` | Sauvegarde de checkpoint |
349
+ | `FAST_APPLY` | Application rapide de patches |
350
+
351
+ ### Configuration agent
352
+
353
+ Chaque agent peut avoir sa config dans `.antigravity/agent_<nom>/`:
354
+ - `mcp.json` — serveurs MCP actifs
355
+ - Session store — sessions Gemini persistées
356
+
357
+ ### Différences avec l'ancien gemini-cli (npm)
358
+
359
+ ```json
360
+ // settings_<agent>.json — Antigravity
361
+ {
362
+ "env": {
363
+ "ANTIGRAVITY_MODE": "GENERAL",
364
+ "ANTIGRAVITY_DIR": ".antigravity/agent_<name>"
365
+ }
366
+ }
367
+ ```
368
+
369
+ ### Vérification installation
370
+
371
+ ```typescript
372
+ import { isAntigravityInstalled } from './services/AntigravityRunner.js';
373
+
374
+ if (isAntigravityInstalled()) {
375
+ console.log('Antigravity IDE est installé');
376
+ } else {
377
+ console.log('Antigravity IDE non trouvé');
378
+ }
379
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overmind-mcp",
3
- "version": "2.8.3",
3
+ "version": "2.8.6",
4
4
  "preferGlobal": true,
5
5
  "description": "Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mémoire (Private Memory Context) et le support pour QwenCli et Nous Hermes. Installation automatique des dépendances Docker (PostgreSQL, pgvector) inclus.",
6
6
  "type": "module",