overmind-mcp 2.8.3 → 2.8.7

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 (98) hide show
  1. package/.mcp.json.example +20 -20
  2. package/README.md +143 -143
  3. package/bin/launch.bat +40 -0
  4. package/bin/launch.js +78 -0
  5. package/bin/launch.sh +46 -0
  6. package/bin/overmind-pool.mjs +248 -248
  7. package/bin/restart_mcp.bat +3 -0
  8. package/bin/start_server.bat +3 -0
  9. package/bin/test_mcp.bat +4 -0
  10. package/dist/bin/cli.js +13 -0
  11. package/dist/bin/cli.js.map +1 -1
  12. package/dist/bin/launch.js +78 -0
  13. package/dist/bridge/BridgeProxy.d.ts +52 -0
  14. package/dist/bridge/BridgeProxy.d.ts.map +1 -0
  15. package/dist/bridge/BridgeProxy.js +265 -0
  16. package/dist/bridge/BridgeProxy.js.map +1 -0
  17. package/dist/bridge/OverBridgeService.d.ts +96 -0
  18. package/dist/bridge/OverBridgeService.d.ts.map +1 -0
  19. package/dist/bridge/OverBridgeService.js +334 -0
  20. package/dist/bridge/OverBridgeService.js.map +1 -0
  21. package/dist/bridge/index.d.ts +11 -0
  22. package/dist/bridge/index.d.ts.map +1 -0
  23. package/dist/bridge/index.js +11 -0
  24. package/dist/bridge/index.js.map +1 -0
  25. package/dist/bridge/types.d.ts +132 -0
  26. package/dist/bridge/types.d.ts.map +1 -0
  27. package/dist/bridge/types.js +19 -0
  28. package/dist/bridge/types.js.map +1 -0
  29. package/dist/bridge/utils.d.ts +48 -0
  30. package/dist/bridge/utils.d.ts.map +1 -0
  31. package/dist/bridge/utils.js +128 -0
  32. package/dist/bridge/utils.js.map +1 -0
  33. package/dist/lib/config.d.ts +1 -0
  34. package/dist/lib/config.d.ts.map +1 -1
  35. package/dist/lib/config.js +13 -5
  36. package/dist/lib/config.js.map +1 -1
  37. package/dist/lib/envUtils.d.ts +2 -0
  38. package/dist/lib/envUtils.d.ts.map +1 -1
  39. package/dist/lib/envUtils.js +13 -2
  40. package/dist/lib/envUtils.js.map +1 -1
  41. package/dist/lib/logger.js +1 -1
  42. package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
  43. package/dist/lib/orchestration/dispatcher.js +0 -1
  44. package/dist/lib/orchestration/dispatcher.js.map +1 -1
  45. package/dist/lib/processRegistry.d.ts.map +1 -1
  46. package/dist/lib/processRegistry.js +34 -21
  47. package/dist/lib/processRegistry.js.map +1 -1
  48. package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
  49. package/dist/memory/PostgresMemoryProvider.js +14 -3
  50. package/dist/memory/PostgresMemoryProvider.js.map +1 -1
  51. package/dist/server.d.ts.map +1 -1
  52. package/dist/server.js +2 -1
  53. package/dist/server.js.map +1 -1
  54. package/dist/services/AgentManager.d.ts.map +1 -1
  55. package/dist/services/AgentManager.js +473 -97
  56. package/dist/services/AgentManager.js.map +1 -1
  57. package/dist/services/ClaudeRunner.d.ts.map +1 -1
  58. package/dist/services/ClaudeRunner.js.map +1 -1
  59. package/dist/services/GeminiRunner.d.ts +26 -2
  60. package/dist/services/GeminiRunner.d.ts.map +1 -1
  61. package/dist/services/GeminiRunner.js +146 -136
  62. package/dist/services/GeminiRunner.js.map +1 -1
  63. package/dist/services/KiloRunner.d.ts.map +1 -1
  64. package/dist/services/KiloRunner.js +6 -1
  65. package/dist/services/KiloRunner.js.map +1 -1
  66. package/dist/services/NousHermesRunner.d.ts +1 -0
  67. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  68. package/dist/services/NousHermesRunner.js +476 -549
  69. package/dist/services/NousHermesRunner.js.map +1 -1
  70. package/dist/tools/agent_control.d.ts +1 -1
  71. package/dist/tools/agent_control.d.ts.map +1 -1
  72. package/dist/tools/agent_control.js +4 -3
  73. package/dist/tools/agent_control.js.map +1 -1
  74. package/dist/tools/config_example.d.ts +1 -0
  75. package/dist/tools/config_example.d.ts.map +1 -1
  76. package/dist/tools/config_example.js +45 -2
  77. package/dist/tools/config_example.js.map +1 -1
  78. package/dist/tools/create_agent.d.ts +1 -1
  79. package/dist/tools/manage_agents.d.ts +2 -2
  80. package/dist/tools/run_agent.d.ts +2 -1
  81. package/dist/tools/run_agent.d.ts.map +1 -1
  82. package/dist/tools/run_agent.js +30 -3
  83. package/dist/tools/run_agent.js.map +1 -1
  84. package/dist/tools/run_agents_parallel.d.ts +2 -1
  85. package/dist/tools/run_agents_parallel.d.ts.map +1 -1
  86. package/dist/tools/run_gemini.d.ts +13 -0
  87. package/dist/tools/run_gemini.d.ts.map +1 -1
  88. package/dist/tools/run_gemini.js +6 -2
  89. package/dist/tools/run_gemini.js.map +1 -1
  90. package/dist/tools/run_hermes.d.ts +1 -0
  91. package/dist/tools/run_hermes.d.ts.map +1 -1
  92. package/dist/tools/run_hermes.js +22 -15
  93. package/dist/tools/run_hermes.js.map +1 -1
  94. package/docs/agent-http-tutorial.md +524 -524
  95. package/docs/provider-config-map.md +444 -0
  96. package/package.json +8 -10
  97. package/scripts/_db_check.py +10 -0
  98. package/scripts/status_check.py +20 -0
