overmind-mcp 2.8.37 → 2.8.43
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.
- package/bin/..logs/Workflow.err.log +0 -0
- package/bin/..logs/Workflow.log +0 -0
- package/dist/bin/cli.js +2 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/services/AgentManager.d.ts +9 -0
- package/dist/services/AgentManager.d.ts.map +1 -1
- package/dist/services/AgentManager.js +36 -0
- package/dist/services/AgentManager.js.map +1 -1
- package/dist/services/NousHermesRunner.d.ts.map +1 -1
- package/dist/services/NousHermesRunner.js +88 -18
- package/dist/services/NousHermesRunner.js.map +1 -1
- package/dist/tools/manage_agents.d.ts.map +1 -1
- package/dist/tools/manage_agents.js +30 -2
- package/dist/tools/manage_agents.js.map +1 -1
- package/dist/tools/run_agent_cli.js +10 -1
- package/dist/tools/run_agent_cli.js.map +1 -1
- package/docs/SETUP_HERMES_AGENT_FROM_SCRATCH.md +587 -0
- package/package.json +1 -1
- package/dist/bin/launch.js +0 -78
- package/scripts/_hermes_test_memory_store.mjs +0 -50
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
# Guide Complet : Setup d'un agent Hermes persistant (Discord) avec Overmind
|
|
2
|
+
|
|
3
|
+
**Audience :** admin Linux qui part de zéro et veut un bot Discord alimenté par
|
|
4
|
+
MiniMax-M3 (ou n'importe quel provider LLM), avec persistance, MCP Discord,
|
|
5
|
+
et toutes les subtilités de la subtilisation comprises.
|
|
6
|
+
|
|
7
|
+
**Pré-requis :** Linux (Ubuntu 24+ recommandé), `sudo` activé, accès à un
|
|
8
|
+
compte Discord bot + token.
|
|
9
|
+
|
|
10
|
+
**Stack final :**
|
|
11
|
+
- Node.js 22 LTS
|
|
12
|
+
- Docker (PostgreSQL + pgvector pour la mémoire vectorielle)
|
|
13
|
+
- overmind-mcp 2.8.40+ (`npm i -g overmind-mcp`)
|
|
14
|
+
- hermes-agent 0.16.0+ (`pip install hermes-agent` ou `npm i -g hermes-agent`)
|
|
15
|
+
- discord_llm (le bridge Discord ↔ Overmind)
|
|
16
|
+
- Un token MiniMax CN (sk-cp-* ou sk-mm-*) — voir §5
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Préparation système (Linux fresh)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 1.1 Mise à jour
|
|
24
|
+
sudo apt update && sudo apt upgrade -y
|
|
25
|
+
|
|
26
|
+
# 1.2 Paquets de base
|
|
27
|
+
sudo apt install -y curl git build-essential python3 python3-pip python3-venv \
|
|
28
|
+
ripgrep jq ca-certificates gnupg lsb-release
|
|
29
|
+
|
|
30
|
+
# 1.3 Node.js 22 LTS
|
|
31
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
|
|
32
|
+
sudo apt install -y nodejs
|
|
33
|
+
node --version # v22.x
|
|
34
|
+
|
|
35
|
+
# 1.4 Docker (pour PostgreSQL + pgvector)
|
|
36
|
+
curl -fsSL https://get.docker.com | sudo sh
|
|
37
|
+
sudo usermod -aG docker $USER
|
|
38
|
+
newgrp docker
|
|
39
|
+
docker --version
|
|
40
|
+
|
|
41
|
+
# 1.5 PostgreSQL + pgvector via Docker
|
|
42
|
+
docker run -d --name overmind-postgres \
|
|
43
|
+
-e POSTGRES_PASSWORD=psu6044 \
|
|
44
|
+
-e POSTGRES_DB=overmind \
|
|
45
|
+
-p 5433:5432 \
|
|
46
|
+
pgvector/pgvector:pg16
|
|
47
|
+
# Note: on utilise 5433 (pas 5432) pour éviter les conflits
|
|
48
|
+
sleep 5
|
|
49
|
+
docker exec overmind-postgres psql -U postgres -c "CREATE DATABASE bt_clients;"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 2. Installation globale d'Overmind + Hermes
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 2.1 Overmind MCP (l'orchestrateur multi-runner)
|
|
58
|
+
sudo npm i -g overmind-mcp
|
|
59
|
+
overmind-mcp --version # doit afficher 2.8.40+
|
|
60
|
+
|
|
61
|
+
# 2.2 Hermes Agent (le moteur LLM)
|
|
62
|
+
pip install hermes-agent
|
|
63
|
+
hermes --version # doit afficher 0.16.0+
|
|
64
|
+
|
|
65
|
+
# 2.3 Premier setup de Hermes (auth + workspace)
|
|
66
|
+
hermes setup
|
|
67
|
+
# → crée ~/.hermes/, te demande de login à un provider
|
|
68
|
+
# → ne login PAS ici (Overmind va gérer ça dynamiquement)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. Setup du workspace Overmind
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 3.1 Créer le workspace
|
|
77
|
+
mkdir -p ~/overmind-workflow && cd ~/overmind-workflow
|
|
78
|
+
overmind-mcp init
|
|
79
|
+
# → crée .overmind/, .mcp.json, .claude/, etc.
|
|
80
|
+
|
|
81
|
+
# 3.2 Variables d'environnement minimales
|
|
82
|
+
cat > .env <<'EOF'
|
|
83
|
+
# PostgreSQL
|
|
84
|
+
POSTGRES_HOST=localhost
|
|
85
|
+
POSTGRES_PORT=5433
|
|
86
|
+
POSTGRES_DB=overmind
|
|
87
|
+
POSTGRES_USER=postgres
|
|
88
|
+
POSTGRES_PASSWORD=psu6044
|
|
89
|
+
|
|
90
|
+
# MiniMax CN (vos tokens — voir §5)
|
|
91
|
+
ANTHROPIC_AUTH_TOKEN_1=***votre_token_CN_valide***
|
|
92
|
+
ANTHROPIC_AUTH_TOKEN_2=***votre_token_CN_valide***
|
|
93
|
+
|
|
94
|
+
# Convention user: MiniMax = CN par défaut
|
|
95
|
+
OVERMIND_MINIMAX_DEFAULT=cn
|
|
96
|
+
EOF
|
|
97
|
+
chmod 600 .env
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 4. Configuration des agents Hermes — La subtilisation expliquée
|
|
103
|
+
|
|
104
|
+
### 4.1 Le concept
|
|
105
|
+
|
|
106
|
+
Overmind supporte **4 runners** : `claude`, `kilo`, `openclaw`, `hermes`.
|
|
107
|
+
Pour ne pas réinventer la roue 4 fois, Overmind utilise **un format unifié**
|
|
108
|
+
pour TOUS les runners : `Workflow/.claude/settings_<agent>.json`.
|
|
109
|
+
|
|
110
|
+
Quand le runner `hermes` est invoqué, il **convertit** ce format unifié vers
|
|
111
|
+
le **format canonique Hermes** (`<HERMES_HOME>/agents/<name>/settings.json`)
|
|
112
|
+
au moment du spawn. C'est la "subtilisation" : Overmind déduit
|
|
113
|
+
automatiquement quels env vars provider-specific seed (e.g. `MINIMAX_CN_API_KEY`)
|
|
114
|
+
à partir du token + URL.
|
|
115
|
+
|
|
116
|
+
### 4.2 L'arborescence canonique (3 couches)
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
~/overmind-workflow/ ← workspace Overmind
|
|
120
|
+
├── .claude/ ← COUCHE 1 (source, tu édites)
|
|
121
|
+
│ ├── settings_<agent>.json ← format Overmind unifié
|
|
122
|
+
│ └── agents/<agent>.md ← (legacy, ignoré par Hermes)
|
|
123
|
+
├── .mcp.json ← registre MCP servers HTTP
|
|
124
|
+
├── .env ← tokens + secrets ($VAR)
|
|
125
|
+
├── .overmind/hermes/ ← HERMES_HOME (root partagé)
|
|
126
|
+
│ ├── agents/<agent>/ ← COUCHE 2 (canonique, auto-généré)
|
|
127
|
+
│ │ ├── settings.json ← écrit par le runner
|
|
128
|
+
│ │ ├── SOUL.md ← persona de l'agent
|
|
129
|
+
│ │ ├── sessions/ logs/ memories/ ← Hermes upstream écrit
|
|
130
|
+
│ ├── config.yaml ← COUCHE 3 (Hermes global, auto-bootstrappé)
|
|
131
|
+
│ ├── auth.json ← COUCHE 3 (credential pool, Hermes global)
|
|
132
|
+
│ ├── sessions/ logs/ ← partagés entre agents
|
|
133
|
+
└── src/ ← code source Overmind (si dev)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**3 couches pour 3 raisons :**
|
|
137
|
+
- **Source** `.claude/settings_<name>.json` = portable entre 4 runners (Claude/Kilo/OpenClaw/Hermes)
|
|
138
|
+
- **Canonique** `.overmind/hermes/agents/<name>/settings.json` = ce qu'Hermes upstream lit
|
|
139
|
+
- **Globale** `.overmind/hermes/config.yaml` + `auth.json` = état partagé, géré par Hermes upstream
|
|
140
|
+
|
|
141
|
+
### 4.3 La subtilisation — TABLE DE MAPPING (le coeur du fix 2.8.x)
|
|
142
|
+
|
|
143
|
+
Quand le runner Overmind écrit le settings.json canonique, il **injecte**
|
|
144
|
+
automatiquement des env vars provider-specific. Le user n'a qu'à mettre
|
|
145
|
+
`ANTHROPIC_AUTH_TOKEN` + `ANTHROPIC_BASE_URL` dans le source — le runner
|
|
146
|
+
fait le reste.
|
|
147
|
+
|
|
148
|
+
| Token prefix dans `ANTHROPIC_AUTH_TOKEN` | URL contient | → env vars seedées dans le canonique |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| `sk-cp-*` ou `sk-mm-*` | `minimaxi` (avec le `i`) | `MINIMAX_CN_API_KEY` + `MINIMAX_CN_BASE_URL=https://api.minimaxi.com/anthropic` |
|
|
151
|
+
| `sk-cp-*` ou `sk-mm-*` | `minimax` (sans le `i`) | `MINIMAX_API_KEY` + `MINIMAX_BASE_URL=https://api.minimax.io/anthropic` |
|
|
152
|
+
| `sk-cp-*` ou `sk-mm-*` | vide | `MINIMAX_CN_*` (défaut `OVERMIND_MINIMAX_DEFAULT=cn`) |
|
|
153
|
+
| 32hex ou 32hex.32hex | n/a | `ZAI_ANTHROPIC_FALLBACK_KEY` + `GLM_API_KEY` |
|
|
154
|
+
| autre `sk-*` | n/a | rien de plus (laisser `ANTHROPIC_AUTH_TOKEN`) |
|
|
155
|
+
|
|
156
|
+
**Pourquoi c'est subtil :** le binaire Hermes upstream a 31+ plugins
|
|
157
|
+
provider-specific. Chaque plugin lit des env vars différentes :
|
|
158
|
+
- Plugin `minimax-cn` lit `MINIMAX_CN_API_KEY`
|
|
159
|
+
- Plugin `minimax` (GLOBAL) lit `MINIMAX_API_KEY`
|
|
160
|
+
- Résolveur provider lit `MINIMAX_CN_BASE_URL` (PAS `ANTHROPIC_BASE_URL`)
|
|
161
|
+
|
|
162
|
+
Si tu mets juste `ANTHROPIC_AUTH_TOKEN`, **le plugin upstream va
|
|
163
|
+
silencieusement 401** parce qu'il cherche une autre env var. Le runner
|
|
164
|
+
Overmind fait le mapping pour toi.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 5. Obtenir un token MiniMax CN valide
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# 5.1 Créer un compte sur https://api.minimaxi.com (CN, pas GLOBAL)
|
|
172
|
+
|
|
173
|
+
# 5.2 Générer une clé API (préfixe sk-cp-)
|
|
174
|
+
# → Copier la clé dans ANTHROPIC_AUTH_TOKEN_1 du .env
|
|
175
|
+
|
|
176
|
+
# 5.3 Tester
|
|
177
|
+
curl -X POST https://api.minimaxi.com/anthropic/v1/messages \
|
|
178
|
+
-H "x-api-key: $ANTHROPIC_AUTH_TOKEN_1" \
|
|
179
|
+
-H "anthropic-version: 2023-06-01" \
|
|
180
|
+
-H "content-type: application/json" \
|
|
181
|
+
-d '{"model": "MiniMax-M3", "max_tokens": 32, "messages": [{"role": "user", "content": "ping"}]}'
|
|
182
|
+
# → Doit retourner 200 avec une réponse du modèle
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
⚠️ **Tous les tokens sk-cp-* ne sont pas forcément valides sur CN** —
|
|
186
|
+
certains comptes sont GLOBAL (`api.minimax.io` sans le `i`). Vérifie
|
|
187
|
+
toujours avec curl avant d'investir du temps de debug.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 6. Créer un agent Hermes — l'exemple sniperbot_analyst
|
|
192
|
+
|
|
193
|
+
### 6.1 Le source settings (COUCHE 1)
|
|
194
|
+
|
|
195
|
+
**`~/overmind-workflow/.claude/settings_sniperbot_analyst.json`**
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"env": {
|
|
200
|
+
"ANTHROPIC_AUTH_TOKEN": "$ANTHROPIC_AUTH_TOKEN_1",
|
|
201
|
+
"ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
|
202
|
+
"ANTHROPIC_MODEL": "MiniMax-M3",
|
|
203
|
+
"ANTHROPIC_PROVIDER": "minimax-cn"
|
|
204
|
+
},
|
|
205
|
+
"enableAllProjectMcpServers": true,
|
|
206
|
+
"enabledMcpjsonServers": [],
|
|
207
|
+
"agent": "sniperbot_analyst",
|
|
208
|
+
"runner": "hermes"
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Notes :**
|
|
213
|
+
- `$ANTHROPIC_AUTH_TOKEN_1` est résolu depuis `.env` au moment du spawn
|
|
214
|
+
- `enableAllProjectMcpServers: true` = tous les serveurs MCP du `.mcp.json` sont chargés
|
|
215
|
+
- `enabledMcpjsonServers: []` = pas de filtre additionnel (vide = "tout")
|
|
216
|
+
- **`MINIMAX_CN_API_KEY` et `MINIMAX_CN_BASE_URL` ne sont PAS ici** — le runner les auto-seed (subtilisation 2.8.34)
|
|
217
|
+
|
|
218
|
+
### 6.2 Le registre MCP servers (commun à tous les agents)
|
|
219
|
+
|
|
220
|
+
**`~/overmind-workflow/.mcp.json`**
|
|
221
|
+
|
|
222
|
+
⚠️ **IMPORTANT** : les noms de serveurs DOIVENT matcher les clés du
|
|
223
|
+
`config.yaml` Hermes (`.overmind/hermes/config.yaml:mcp_servers:`). Les
|
|
224
|
+
deux registries ont des conventions différentes — le runner Overmind essaie
|
|
225
|
+
de matcher mais ça peut casser.
|
|
226
|
+
|
|
227
|
+
**Format recommandé** (kebab-case anglais) :
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"mcpServers": {
|
|
232
|
+
"memory-server": { "type": "http", "url": "http://localhost:3099/mcp" },
|
|
233
|
+
"discord-server": { "type": "http", "url": "http://localhost:3141/mcp" },
|
|
234
|
+
"x_server": { "type": "http", "url": "http://localhost:3142/mcp" },
|
|
235
|
+
"postgres": { "type": "http", "url": "http://localhost:5433/mcp" },
|
|
236
|
+
"voipms-mcp": { "type": "http", "url": "http://localhost:3146/mcp" }
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 6.3 Le persona de l'agent (SOUL.md)
|
|
242
|
+
|
|
243
|
+
**`~/overmind-workflow/.overmind/hermes/agents/sniperbot_analyst/SOUL.md`**
|
|
244
|
+
|
|
245
|
+
Ce fichier est créé automatiquement par le runner au premier spawn, mais
|
|
246
|
+
tu peux le pré-créer. Format : markdown libre.
|
|
247
|
+
|
|
248
|
+
```markdown
|
|
249
|
+
# Sniperbot Analyst — Ton persona
|
|
250
|
+
|
|
251
|
+
Tu es un analyste financier Discord pour le serveur VIBE DEV. Tu réponds
|
|
252
|
+
toujours via les outils MCP Discord (jamais de texte brut après un appel).
|
|
253
|
+
|
|
254
|
+
## Tes tools MCP Discord (17 outils réels)
|
|
255
|
+
- mcp_discord_server_gestion_messages (action: envoyer, lire, modifier, supprimer, reagir)
|
|
256
|
+
- mcp_discord_server_creer_embed (embed builder avec 22+ thèmes)
|
|
257
|
+
- mcp_discord_server_gestion_membres (action: lister, info, timeout, warn, ban, kick)
|
|
258
|
+
- mcp_discord_server_gestion_canaux (action: lister, creer, modifier, supprimer)
|
|
259
|
+
... (voir l'inventaire complet du MCP Discord server)
|
|
260
|
+
|
|
261
|
+
## Tes tools Overmind
|
|
262
|
+
- mcp_overmind_server_run_agent (spawner un sous-agent)
|
|
263
|
+
- mcp_overmind_server_list_agents (lister 92 agents)
|
|
264
|
+
- mcp_overmind_server_memory_search / memory_store
|
|
265
|
+
- mcp_overmind_server_update_agent_config
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 6.4 Le config.yaml Hermes (COUCHE 3, auto-bootstrappé par le runner)
|
|
269
|
+
|
|
270
|
+
**`~/overmind-workflow/.overmind/hermes/config.yaml`**
|
|
271
|
+
|
|
272
|
+
Ce fichier est créé automatiquement par le runner Overmind au premier
|
|
273
|
+
spawn (depuis `~/.hermes/config.yaml` par défaut). Contient au minimum :
|
|
274
|
+
|
|
275
|
+
```yaml
|
|
276
|
+
mcp_servers:
|
|
277
|
+
discord-server:
|
|
278
|
+
url: http://localhost:3141/mcp
|
|
279
|
+
memory-server:
|
|
280
|
+
url: http://localhost:3099/mcp
|
|
281
|
+
postgres:
|
|
282
|
+
url: http://localhost:5433/mcp
|
|
283
|
+
voipms-mcp:
|
|
284
|
+
url: http://localhost:3146/mcp
|
|
285
|
+
x_server:
|
|
286
|
+
url: http://localhost:3142/mcp
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Les noms ici sont ce que `--toolsets` accepte.** Si tu mets
|
|
290
|
+
`serveur_discord` ici, le runner ne pourra pas activer les tools via
|
|
291
|
+
`--toolsets` (il faut le même nom partout).
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 7. Lancer l'agent via MCP
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# 7.1 Démarrer le serveur MCP Overmind (qui sert run_agent)
|
|
299
|
+
overmind-mcp start --port 3099
|
|
300
|
+
|
|
301
|
+
# 7.2 Invoquer l'agent depuis n'importe quel client MCP
|
|
302
|
+
# (Claude Code, Continue.dev, ou directement via curl + JSON-RPC 2.0)
|
|
303
|
+
|
|
304
|
+
# Exemple: test direct
|
|
305
|
+
mcp-client call overmind-mcp run_agent \
|
|
306
|
+
--agentName "sniperbot_analyst" \
|
|
307
|
+
--runner "hermes" \
|
|
308
|
+
--prompt "ping - réponds juste OK"
|
|
309
|
+
# → Réponse: "OK"
|
|
310
|
+
# → Log: provider=minimax-cn, model=MiniMax-M3, latency=4-6s
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Le serveur MCP est sur port 3099** par défaut. Il sert le tool
|
|
314
|
+
`run_agent` qui prend `{agentName, runner, prompt, model?}`.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## 8. Brancher Discord (le bot + bridge)
|
|
319
|
+
|
|
320
|
+
### 8.1 Le bot Discord Node.js (discord_llm)
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
# 8.1.1 Créer un bot Discord sur https://discord.com/developers/applications
|
|
324
|
+
# → Copier le token
|
|
325
|
+
|
|
326
|
+
# 8.1.2 Cloner discord_llm (le wrapper Overmind+Discord)
|
|
327
|
+
git clone https://github.com/your-org/discord_llm.git ~/discord_llm
|
|
328
|
+
cd ~/discord_llm
|
|
329
|
+
npm install
|
|
330
|
+
|
|
331
|
+
# 8.1.3 Configurer
|
|
332
|
+
cat > .env <<'EOF'
|
|
333
|
+
DISCORD_BOT_TOKEN=***votre_token_bot_discord***
|
|
334
|
+
CLAUDE_SERVER_PORT=3001
|
|
335
|
+
RUNNER=hermes
|
|
336
|
+
BRIDGE_AGENT=sniperbot_analyst
|
|
337
|
+
OVERMIND_MCP_URL=http://localhost:3099/mcp
|
|
338
|
+
EOF
|
|
339
|
+
|
|
340
|
+
# 8.1.4 Build + start
|
|
341
|
+
npm run build
|
|
342
|
+
npm start
|
|
343
|
+
# → "Bot Discord connecté et maintenu en vie"
|
|
344
|
+
# → "🔗 Claude Server: http://localhost:3001"
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### 8.2 Le bridge HTTP port 3001
|
|
348
|
+
|
|
349
|
+
Le bot Discord fait `POST localhost:3001/send` au bridge, qui forward
|
|
350
|
+
vers `mcp__overmind__run_agent` (port 3099). Le bridge est inclus dans
|
|
351
|
+
`discord_llm/src/overmind-bridge.ts` et est démarré automatiquement par
|
|
352
|
+
`npm start`.
|
|
353
|
+
|
|
354
|
+
### 8.3 Tester end-to-end
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
!sniper ping
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
Le bot Discord :
|
|
361
|
+
1. Reçoit le message dans le channel VIBE DEV
|
|
362
|
+
2. POST `/send` au bridge (port 3001)
|
|
363
|
+
3. Bridge → MCP Overmind (port 3099) → run_agent(agentName="sniperbot_analyst", runner="hermes", prompt="ping")
|
|
364
|
+
4. Runner Overmind → spawn `hermes chat -q "ping" --model MiniMax-M3 --provider minimax-cn --yolo`
|
|
365
|
+
5. Hermes upstream → POST api.minimaxi.com/anthropic/v1/messages
|
|
366
|
+
6. Réponse "OK" → MCP → bridge → bot Discord → message sur VIBE DEV
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 9. Update / maintenance (le cas Linux)
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# 9.1 Update Overmind MCP
|
|
375
|
+
sudo npm update -g overmind-mcp
|
|
376
|
+
overmind-mcp --version # doit afficher la nouvelle version
|
|
377
|
+
|
|
378
|
+
# 9.2 Update Hermes
|
|
379
|
+
pip install --upgrade hermes-agent
|
|
380
|
+
hermes --version
|
|
381
|
+
|
|
382
|
+
# 9.3 Restart les services (l'ordre compte)
|
|
383
|
+
# 1. Postgres (toujours en premier)
|
|
384
|
+
docker restart overmind-postgres
|
|
385
|
+
|
|
386
|
+
# 2. MCP servers tiers (discord, x, voipms)
|
|
387
|
+
docker restart discord-mcp # ou systemctl restart discord-mcp
|
|
388
|
+
docker restart x-mcp
|
|
389
|
+
docker restart voipms-mcp
|
|
390
|
+
|
|
391
|
+
# 3. Overmind MCP server
|
|
392
|
+
pkill -f "overmind-mcp start"
|
|
393
|
+
overmind-mcp start --port 3099 &
|
|
394
|
+
|
|
395
|
+
# 4. Discord bot + bridge
|
|
396
|
+
pkill -f "discord_llm"
|
|
397
|
+
cd ~/discord_llm && npm start &
|
|
398
|
+
|
|
399
|
+
# 9.4 Vérifier que tout marche
|
|
400
|
+
curl http://localhost:3099/mcp # doit retourner 200
|
|
401
|
+
curl http://localhost:3141/mcp # MCP Discord
|
|
402
|
+
curl http://localhost:3001/status # bridge
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## 10. Debug checklist (quand ça marche pas)
|
|
408
|
+
|
|
409
|
+
| Symptôme | Cause probable | Fix |
|
|
410
|
+
|---|---|---|
|
|
411
|
+
| `HTTP 401: Missing Authentication header` | Token pas passé à Hermes | Vérifier `$ANTHROPIC_AUTH_TOKEN_1` est résolu, `MINIMAX_CN_API_KEY` est seedé dans le canonique |
|
|
412
|
+
| `HTTP 401: invalid api key` | Mauvais endpoint | Vérifier `api.minimaxi.com` (CN avec `i`) vs `api.minimax.io` (GLOBAL) |
|
|
413
|
+
| `HTTP 402: insufficient balance` | Token sans budget | Changer `$ANTHROPIC_AUTH_TOKEN_1` → `_2` ou `_7` |
|
|
414
|
+
| `Warning: Unknown toolsets` | Noms de toolsets mismatch `.mcp.json` vs `config.yaml` | Standardiser les noms (kebab-case) |
|
|
415
|
+
| Sniperbot dit "j'ai pas de MCP" mais log montre 69 tools registered | SOUL.md désaligné | Réécrire le SOUL.md pour lister les vrais tools |
|
|
416
|
+
| "Provider: openrouter" au lieu de "minimax-cn" | `--provider` flag pas passé | Vérifier que le runner a `--provider` dans cleanArgs |
|
|
417
|
+
| `EXIT_CODE_1` sur le bridge | MCP server tourne l'ancien build | `pkill -f overmind-mcp && overmind-mcp start &` |
|
|
418
|
+
| "Erreur inconnue" générique | Stale state dans `.overmind/hermes/agents/<name>/.hermes/` | Migrer vers `agents/<name>/` (le helper `getAgentHermesHome` 2.8.30 le fait auto) |
|
|
419
|
+
| `cleanupTempFiles` efface le settings.json canonique | settings.json pushé dans `tempFiles` | Bug fixé en 2.8.32 — ne pas push |
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## 11. Le pipeline complet (visualisation)
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
[Discord] "!sniper ping"
|
|
427
|
+
↓
|
|
428
|
+
[discord_llm bot Node.js] (port N/A, websocket Discord)
|
|
429
|
+
↓ POST /send
|
|
430
|
+
[discord_llm bridge HTTP] (port 3001, Express)
|
|
431
|
+
↓ JSON-RPC 2.0
|
|
432
|
+
[Overmind MCP server] (port 3099)
|
|
433
|
+
↓ run_agent()
|
|
434
|
+
[NousHermesRunner.runAgentInternal()]
|
|
435
|
+
├─ Lit .claude/settings_sniperbot_analyst.json (COUCHE 1, source)
|
|
436
|
+
├─ Interpol $VAR depuis .env
|
|
437
|
+
├─ Subtilisation 2.8.34 (sk-cp + minimaxi → MINIMAX_CN_API_KEY)
|
|
438
|
+
├─ Écrit .overmind/hermes/agents/sniperbot_analyst/settings.json (COUCHE 2)
|
|
439
|
+
├─ Bootstrap config.yaml (COUCHE 3) si manquant
|
|
440
|
+
└─ Spawn `hermes chat -q ... --model MiniMax-M3 --provider minimax-cn --yolo`
|
|
441
|
+
avec HERMES_HOME=<workspace>/.overmind/hermes/
|
|
442
|
+
(et si enableAllProjectMcpServers=true, --toolsets avec les noms de config.yaml)
|
|
443
|
+
↓
|
|
444
|
+
[Hermes upstream] (subprocess)
|
|
445
|
+
├─ Lit agents/sniperbot_analyst/settings.json
|
|
446
|
+
├─ Lit agents/sniperbot_analyst/SOUL.md
|
|
447
|
+
├─ Charge les MCP servers de config.yaml:mcp_servers:
|
|
448
|
+
└─ Construit un client Anthropic
|
|
449
|
+
↓
|
|
450
|
+
[api.minimaxi.com/anthropic] (endpoint MiniMax CN)
|
|
451
|
+
POST /v1/messages { model: "MiniMax-M3", ... }
|
|
452
|
+
↓
|
|
453
|
+
[Réponse du modèle] → Hermes → MCP → bridge → bot Discord → message sur VIBE DEV
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## 12. Cas particuliers & FAQ
|
|
459
|
+
|
|
460
|
+
### Q: Pourquoi 3 couches de config et pas juste 1 ?
|
|
461
|
+
|
|
462
|
+
**R:** Polyglot par design. Overmind = orchestrateur multi-runner (4 runners),
|
|
463
|
+
donc il parle 4 formats. Si on n'avait qu'Overmind+Hermes, on pourrait tout
|
|
464
|
+
mettre dans le canonique. Mais comme on supporte aussi ClaudeRunner/KiloRunner/
|
|
465
|
+
OpenClawRunner qui ont leurs propres formats, le source unifié (COUCHE 1) est
|
|
466
|
+
plus simple à maintenir.
|
|
467
|
+
|
|
468
|
+
### Q: Pourquoi mon agent dit "j'ai pas de MCP" alors qu'il les a ?
|
|
469
|
+
|
|
470
|
+
**R:** Biais de prompting. Le SOUL.md est trop prescriptif (il dit "j'utilise
|
|
471
|
+
toujours Discord" au lieu de lister factuellement les tools). Solution :
|
|
472
|
+
réécrire le SOUL.md pour être un inventaire factuel.
|
|
473
|
+
|
|
474
|
+
### Q: Le runner peut-il fonctionner sans Discord ?
|
|
475
|
+
|
|
476
|
+
**R:** Oui. Le runner est 100% agnostique du canal de sortie. Tu peux
|
|
477
|
+
invoquer un agent via `mcp__overmind__run_agent` directement (sans Discord),
|
|
478
|
+
via Discord (via le bot + bridge), via cron job, via webhook, etc. La
|
|
479
|
+
sortie revient au caller.
|
|
480
|
+
|
|
481
|
+
### Q: Comment ajouter un nouveau provider LLM (e.g. Mistral) ?
|
|
482
|
+
|
|
483
|
+
**R:** 4 étapes :
|
|
484
|
+
1. Ajouter le détecteur de token dans `src/services/NousHermesRunner.ts`
|
|
485
|
+
(voir section "Subtilisation" 4.3)
|
|
486
|
+
2. Ajouter le case dans `src/tools/config_example.ts`
|
|
487
|
+
3. Ajouter le profile dans `~/.hermes/config.yaml` (section `providers:`)
|
|
488
|
+
4. Documenter dans `docs/provider-config-map.md`
|
|
489
|
+
|
|
490
|
+
### Q: Différence entre `enableAllProjectMcpServers: true` et `enabledMcpjsonServers: [...]` ?
|
|
491
|
+
|
|
492
|
+
**R:**
|
|
493
|
+
- `enableAllProjectMcpServers: true` = charger tous les serveurs du `.mcp.json` (Overmind registry)
|
|
494
|
+
- `enabledMcpjsonServers: [...]` = charger SEULEMENT les serveurs listés (filtre)
|
|
495
|
+
- Si les deux sont set, le filtre gagne (`enabledMcpjsonServers` est plus spécifique)
|
|
496
|
+
- Si les deux sont vides/absents, AUCUN MCP n'est chargé (l'agent a juste les tools Hermes natifs)
|
|
497
|
+
|
|
498
|
+
### Q: Comment tester sans payer ?
|
|
499
|
+
|
|
500
|
+
**R:** 3 options :
|
|
501
|
+
1. **Anthropic officiel** : `claude-sonnet-4-6` via ton compte (5$ gratuits au start)
|
|
502
|
+
2. **OpenRouter** (embeddings only par convention user) — ne PAS utiliser pour LLM
|
|
503
|
+
3. **Z.AI GLM** : modèles `glm-4.5-air` gratuits en bêta
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
## 13. TL;DR (le strict minimum)
|
|
508
|
+
|
|
509
|
+
```bash
|
|
510
|
+
# 1. Install
|
|
511
|
+
sudo npm i -g overmind-mcp
|
|
512
|
+
pip install hermes-agent
|
|
513
|
+
|
|
514
|
+
# 2. Workspace
|
|
515
|
+
mkdir ~/overmind-workflow && cd ~/overmind-workflow
|
|
516
|
+
echo 'ANTHROPIC_AUTH_TOKEN_1=sk-cp-***' > .env
|
|
517
|
+
echo 'OVERMIND_MINIMAX_DEFAULT=cn' >> .env
|
|
518
|
+
|
|
519
|
+
# 3. Source agent
|
|
520
|
+
mkdir -p .claude .mcp.json
|
|
521
|
+
cat > .claude/settings_sniper.json <<EOF
|
|
522
|
+
{
|
|
523
|
+
"env": {
|
|
524
|
+
"ANTHROPIC_AUTH_TOKEN": "\$ANTHROPIC_AUTH_TOKEN_1",
|
|
525
|
+
"ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
|
526
|
+
"ANTHROPIC_MODEL": "MiniMax-M3",
|
|
527
|
+
"ANTHROPIC_PROVIDER": "minimax-cn"
|
|
528
|
+
},
|
|
529
|
+
"enableAllProjectMcpServers": true,
|
|
530
|
+
"agent": "sniper", "runner": "hermes"
|
|
531
|
+
}
|
|
532
|
+
EOF
|
|
533
|
+
|
|
534
|
+
# 4. MCP servers
|
|
535
|
+
cat > .mcp.json <<EOF
|
|
536
|
+
{"mcpServers":{"memory-server":{"type":"http","url":"http://localhost:3099/mcp"}}}
|
|
537
|
+
EOF
|
|
538
|
+
|
|
539
|
+
# 5. Start
|
|
540
|
+
overmind-mcp start --port 3099 &
|
|
541
|
+
|
|
542
|
+
# 6. Test
|
|
543
|
+
mcp-client call overmind-mcp run_agent \
|
|
544
|
+
--agentName sniper --runner hermes --prompt "ping"
|
|
545
|
+
# → "OK"
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
C'est tout. Le reste (canonique, config.yaml, SOUL.md, Discord bridge) est
|
|
549
|
+
auto-généré par le runner. Si tu as besoin de Discord, ajoute discord_llm
|
|
550
|
+
(§8).
|
|
551
|
+
|
|
552
|
+
---
|
|
553
|
+
|
|
554
|
+
## 14. Versions & changelog
|
|
555
|
+
|
|
556
|
+
| Version | Date | Fix majeur |
|
|
557
|
+
|---|---|---|
|
|
558
|
+
| 2.8.28 | 2026-06 | Premier fix 401 — interpolation $VAR cassée |
|
|
559
|
+
| 2.8.29 | 2026-06 | Settings canonique prime sur .hermes/.env stale |
|
|
560
|
+
| 2.8.30 | 2026-06 | Refactor format canonique Hermes (appdirs style) |
|
|
561
|
+
| 2.8.32 | 2026-06 | Subtilisation : auto-seed MINIMAX_CN_API_KEY |
|
|
562
|
+
| 2.8.33 | 2026-06 | Subtilisation : auto-seed MINIMAX_CN_BASE_URL |
|
|
563
|
+
| 2.8.34 | 2026-06 | Re-add `--provider` flag (bypass auto-router bug) |
|
|
564
|
+
| 2.8.36 | 2026-06 | `--toolsets` flag passé au CLI |
|
|
565
|
+
| 2.8.37 | 2026-06 | Bootstrap config.yaml dans HERMES_HOME partagé |
|
|
566
|
+
| 2.8.38 | 2026-06 | SOUL.md sniperbot aligné (envoyer_message → gestion_messages) |
|
|
567
|
+
| 2.8.39 | 2026-06 | Toolsets lus depuis config.yaml (pas .mcp.json) |
|
|
568
|
+
| 2.8.40 | 2026-06 | SOUL.md full rewrite avec inventaire 17 tools |
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## 15. Crédits & références
|
|
573
|
+
|
|
574
|
+
- **Overmind MCP** : https://github.com/your-org/overmind-mcp
|
|
575
|
+
- **Hermes Agent** : https://hermes-agent.nousresearch.com/docs
|
|
576
|
+
- **MiniMax API** : https://api.minimaxi.com (CN) / https://api.minimax.io (GLOBAL)
|
|
577
|
+
- **MCP Discord server** : https://github.com/your-org/discord-mcp-server (v2.1.3)
|
|
578
|
+
- **discord_llm** : https://github.com/your-org/discord_llm
|
|
579
|
+
- **Exemple vivant** : sniperbot_analyst sur VIBE DEV (serveur Discord 804393160092024832)
|
|
580
|
+
- **CHANGELOG** : voir `Workflow/CHANGELOG.md` pour l'historique complet
|
|
581
|
+
- **SUBTILISATION** : voir `C:\Users\Deamon\Desktop\SUBTILISATION_EXPLAINED.txt` (doc originale)
|
|
582
|
+
- **Flow diagram** : voir `Workflow/docs/OVERMIND_HERMES_SNIPERBOT_FLOW.md`
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
**Auteur :** Nicolas (chef d'équipe Bon-air, compagnon charpentier-menuisier)
|
|
587
|
+
**Mainteneur :** toi + tes agents Hermes (autrement dit, ce guide est vivant)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overmind-mcp",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.43",
|
|
4
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.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/dist/bin/launch.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
// launch.js — compiled launcher for Workflow
|
|
2
|
-
// Prebuild copies this to dist/bin/launch.js
|
|
3
|
-
|
|
4
|
-
const { exec, spawn } = require("child_process");
|
|
5
|
-
const fs = require("fs");
|
|
6
|
-
const path = require("path");
|
|
7
|
-
|
|
8
|
-
const SCRIPT_DIR = path.resolve(__dirname, "..");
|
|
9
|
-
const LOG_DIR = path.join(SCRIPT_DIR, "logs");
|
|
10
|
-
const PORT = "3099";
|
|
11
|
-
const NAME = "Workflow";
|
|
12
|
-
const BUILD_CMD = "npm run build";
|
|
13
|
-
|
|
14
|
-
function log(msg) {
|
|
15
|
-
console.log(`[{new Date().toISOString()}] [{NAME}] ${msg}`);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function ensureDir(dir) {
|
|
19
|
-
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function killPort(port) {
|
|
23
|
-
return new Promise((resolve) => {
|
|
24
|
-
const cmd = `powershell -c "Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Format-Table -HideTableHeaders -Property OwningProcess | ForEach-Object {$_.Trim()} | Where-Object {$_}"`;
|
|
25
|
-
exec(cmd, { cwd: SCRIPT_DIR }, (err, stdout) => {
|
|
26
|
-
const pids = (stdout || "").trim().split("\n").map((p) => p.trim()).filter(Boolean);
|
|
27
|
-
if (pids.length === 0) { log(`Port ${port} — no process`); resolve(); return; }
|
|
28
|
-
for (const pid of pids) {
|
|
29
|
-
log(`Port ${port} PID ${pid} killed`);
|
|
30
|
-
exec(`taskkill /F /PID ${pid}`, () => {});
|
|
31
|
-
}
|
|
32
|
-
setTimeout(resolve, 500);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function build() {
|
|
38
|
-
return new Promise((resolve) => {
|
|
39
|
-
log("[BUILD] Starting...");
|
|
40
|
-
exec(BUILD_CMD, { cwd: SCRIPT_DIR }, (err) => {
|
|
41
|
-
if (err && !fs.existsSync(path.join(SCRIPT_DIR, "dist"))) {
|
|
42
|
-
log("[FAIL] Build failed — no dist");
|
|
43
|
-
resolve(false);
|
|
44
|
-
} else {
|
|
45
|
-
log("[OK] Build complete");
|
|
46
|
-
resolve(true);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function launch() {
|
|
53
|
-
const logFile = path.join(LOG_DIR, `${NAME}.log`);
|
|
54
|
-
const errFile = path.join(LOG_DIR, `${NAME}.err.log`);
|
|
55
|
-
const out = fs.openSync(logFile, "a");
|
|
56
|
-
const err = fs.openSync(errFile, "a");
|
|
57
|
-
const env = { ...process.env, ...{} };
|
|
58
|
-
const child = spawn("node", ['--max-old-space-size=256', '--no-warnings', '--env-file=.env', 'dist/bin/cli.js', '--transport', 'httpStream', '--port', '3099'], {
|
|
59
|
-
cwd: SCRIPT_DIR,
|
|
60
|
-
detached: true,
|
|
61
|
-
stdio: ["ignore", out, err],
|
|
62
|
-
env,
|
|
63
|
-
});
|
|
64
|
-
child.unref();
|
|
65
|
-
log(`[SPAWN] PID=${child.pid}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function main() {
|
|
69
|
-
log("[START] Launching...");
|
|
70
|
-
ensureDir(LOG_DIR);
|
|
71
|
-
await killPort(PORT);
|
|
72
|
-
const ok = await build();
|
|
73
|
-
if (!ok) { console.error("[ABORT] Build failed"); process.exit(1); }
|
|
74
|
-
launch();
|
|
75
|
-
log("[DONE] Server launched. Check ${LOG_DIR}/${NAME}.log");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
main().catch(console.error);
|