overmind-mcp 2.8.21 → 2.8.22
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/dist/bridge/OverBridgeServer.d.ts +1 -0
- package/dist/bridge/OverBridgeServer.d.ts.map +1 -1
- package/dist/bridge/OverBridgeServer.js +35 -5
- package/dist/bridge/OverBridgeServer.js.map +1 -1
- package/dist/bridge/OverBridgeService.d.ts.map +1 -1
- package/dist/bridge/OverBridgeService.js +4 -0
- package/dist/bridge/OverBridgeService.js.map +1 -1
- package/docs/PLAN_REFACTORING_OVERMIND_V2.md +414 -0
- package/docs/PLAN_REFACTOR_OVERMIND_AGI.md +606 -0
- package/docs/doc_guide_agent_hermes_permanent.md +315 -0
- package/docs/doc_hermes_gateway.md +775 -0
- package/docs/guide_agent_hermes_overmind.md +403 -0
- package/docs/plan_securit/303/251.md +351 -0
- package/package.json +1 -1
- package/scripts/bridge-smoke-test.sh +231 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# 🤖 Guide : Créer un Agent Hermes Permanent avec Overmind
|
|
2
|
+
|
|
3
|
+
> **Pour les débutants** — De zéro à un agent autonome fonctionnel, step by step.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📖 Table des Matières
|
|
8
|
+
|
|
9
|
+
1. [Concepts de Base](#-concepts-de-base)
|
|
10
|
+
2. [Architecture 2 Couches](#-architecture-2-couches)
|
|
11
|
+
3. [Hermes Gateway vs Overmind](#-hermes-gateway-vs-overmind)
|
|
12
|
+
4. [Bridge SDK — Wrappers TypeScript](#-bridge-sdk--wrappers-typescript)
|
|
13
|
+
5. [Architecture Dossier Agent](#-architecture-dossier-agent)
|
|
14
|
+
6. [Les 4 Fichiers Cruciaux](#-les-4-fichiers-cruciaux)
|
|
15
|
+
7. [Créer un Agent — Tutorial Complet](#-créer-un-agent--tutorial-complet)
|
|
16
|
+
8. [Configuration Avancée](#-configuration-avancée)
|
|
17
|
+
9. [Skills — Compétences Hermes](#-skills--compétences-hermes)
|
|
18
|
+
10. [MCP Servers — Outils](#-mcp-servers--outils)
|
|
19
|
+
11. [Mémoire — 3 Couches](#-mémoire--3-couches)
|
|
20
|
+
12. [Cron — Agent vs Persistant](#-cron--agent-vs-persistant)
|
|
21
|
+
13. [Workflow Type](#-workflow-type)
|
|
22
|
+
14. [Troubleshooting](#-troubleshooting)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 🧠 Concepts de Base
|
|
27
|
+
|
|
28
|
+
### Qu'est-ce qu'un Agent Hermes ?
|
|
29
|
+
|
|
30
|
+
Un **agent Hermes** est une instance isolée d'IA avec :
|
|
31
|
+
- Son propre **system prompt** (SOUL.md)
|
|
32
|
+
- Ses propres **clés API** (.env)
|
|
33
|
+
- Ses propres **skills** (compétences)
|
|
34
|
+
- Sa propre **mémoire locale** (state.db + MEMORY.md)
|
|
35
|
+
- Sa propre **configuration** (modèle, MCP, TTS)
|
|
36
|
+
|
|
37
|
+
### Qu'est-ce qu'Overmind ?
|
|
38
|
+
|
|
39
|
+
**Overmind** est l'**encapsuleur** qui gère plusieurs agents :
|
|
40
|
+
- **CRUD agents** (create, config, delete)
|
|
41
|
+
- **Orchestration** (run_agent, run_agents_parallel)
|
|
42
|
+
- **Mémoire locale/agent** (memory_store, memory_search — DB propre par agent)
|
|
43
|
+
- **Mémoire partagée** (cross-agents, transmission inter-agents)
|
|
44
|
+
- **Cron persistant** (survit aux redémarrages)
|
|
45
|
+
- **Agent Control** (status, stream, kill, wait)
|
|
46
|
+
- **Bridge SDK** (wrappers TypeScript)
|
|
47
|
+
|
|
48
|
+
### Qu'est-ce que le Bridge ?
|
|
49
|
+
|
|
50
|
+
Le **Bridge** (`bridge/`) est un SDK TypeScript qui wrappe les appels Overmind MCP. Il permet de piloter les agents depuis une app externe (Discord bot, API REST, CLI).
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 📐 Architecture 2 Couches
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
┌──────────────────────────────────────────────────┐
|
|
58
|
+
│ OVERMIND │
|
|
59
|
+
│ L'Encapsuleur / Orchestrator │
|
|
60
|
+
│ │
|
|
61
|
+
│ CRUD agents • Orchestration • Mémoire partagée │
|
|
62
|
+
│ Mémoire locale/agent • Cron PERSISTANT • Bridge │
|
|
63
|
+
│ │
|
|
64
|
+
│ ┌────────────────────────────────────────────┐ │
|
|
65
|
+
│ │ HERMES GATEWAY │ │
|
|
66
|
+
│ │ Le Runtime Agent │ │
|
|
67
|
+
│ │ │ │
|
|
68
|
+
│ │ SOUL.md • Skills • TTS • MCP Client │ │
|
|
69
|
+
│ │ Mémoire locale • Sessions • Cron agent │ │
|
|
70
|
+
│ └────────────────────────────────────────────┘ │
|
|
71
|
+
└──────────────────────────────────────────────────┘
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Point clé** : Overmind encapsule Hermes. Ce sont 2 couches distinctes.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 🔀 Hermes Gateway vs Overmind
|
|
79
|
+
|
|
80
|
+
| Fonctionnalité | Hermes Gateway | Overmind |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| **Persona (SOUL.md)** | ✅ Gère et exécute | — |
|
|
83
|
+
| **Skills** | ✅ Charge et injecte | — |
|
|
84
|
+
| **TTS** | ✅ Exécute la synthèse | — |
|
|
85
|
+
| **MCP Client** | ✅ Se connecte aux serveurs | — |
|
|
86
|
+
| **Mémoire fichiers plats** | ✅ MEMORY.md, USER.md, state.db | — |
|
|
87
|
+
| **Mémoire locale DB** | — | ✅ memory_store/search (DB propre/agent) |
|
|
88
|
+
| **Mémoire partagée** | — | ✅ Cross-agents, include_runs |
|
|
89
|
+
| **Session** | ✅ SQLite par agent | — |
|
|
90
|
+
| **Cron agent-level** | ✅ Session fraîche chaque tick | — |
|
|
91
|
+
| **Terminal/Fichiers** | ✅ Outils d'exécution | — |
|
|
92
|
+
| **Agent CRUD** | — | ✅ create, config, delete |
|
|
93
|
+
| **Orchestration** | — | ✅ run_agent, run_agents_parallel |
|
|
94
|
+
| **Cron PERSISTANT** | — | ✅ Survit aux redémarrages |
|
|
95
|
+
| **Agent Control** | — | ✅ status, stream, kill, wait |
|
|
96
|
+
| **Bridge SDK** | — | ✅ Wrappers TypeScript |
|
|
97
|
+
| **Registre agents** | — | ✅ .overmind/hermes/ |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 🔗 Bridge SDK — Wrappers TypeScript
|
|
102
|
+
|
|
103
|
+
### Architecture en 3 Couches
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
App → OverBridgeService → BridgeProxy → Overmind MCP → Hermes Gateway
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Les 5 Fichiers
|
|
110
|
+
|
|
111
|
+
| Fichier | Rôle | Lignes |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `types.ts` | Contrats : `McpResponse`, `AgentResult`, `BridgeConfig`, `SessionState` | ~150 |
|
|
114
|
+
| `utils.ts` | Logger, SSE parsing, retry, validation, formatage Discord | ~170 |
|
|
115
|
+
| `BridgeProxy.ts` | Transport JSON-RPC 2.0 : circuit breaker, 3 couches timeout | ~285 |
|
|
116
|
+
| `OverBridgeService.ts` | API Overmind : `runAgent()`, `memorySearch()`, `runParallel()` | ~284 |
|
|
117
|
+
| `index.ts` | Barrel export | ~46 |
|
|
118
|
+
|
|
119
|
+
### Ce que le Bridge Wrappe (Overmind uniquement)
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// Orchestration (Overmind → lance Hermes)
|
|
123
|
+
bridge.runAgent('agent', 'hermes', 'prompt')
|
|
124
|
+
bridge.runAgentForDiscord('agent', 'hermes', msg, ctx)
|
|
125
|
+
bridge.runParallel([...agents])
|
|
126
|
+
|
|
127
|
+
// Mémoire partagée (Overmind)
|
|
128
|
+
bridge.memorySearch({ query: 'trading' })
|
|
129
|
+
bridge.memoryStore({ text: 'Décision...', source: 'decision' })
|
|
130
|
+
|
|
131
|
+
// Agent CRUD (Overmind)
|
|
132
|
+
bridge.listAgents()
|
|
133
|
+
bridge.createAgent('nom', 'hermes', 'prompt')
|
|
134
|
+
|
|
135
|
+
// Agent Control (Overmind)
|
|
136
|
+
bridge.agentControl({ agentName: 'x', action: 'status' })
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Circuit Breaker + Session Persistante
|
|
140
|
+
|
|
141
|
+
- **Circuit Breaker** : Closed → Open (5 échecs) → Half-Open → Closed (3 succès)
|
|
142
|
+
- **Session** : auto-persistée dans `SessionState`, `autoResume: true`
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 📁 Architecture Dossier Agent
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
.overmind/hermes/<agent_name>/
|
|
150
|
+
│
|
|
151
|
+
├── .hermes/ ← HERMES GATEWAY (runtime agent)
|
|
152
|
+
│ ├── SOUL.md ← Persona
|
|
153
|
+
│ ├── config.yaml ← Modèle + MCP + TTS
|
|
154
|
+
│ ├── .env ← Clés API
|
|
155
|
+
│ ├── state.db ← Mémoire locale SQLite
|
|
156
|
+
│ ├── skills/ ← Compétences Hermes
|
|
157
|
+
│ ├── sessions/ ← Historique sessions
|
|
158
|
+
│ ├── memories/ ← MEMORY.md + USER.md
|
|
159
|
+
│ ├── cron/ ← Cron agent-level Hermes
|
|
160
|
+
│ ├── logs/ ← Logs
|
|
161
|
+
│ └── audio_cache/ ← TTS
|
|
162
|
+
│
|
|
163
|
+
└── (fichiers de travail)
|
|
164
|
+
|
|
165
|
+
.overmind/agents/ ← REGISTRE OVERMIND
|
|
166
|
+
bridge/ ← SDK OVERMIND (wrappers TypeScript)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 📄 Les 4 Fichiers Cruciaux (Hermes Gateway)
|
|
172
|
+
|
|
173
|
+
### 1. `SOUL.md` — Le Cerveau
|
|
174
|
+
System prompt. Définit personnalité, règles, comportements.
|
|
175
|
+
|
|
176
|
+
### 2. `config.yaml` — Configuration Runtime
|
|
177
|
+
Modèle, MCP servers, TTS. Géré par Hermes, configuré via Overmind.
|
|
178
|
+
|
|
179
|
+
### 3. `.env` — Les Secrets
|
|
180
|
+
Clés API. **JAMAIS de commit Git.**
|
|
181
|
+
|
|
182
|
+
### 4. `state.db` — Mémoire SQLite
|
|
183
|
+
Historique conversations, sessions, cache. **Géré automatiquement par Hermes.**
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 🚀 Créer un Agent — Tutorial
|
|
188
|
+
|
|
189
|
+
### Via Overmind MCP
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# 1. Créer (OVERMIND)
|
|
193
|
+
create_agent(name: "mon_agent", runner: "hermes", prompt: "Tu es...")
|
|
194
|
+
|
|
195
|
+
# 2. Configurer (OVERMIND)
|
|
196
|
+
update_agent_config(name: "mon_agent", model: "glm-5.1",
|
|
197
|
+
mcpServers: ["memory-server", "discord-server"])
|
|
198
|
+
|
|
199
|
+
# 3. Clés (OVERMIND)
|
|
200
|
+
update_agent_config(name: "mon_agent", env: { "OPENAI_API_KEY": "sk-..." })
|
|
201
|
+
|
|
202
|
+
# 4. Lancer (OVERMIND orchestre, HERMES exécute)
|
|
203
|
+
run_agent(runner: "hermes", agentName: "mon_agent", prompt: "Analyse...")
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Via Bridge SDK
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
import { OverBridgeService } from './bridge/index.js';
|
|
210
|
+
const bridge = new OverBridgeService({ mcpUrl: 'http://localhost:3099/mcp' });
|
|
211
|
+
|
|
212
|
+
const result = await bridge.runAgent('mon_agent', 'hermes', 'Mon prompt');
|
|
213
|
+
const results = await bridge.runParallel([...]);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## ⚙️ Configuration Avancée (Hermes Gateway)
|
|
219
|
+
|
|
220
|
+
### Multi-Modèles
|
|
221
|
+
```bash
|
|
222
|
+
run_agent(runner: "hermes", agentName: "x", model: "claude-sonnet-4", prompt: "...")
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### TTS
|
|
226
|
+
```yaml
|
|
227
|
+
tts:
|
|
228
|
+
provider: elevenlabs
|
|
229
|
+
voice: charlie
|
|
230
|
+
voice_id: IKne3meq5aSn9XLyUdCD
|
|
231
|
+
model: eleven_multilingual_v2
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 🎯 Skills — Compétences Hermes
|
|
237
|
+
|
|
238
|
+
Skills = fichiers `SKILL.md` chargés par Hermes Gateway.
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
skills/
|
|
242
|
+
└── catégorie/
|
|
243
|
+
└── skill/
|
|
244
|
+
├── SKILL.md
|
|
245
|
+
├── references/
|
|
246
|
+
├── scripts/
|
|
247
|
+
└── templates/
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
~100+ built-in : `autonomous-ai-agents`, `creative`, `github`, `research`, `devops`...
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
skill_manage(action: "create", name: "mon-skill", content: "...")
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 🔌 MCP Servers — Outils des Agents
|
|
259
|
+
|
|
260
|
+
| Serveur | Port | Fonction |
|
|
261
|
+
|---|---|---|
|
|
262
|
+
| `memory-server` | 3099 | Mémoire locale/agent + partagée Overmind + CRUD agents |
|
|
263
|
+
| `discord-server` | 3141 | Messages, embeds, fichiers Discord |
|
|
264
|
+
| `x-mcp-server` | 3142 | Scraping Twitter/X |
|
|
265
|
+
| `postgresql-server` | 5433 | SQL + Vector search |
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 🧠 Mémoire — 3 Couches
|
|
270
|
+
|
|
271
|
+
### 1. Mémoire Hermes Gateway (fichiers plats, par agent)
|
|
272
|
+
|
|
273
|
+
Injectée dans le prompt à chaque tour. Gérée par l'agent lui-même via `memory()`.
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
memory(action: "add", target: "memory", content: "Préfère réponses courtes")
|
|
277
|
+
memory(action: "replace", target: "user", old_text: "old", content: "new")
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
| Fichier | Rôle | Portée |
|
|
281
|
+
|---|---|---|
|
|
282
|
+
| `MEMORY.md` | Notes personnelles de l'agent | 1 agent |
|
|
283
|
+
| `USER.md` | Profil et préférences utilisateur | 1 agent |
|
|
284
|
+
| `state.db` | SQLite (sessions, cache) | 1 agent |
|
|
285
|
+
|
|
286
|
+
### 2. Mémoire Overmind Locale (DB propre par agent)
|
|
287
|
+
|
|
288
|
+
**Chaque agent a sa PROPRE base de données Overmind** — isolation complète.
|
|
289
|
+
Les `memory_store` et `memory_search` sont **locale à l'agent** par défaut.
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
# Stockage dans la DB locale de l'agent
|
|
293
|
+
memory_store(text: "Décision : BlockChat v0.2", source: "decision")
|
|
294
|
+
memory_search(query: "BlockChat protocol")
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
- Chaque agent = sa propre DB vectorielle
|
|
298
|
+
- Recherche sémantique dans les connaissances de l'agent
|
|
299
|
+
- Types : `user`, `agent`, `pattern`, `error`, `decision`
|
|
300
|
+
|
|
301
|
+
### 3. Mémoire Overmind Partagée (cross-agents)
|
|
302
|
+
|
|
303
|
+
En plus de sa DB locale, un agent peut accéder à une mémoire **commune** partagée entre tous les agents.
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# Accès mémoire partagée (cross-agents)
|
|
307
|
+
memory_search(query: "trading strategy", include_runs: true)
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
- Partagée entre tous les agents de la flotte
|
|
311
|
+
- Inclut l'historique des runs (`include_runs: true`)
|
|
312
|
+
- Permet la transmission de connaissances inter-agents
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## ⏰ Cron — Agent vs Persistant
|
|
317
|
+
|
|
318
|
+
### Cron Hermes Gateway (agent-level)
|
|
319
|
+
- Session **fraîche** à chaque tick
|
|
320
|
+
- Même profil, même MCP, pas de contamination
|
|
321
|
+
- Lié au cycle de vie de l'agent
|
|
322
|
+
- Config via `cronjob()` dans l'agent
|
|
323
|
+
|
|
324
|
+
### Cron Overmind (PERSISTANT)
|
|
325
|
+
- Géré au niveau de l'**encapsuleur**
|
|
326
|
+
- **Survit aux redémarrages** de l'agent ET du gateway
|
|
327
|
+
- Stocké dans le registre Overmind
|
|
328
|
+
- Indépendant du cycle de vie Hermes
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
# Cron Hermes (agent-level)
|
|
332
|
+
cronjob(action: "create", name: "analyse", schedule: "0 9 * * *",
|
|
333
|
+
prompt: "Analyse crypto...")
|
|
334
|
+
|
|
335
|
+
# Cron Overmind (persistant)
|
|
336
|
+
# → Configuré via Bridge SDK ou API Overmind
|
|
337
|
+
# → Survit aux redémarrages
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## 🔄 Workflow Type
|
|
343
|
+
|
|
344
|
+
### Mono-Agent
|
|
345
|
+
```
|
|
346
|
+
create_agent (OVERMIND) → config (OVERMIND) → run_agent (OVERMIND → HERMES)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Multi-Agents
|
|
350
|
+
```
|
|
351
|
+
Orchestrateur (OVERMIND)
|
|
352
|
+
├─► run_agents_parallel([agent1, agent2, agent3])
|
|
353
|
+
└─► Consolidate → Discord
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Via Bridge
|
|
357
|
+
```
|
|
358
|
+
App → OverBridgeService → BridgeProxy → Overmind MCP → Hermes Gateway
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## 🔧 Troubleshooting
|
|
364
|
+
|
|
365
|
+
### L'agent ne démarre pas
|
|
366
|
+
- Vérifier `SOUL.md` non vide (Hermes)
|
|
367
|
+
- Vérifier `config.yaml` valide (Hermes)
|
|
368
|
+
- Checker `logs/errors.log` (Hermes)
|
|
369
|
+
|
|
370
|
+
### MCP Server non connecté
|
|
371
|
+
- Vérifier le port dans `config.yaml` (Hermes)
|
|
372
|
+
- Tester `curl http://localhost:PORT/mcp`
|
|
373
|
+
|
|
374
|
+
### Bridge — Circuit breaker ouvert
|
|
375
|
+
- 5 échecs → circuit open
|
|
376
|
+
- Attendre 30s ou `bridge.healthCheck()`
|
|
377
|
+
|
|
378
|
+
### Cron perdu après redémarrage
|
|
379
|
+
- Cron Hermes = par session (pas persistant)
|
|
380
|
+
- Cron Overmind = persistant (survit)
|
|
381
|
+
- Vérifier quel niveau de cron est utilisé
|
|
382
|
+
|
|
383
|
+
### Mémoire pleine
|
|
384
|
+
- `MEMORY.md` / `USER.md` ont des limites
|
|
385
|
+
- `memory(action: "remove")` pour nettoyer
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## 📊 Checklist Nouvel Agent
|
|
390
|
+
|
|
391
|
+
- [ ] `create_agent()` (OVERMIND)
|
|
392
|
+
- [ ] `update_agent_config()` — modèle (OVERMIND)
|
|
393
|
+
- [ ] `update_agent_config()` — MCP servers (OVERMIND)
|
|
394
|
+
- [ ] `update_agent_config()` — .env (OVERMIND)
|
|
395
|
+
- [ ] Tester avec `run_agent()` (OVERMIND → HERMES)
|
|
396
|
+
- [ ] Stocker premiers faits en `memory_store()` (OVERMIND)
|
|
397
|
+
- [ ] Configurer Bridge SDK si orchestration externe (OVERMIND)
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
> **Dernière mise à jour** : 30 mai 2026
|
|
402
|
+
> **Auteur** : Sniperbot Analyst (agent Hermes permanent)
|
|
403
|
+
> **Basé sur** : Infrastructure Overmind (encapsuleur) + Hermes Gateway (runtime)
|