@@ -0,0 +1,444 @@
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, herite 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 5 fichiers cles
29
+
30
+ | Fichier | Role |
31
+ |---|---|
32
+ | `HERMES_HOME/.env` | API keys globales Hermes (fallback) |
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), URLs par provider |
37
+
38
+ ---
39
+
40
+ ## Les 2 endpoints Z.AI (DECOUVERTE CRITIQUE)
41
+
42
+ Z.AI a **deux endpoints distincts** — confusion entre les deux causait des erreurs 402:
43
+
44
+ | Endpoint | URL | Usage |
45
+ |---|---|---|
46
+ | **Coding** (celui qu'il faut) | `https://api.z.ai/api/coding/paas/v4` | Inference LLM (Hermes, Overmind) |
47
+ | **Non-coding** (ancien, different billing) | `https://api.z.ai/api/paas/v4` | Autre chose (pas le meme systeme de facturation) |
48
+
49
+ **Comment le credential pool est seed:**
50
+
51
+ | Source dans .env | Cle dans auth.json | base_url assignee |
52
+ |---|---|---|
53
+ | `ZAI_ANTHROPIC_FALLBACK_KEY` | `zai[0].access_token` | `https://api.z.ai/api/coding/paas/v4` ✅ |
54
+ | `Z_AI_API_KEY` | `zai[1].access_token` | `https://api.z.ai/api/paas/v4` ❌ (ancien) |
55
+
56
+ Le premier entry (priority 0) est utilise en premier. C'est celui qui est seed par `writeAuthJson()` dans `NousHermesRunner.ts` → `ZAI_ANTHROPIC_FALLBACK_KEY`.
57
+
58
+ ---
59
+
60
+ ## Provider → Ce qu'Hermes attend
61
+
62
+ ### Z.AI (id: `zai`)
63
+
64
+ | Param | Valeur attendue | Source dans Hermes |
65
+ |---|---|---|
66
+ | Provider ID | `zai` | config.yaml ou settings |
67
+ | API Key | `ZAI_ANTHROPIC_FALLBACK_KEY` (cle primaire) ou `Z_AI_API_KEY` (fallback ancien) | `HERMES_HOME/.env` → `os.environ` |
68
+ | Base URL | `https://api.z.ai/api/coding/paas/v4` | credential pool (seed par writeAuthJson) |
69
+ | Model | `glm-5.1` | settings `env.ANTHROPIC_MODEL` |
70
+
71
+ ```json
72
+ // settings_[agent].json — Z.AI correct
73
+ {
74
+ "env": {
75
+ "ANTHROPIC_AUTH_TOKEN": "$ZAI_ANTHROPIC_FALLBACK_KEY",
76
+ "ANTHROPIC_BASE_URL": "https://api.z.ai/api/coding/paas/v4",
77
+ "ANTHROPIC_MODEL": "glm-5.1"
78
+ }
79
+ }
80
+ ```
81
+
82
+ ```bash
83
+ # .env minimal pour Z.AI
84
+ ZAI_ANTHROPIC_FALLBACK_KEY=5f650035e5a845549e4765184d8179b1.GdehlMpHT0dKq3m3
85
+ ```
86
+
87
+ Le credential pool `auth.json` est ecrit par `writeAuthJson()` dans `NousHermesRunner.ts`. La cle `ZAI_ANTHROPIC_FALLBACK_KEY` est envoyee par `agentCustomEnv` → Hermes seed le credential pool avec le bon endpoint.
88
+
89
+ ---
90
+
91
+ ### Z.AI Multi-Token (E/Y)
92
+
93
+ Deamon a 2 tokens Z.AI (E=primary, Y=secondary). Le credential pool peut contenir les deux:
94
+
95
+ | Token | Label dans auth.json | Cle dans .env |
96
+ |---|---|---|
97
+ | Primary | `ANTHROPIC_AUTH_TOKEN_E` | `ANTHROPIC_AUTH_TOKEN_E` = `5f65...q3m3` |
98
+ | Secondary | `ANTHROPIC_AUTH_TOKEN_Y` | `ANTHROPIC_AUTH_TOKEN_Y` = `c78a...1ISt` |
99
+
100
+ Pour qu'un agent utilise le token Y (secondary) au lieu de E (primary), le settings doit utiliser `$ANTHROPIC_AUTH_TOKEN_Y` au lieu de `$ANTHROPIC_AUTH_TOKEN_E`.
101
+
102
+ ---
103
+
104
+ ### MiniMax CN (id: `minimax-cn`)
105
+
106
+ | Param | Valeur attendue | Source dans Hermes |
107
+ |---|---|---|
108
+ | Provider ID | `minimax-cn` | config.yaml ou settings |
109
+ | API Key | `MINIMAX_CN_API_KEY` **uniquement** | `HERMES_HOME/.env` → `os.environ` |
110
+ | Base URL | `https://api.minimaxi.com/anthropic` | hardcoded dans ProviderConfig |
111
+ | Model | `MiniMax-M2.7` | settings `env.ANTHROPIC_MODEL` |
112
+
113
+ ```json
114
+ // settings_[agent].json — MiniMax correct
115
+ {
116
+ "env": {
117
+ "ANTHROPIC_AUTH_TOKEN": "$MINIMAX_CN_API_KEY",
118
+ "ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
119
+ "ANTHROPIC_MODEL": "MiniMax-M2.7"
120
+ }
121
+ }
122
+ ```
123
+
124
+ ```bash
125
+ # .env minimal pour MiniMax
126
+ MINIMAX_CN_API_KEY=ton_token_minimax_ici
127
+ ```
128
+
129
+ **auth.json** stocke sous `MINIMAX_CN_API_KEY`.
130
+
131
+ ---
132
+
133
+ ### OpenRouter — BANNIR pour LLM
134
+
135
+ | Param | Valeur attendue | Source |
136
+ |---|---|---|
137
+ | Provider ID | — | **Ne PAS utiliser** |
138
+ | API Key | `OPENROUTER_API_KEY` | `HERMES_HOME/.env` → `os.environ` |
139
+ | Base URL | `https://openrouter.ai/api/v1` | hardcoded |
140
+ | Guardrail | — | Force 404 si active |
141
+
142
+ **PROBLEME:** Si `OPENROUTER_API_KEY` est present (meme dans `OVERMIND_EMBEDDING_KEY` route via NousHermesRunner), Hermes le detecte et tente OpenRouter pour l'inference.
143
+
144
+ **auth.json** a une entree OpenRouter — si le status est `exhausted`, Hermes ne retry plus mais peut quand meme picker le provider "openrouter" dans le credential pool.
145
+
146
+ ---
147
+
148
+ ## Comment Hermes decide quel provider utiliser
149
+
150
+ ```
151
+ 1. Si `provider` explicite dans config.yaml → utilise ce provider
152
+ 2. Sinon si `ANTHROPIC_BASE_URL` contient openrouter → "openrouter"
153
+ 3. Sinon lit model name → compare avec model_defaults par provider
154
+ - "glm-*" → "zai"
155
+ - "MiniMax-*" → "minimax-cn"
156
+ 4. Sinon fallback: model.default dans config.yaml
157
+ ```
158
+
159
+ Le model resolve le provider. Donc `ANTHROPIC_MODEL=glm-5.1` sans provider explicite → `zai`. `ANTHROPIC_MODEL=MiniMax-M2.7` → `minimax-cn`.
160
+
161
+ ---
162
+
163
+ ## Comment NousHermesRunner passe les vars a Hermes
164
+
165
+ Le runner lit `settings_[agent].json` → applique `interpolateEnvVars()` qui remplace `$VAR` par `process.env[VAR]` → envoie le tout dans `agentCustomEnv` au processus Hermes.
166
+
167
+ ```typescript
168
+ // Ce que NousHermesRunner.ts passe a Hermes (agentCustomEnv)
169
+ const agentCustomEnv = {
170
+ ...process.env, // HERMES_HOME/.env + Workflow/.env fusionnes
171
+ PYTHONIOENCODING: 'utf-8',
172
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '', // VIDE (fixe)
173
+ NVIDIA_API_KEY: process.env.NVIDIA_API_KEY || process.env.NVAPI_KEY,
174
+ ANTHROPIC_AUTH_TOKEN: s.env.ANTHROPIC_AUTH_TOKEN, // interpolate
175
+ ANTHROPIC_BASE_URL: s.env.ANTHROPIC_BASE_URL, // interpolate
176
+ ANTHROPIC_MODEL: s.env.ANTHROPIC_MODEL, // interpolate
177
+ };
178
+ ```
179
+
180
+ Puis lance Hermes avec `--env-file` pour discord_llm + Workflow `.env` (via startpipeline.js).
181
+
182
+ ---
183
+
184
+ ## Le probleme de OPENROUTER_API_KEY
185
+
186
+ **AVANT le fix:**
187
+ ```typescript
188
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || process.env.OVERMIND_EMBEDDING_KEY,
189
+ ```
190
+ → Si `OPENROUTER_API_KEY` vide mais `OVERMIND_EMBEDDING_KEY` present → passe quand meme une cle OpenRouter a Hermes → Hermes detecte `OPENROUTER_API_KEY` → tente OpenRouter → 404 guardrail.
191
+
192
+ **APRES le fix:**
193
+ ```typescript
194
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
195
+ ```
196
+ → `OVERMIND_EMBEDDING_KEY` n'est plus redirige. Si `OPENROUTER_API_KEY` absent du `.env`, Hermes recoit string vide et ne pick pas OpenRouter.
197
+
198
+ ---
199
+
200
+ ## Comment Hermes obtient la API Key (le vrai flux)
201
+
202
+ Le `ANTHROPIC_AUTH_TOKEN` dans `settings.json` **ne passe pas directement** dans le body de la requete API. Hermes utilise son propre credential pool:
203
+
204
+ ```
205
+ settings_[agent].json
206
+ "env": {
207
+ "ANTHROPIC_AUTH_TOKEN": "$ZAI_ANTHROPIC_FALLBACK_KEY", ← Runner remplace $VAR → "token_reel"
208
+ "ANTHROPIC_BASE_URL": "https://api.z.ai/api/coding/paas/v4",
209
+ "ANTHROPIC_MODEL": "glm-5.1"
210
+ }
211
+ ↓ (interpolateEnvVars par NousHermesRunner)
212
+ agentCustomEnv envoye a Hermes:
213
+ ANTHROPIC_AUTH_TOKEN=token_reel
214
+ ANTHROPIC_BASE_URL=https://api.z.ai/api/coding/paas/v4
215
+ ANTHROPIC_MODEL=glm-5.1
216
+
217
+ MAIS Hermes ne lit PAS ANTHROPIC_AUTH_TOKEN directement.
218
+ Hermes lit le CREDENTIAL POOL (auth.json) + les .env vars listees dans api_key_env_vars.
219
+
220
+ Credential pool est seed par:
221
+ ZAI_ANTHROPIC_FALLBACK_KEY → "zai" avec base_url coding ✅
222
+ Z_AI_API_KEY → "zai" avec base_url non-coding (ancien)
223
+ MINIMAX_CN_API_KEY → "minimax-cn"
224
+ ```
225
+
226
+ Le `$VAR` 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.ZAI_ANTHROPIC_FALLBACK_KEY` qui seed le credential pool.
227
+
228
+ ---
229
+
230
+ ## Le flow complet (Z.AI par exemple)
231
+
232
+ 1. `Workflow/.env` contient `ZAI_ANTHROPIC_FALLBACK_KEY=<TOKEN>`
233
+ 2. `startpipeline.js` charge `.env` → `process.env.ZAI_ANTHROPIC_FALLBACK_KEY`
234
+ 3. ` NousHermesRunner` lit `settings_zai.json` → `interpolateEnvVars()`
235
+ - `$ZAI_ANTHROPIC_FALLBACK_KEY` → `process.env["ZAI_ANTHROPIC_FALLBACK_KEY"]` → `"<TOKEN>"`
236
+ - `ANTHROPIC_AUTH_TOKEN="<TOKEN>"` (valeur concrete maintenant)
237
+ 4. `agentCustomEnv` envoye a Hermes:
238
+ - `ANTHROPIC_AUTH_TOKEN=<TOKEN>`
239
+ - `ANTHROPIC_BASE_URL=https://api.z.ai/api/coding/paas/v4`
240
+ - `ANTHROPIC_MODEL=glm-5.1`
241
+ 5. Hermes fait son propre lookup:
242
+ - `load_pool("zai")` → `_resolve_api_key_provider_secret("zai")`
243
+ - Cherche `ZAI_ANTHROPIC_FALLBACK_KEY` via `_get_env_prefer_dotenv()` dans `HERMES_HOME/.env` puis `os.environ`
244
+ - Trouve dans `os.environ` (herite du parent)
245
+ - `writeAuthJson()` ecrit dans `auth.json` avec base_url `https://api.z.ai/api/coding/paas/v4`
246
+ 6. API call → utilise le credential pool entry pour `zai` avec le bon endpoint
247
+
248
+ ---
249
+
250
+ ## OPENROUTER et Les Embeddings
251
+
252
+ **`OVERMIND_EMBEDDING_KEY`** = clef OpenRouter pour les **embeddings uniquement** (PostgresMemoryProvider du Workflow). Elle est dans le `.env` Overmind. Hermes n'a pas besoin de la voir pour l'LLM inference.
253
+
254
+ **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.
255
+
256
+ **Fix applique:**
257
+ ```typescript
258
+ OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Le config.yaml ecrit par NousHermesRunner (exemple sniperbot_analyst)
264
+
265
+ ```yaml
266
+ mcp_servers:
267
+ memory-server:
268
+ url: "http://localhost:3099/mcp"
269
+ discord-server:
270
+ url: "http://localhost:3141/mcp"
271
+ x-mcp-server:
272
+ url: "http://localhost:3142/mcp"
273
+ postgresql-server:
274
+ url: "http://localhost:5433/mcp"
275
+
276
+ model:
277
+ default: glm-5.1
278
+ provider: z-ai
279
+
280
+ tts:
281
+ provider: elevenlabs
282
+ voice: charlie
283
+ voice_id: IKne3meq5aSn9XLyUdCD
284
+ model: eleven_multilingual_v2
285
+ ```
286
+
287
+ Ce config est ecrit dans `.overmind/hermes/agent_<name>/.hermes/config.yaml` a chaque run. Les valeurs viennent de `settings_<agent>.json` + defaults.
288
+
289
+ ---
290
+
291
+ ## Checklist pour ajouter un nouveau provider
292
+
293
+ 1. **Verifier le ProviderConfig** dans `hermes-agent/hermes_cli/auth.py`
294
+ - Verifier `api_key_env_vars` (les vars que Hermes cherche)
295
+ - Verifier `inference_base_url` (URL par defaut)
296
+ - Verifier `base_url_env_var` (optionnel, surcharge URL)
297
+
298
+ 2. **Ajouter dans Workflow/.env**
299
+ ```bash
300
+ MAISON_API_KEY=cle_api_du_fournisseur
301
+ ```
302
+
303
+ 3. **Ajouter dans settings_[agent].json**
304
+ ```json
305
+ {
306
+ "env": {
307
+ "ANTHROPIC_AUTH_TOKEN": "$MAISON_API_KEY",
308
+ "ANTHROPIC_BASE_URL": "https://api.fournisseur.com/v1",
309
+ "ANTHROPIC_MODEL": "model-name"
310
+ }
311
+ }
312
+ ```
313
+
314
+ 4. **Verifier auth.json** — apres premiere utilisation, Hermes stocke le token avec status.
315
+ - Si `exhausted` → Hermes skip ce provider automatiquement
316
+ - Si `ok` → utilise le token
317
+
318
+ 5. **NE JAMAIS** faire de mapping `AUTRE_CHOSE_API_KEY → OPENROUTER_API_KEY` — ca force OpenRouter.
319
+
320
+ 6. **Pour eviter OpenRouter:** pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env`
321
+
322
+ ---
323
+
324
+ ## Resume
325
+
326
+ | Tu veux... | Utilise ces vars |
327
+ |---|---|
328
+ | Z.AI (glm-5.1) | `ZAI_ANTHROPIC_FALLBACK_KEY` dans `.env` + settings `$ZAI_ANTHROPIC_FALLBACK_KEY` |
329
+ | Z.AI secondary (token Y) | `ANTHROPIC_AUTH_TOKEN_Y` dans `.env` + settings `$ANTHROPIC_AUTH_TOKEN_Y` |
330
+ | MiniMax CN | `MINIMAX_CN_API_KEY` dans `.env` + settings `$MINIMAX_CN_API_KEY` |
331
+ | Embeddings OpenRouter | `OVERMIND_EMBEDDING_KEY` (pour embeddings, PAS LLM) |
332
+ | Eviter OpenRouter LLM | Pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env` |
333
+
334
+ ---
335
+
336
+ ## Gemini / @google/gemini-cli (id: `gemini`)
337
+
338
+ Le runner `gemini` utilise **`@google/gemini-cli`** (npm, v0.43.0) en headless mode.
339
+ Le CLI est installé via `npm install -g @google/gemini-cli` et disponible dans le PATH.
340
+
341
+ ### Installation
342
+
343
+ ```bash
344
+ npm install -g @google/gemini-cli
345
+ gemini --version # → 0.43.0
346
+ ```
347
+
348
+ ### Flags CLI utilisés
349
+
350
+ | Flag | Valeur | Rôle |
351
+ |---|---|---|
352
+ | `-p` / `--prompt` | prompt text | Mode headless (non-interactif) |
353
+ | `--approval-mode` | `yolo` | Auto-approve tous les outils |
354
+ | `--session-id` | UUID | Session persistante entre appels |
355
+ | `--acp` | (flag) | Active le protocol agent (ACP) |
356
+ | `--model` | `antigravity/<MODE>` | Passe le mode Antigravity comme contexte |
357
+ | `--output-format` | `json` | Output structuré pour parser session_id |
358
+
359
+ ### Commandes equivalents (CLI direct)
360
+
361
+ ```bash
362
+ # Test quick
363
+ gemini -p "Dis-moi bonjour" --approval-mode yolo
364
+
365
+ # Avec session
366
+ gemini -p "Analyse ce code" --approval-mode yolo --session-id <uuid> --acp
367
+
368
+ # Mode PLAN
369
+ gemini -p "Planifie cette tache" --model antigravity/PLAN --approval-mode yolo --acp
370
+
371
+ # List sessions
372
+ gemini --list-sessions
373
+ ```
374
+
375
+ ### Modes Antigravity (parametre `mode`)
376
+
377
+ Le mode est passe via `--model antigravity/<MODE>` pour donner du contexte au modele.
378
+
379
+ || Mode | Usage |
380
+ |---|---|
381
+ | `GENERAL` | Mode par defaut, taches polyvalentes |
382
+ | `CONTEXT_CHECK` | Verification de contexte code |
383
+ | `PLAN` | Planification de taches complexes |
384
+ | `COMMAND` | Execution de commandes shell |
385
+ | `CASCADE` | Execution en cascade multi-agents |
386
+ | `EVAL` | Evaluation et revue de code |
387
+ | `ANTIGRAVITY_REVIEW` | Revue automatique Antigravity |
388
+ | `MQUERY` | Recherche multi-source |
389
+ | `COMMIT_MESSAGE` | Generation de messages de commit |
390
+ | `CHECKPOINT` | Sauvegarde de checkpoint |
391
+ | `FAST_APPLY` | Application rapide de patches |
392
+
393
+ ### Utilisation Overmind (run_agent)
394
+
395
+ ```typescript
396
+ // run_agent avec runner: 'gemini'
397
+ const result = await runAgent({
398
+ runner: 'gemini', // GeminiRunner → gemini CLI npm
399
+ prompt: 'Analyse ce code',
400
+ agentName: 'expert_python',
401
+ mode: 'GENERAL', // GENERAL, PLAN, COMMAND, CASCADE, EVAL, etc.
402
+ autoResume: false,
403
+ configPath: './Workflow',
404
+ });
405
+
406
+ // ou directement via run_gemini.ts
407
+ const result = await runGeminiAgent({
408
+ prompt: '...',
409
+ mode: 'PLAN',
410
+ });
411
+ ```
412
+
413
+ ### Configuration agent
414
+
415
+ Chaque agent stocke sa config dans `.antigravity/agent_<nom>/`:
416
+ - `mcp.json` — serveurs MCP actifs (copies depuis settings_<agent>.json)
417
+ - Session store — sessions persistees
418
+
419
+ ### Verification installation
420
+
421
+ ```bash
422
+ gemini --version
423
+ # → 0.43.0
424
+
425
+ gemini mcp list
426
+ # → liste les MCP servers configures
427
+ ```
428
+
429
+ ### Erreurs connues
430
+
431
+ | Erreur | Cause | Fix |
432
+ |---|---|---|
433
+ | `GEMINI_CLI_NOT_INSTALLED` | `@google/gemini-cli` pas dans le PATH | `npm install -g @google/gemini-cli` |
434
+ | `EXIT_CODE_1` | Session invalide ou prompt rejete | Retry sans sessionId |
435
+ | `TIMEOUT` | Reponse > 15min | Augmente `CONFIG.TIMEOUT_MS` |
436
+
437
+ ### Ce qui a change (historique)
438
+
439
+ || Avant (session 2025) | Maintenant |
440
+ |---|---|---|
441
+ | Spawn `language_server_windows_x64.exe` avec flags inexistants | Spawn `gemini` (npm bin) avec flags reels |
442
+ | `--mode --prompt-file --session --output-format` (flags Go inexistants) | `-p --approval-mode yolo --session-id --acp --model --output-format json` |
443
+ | Auth via OAuth interne Antigravity IDE | Auth via Google account du CLI npm |
444
+ | Config `.antigravity/<agent>/` | Config `.antigravity/<agent>/` (MCP + sessions) |
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "overmind-mcp",
3
- "version": "2.8.3",
4
- "preferGlobal": true,
3
+ "version": "2.8.7",
5
4
  "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
5
  "type": "module",
7
6
  "main": "dist/index.js",
@@ -45,14 +44,15 @@
45
44
  "version": "changeset version && node scripts/auto-changelog.mjs",
46
45
  "release": "pnpm run build && changeset publish",
47
46
  "prepublishOnly": "pnpm run rebuild",
48
- "postinstall": "node scripts/postinstall.mjs || exit 0",
47
+ "postinstall": "node scripts/postinstall.mjs",
49
48
  "setup": "overmind-setup",
50
49
  "setup:deps": "node scripts/install-dependencies.mjs",
51
50
  "postgres:up": "overmind-postgres-mcp up",
52
51
  "postgres:down": "overmind-postgres-mcp down",
53
52
  "postgres:status": "overmind-postgres-mcp status",
54
53
  "postgres:logs": "overmind-postgres-mcp logs",
55
- "postgres:reset": "overmind-postgres-mcp reset"
54
+ "postgres:reset": "overmind-postgres-mcp reset",
55
+ "prebuild": "node -e \"try{require('fs').copyFileSync('bin/launch.js','dist/bin/launch.js');console.log('Copied launch.js')}catch{console.log('dist/bin not ready yet')}\""
56
56
  },
57
57
  "keywords": [
58
58
  "mcp",
@@ -76,8 +76,8 @@
76
76
  "url": "https://discord.gg/4AR82phtBz"
77
77
  },
78
78
  "homepage": "https://deamondev888.github.io/overmind-mcp/",
79
- "engines": {
80
- "node": ">=20.0.0 <=25"
79
+ "engines": {
80
+ "node": ">=20.0.0"
81
81
  },
82
82
  "packageManager": "pnpm@10.18.0",
83
83
  "devDependencies": {
@@ -85,10 +85,10 @@
85
85
  "@eslint/js": "^10.0.1",
86
86
  "@types/node": "^25.6.2",
87
87
  "@types/pg": "^8.20.0",
88
- "@types/pino": "^7.0.5",
89
88
  "eslint": "^10.3.0",
90
89
  "eslint-config-prettier": "^10.1.8",
91
90
  "globals": "^17.6.0",
91
+ "pino-pretty": "^13.1.3",
92
92
  "prettier": "^3.8.3",
93
93
  "rimraf": "^6.1.3",
94
94
  "typescript": "^6.0.3",
@@ -102,13 +102,11 @@
102
102
  "overmind-postgres-mcp": "^1.3.0",
103
103
  "pg": "^8.20.0",
104
104
  "pino": "^10.3.1",
105
- "pino-pretty": "^13.1.3",
106
105
  "pino-roll": "^4.0.0",
107
106
  "tinyglobby": "^0.2.16",
108
- "tslib": "^2.8.1",
109
107
  "zod": "^4.4.3"
110
108
  },
111
109
  "peerDependencies": {
112
110
  "tslib": "^2.0.0"
113
111
  }
114
- }
112
+ }
@@ -0,0 +1,10 @@
1
+
2
+ import psycopg2
3
+ conn = psycopg2.connect(host="localhost", port=5432, dbname="financial_analyst", user="postgres")
4
+ cur = conn.cursor()
5
+ cur.execute("SELECT id, ligne, qte, description FROM bt_materiaux WHERE bon_id = 5 ORDER BY ligne")
6
+ rows = cur.fetchall()
7
+ print("MATERIAUX_BON5:", len(rows))
8
+ for r in rows:
9
+ print("LIGNE", r[1], "QTE", r[2], "DESC:", r[3][:80])
10
+ conn.close()
@@ -0,0 +1,20 @@
1
+ import psycopg2
2
+ conn = psycopg2.connect(host='localhost', port=5433, dbname='financial_analyst', user='postgres')
3
+ cur = conn.cursor()
4
+ cur.execute('''SELECT s.id, s.date_debut, s.date_fin, c.no_contrat, e.nom as employe
5
+ FROM bt_semaines s
6
+ JOIN bt_contrats c ON s.contrat_id = c.id
7
+ JOIN bt_employes e ON s.employe_id = e.id
8
+ ORDER BY s.date_debut DESC LIMIT 5''')
9
+ rows = cur.fetchall()
10
+ print('Dernieres semaines:')
11
+ for r in rows:
12
+ print(f' ID={r[0]} | {r[1]} a {r[2]} | contrat={r[3]} | employe={r[4]}')
13
+
14
+ cur.execute('SELECT COUNT(*) FROM bt_semaines')
15
+ print(f'Total semaines: {cur.fetchone()[0]}')
16
+
17
+ cur.execute('SELECT COUNT(*) FROM bt_employes WHERE actif=true')
18
+ print(f'Employes actifs: {cur.fetchone()[0]}')
19
+
20
+ conn.close()