overmind-mcp 3.5.2 → 3.6.1

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.
@@ -1,132 +0,0 @@
1
- # BT Secretary — Gestion bons de travail et feuilles de temps
2
-
3
- ## RÈGLE #1 — RÉPONSE OBLIGATOIRE PAR SMS
4
-
5
- À CHAQUE message reçu, tu DOIS:
6
- 1. Appeler `call_sms` du serveur `voipms-mcp` pour envoyer ta réponse
7
- 2. Puis rédiger ta réponse dans le chat (même contenu)
8
-
9
- ```json
10
- call_sms({ "dst": "<NUMERO_SANS_PLUS>", "message": "Réponse max 160 chars" })
11
- ```
12
- - `did` est HARDCODÉ en interne — ne pas passer
13
- - Le `dst` SANS le +. Ex: +14187207735 → dst="4187207735"
14
- - Format SMS: texte brut, JAMAIS de markdown/gras/listes
15
-
16
- ---
17
-
18
- ## IDENTITÉ
19
-
20
- Tu es **Mamadou**, secrétaire virtuelle de **Bon Air Construction**.
21
- Femme, 27 ans, chrétienne. Tu gères les bons de travail et feuilles de temps par SMS.
22
- Réponds en **français**, texte brut, max 160 chars quand possible.
23
-
24
- ### TON ADAPTÉ
25
- Récupère le profil: `SELECT ton, expressions, emoji_usage, surnom FROM bt_employes_profils WHERE employe_id = <id>;`
26
- - professionnel: clair, efficace, peu d'emojis
27
- - familier: chaleureux, expressions québécoises, emojis
28
- - neutre: factuel, aucun emoji
29
-
30
- ---
31
-
32
- ## BASE DE DONNÉES
33
-
34
- PostgreSQL: localhost:5432, base: `financial_analyst`
35
-
36
- ### TABLES PRINCIPALES
37
-
38
- **bt_employes**: id, prenom, nom, poste, tel, actif, email
39
- **bt_contrats**: id, no_projet(UNIQUE), client, adresse, ville, type(commerciale|residentielle|industrielle|genie_civil|regie|non_regie), statut(actif|termine|suspendu), notes
40
- **bt_semaines**: id, employe_id, contrat_id, no_projet, date_debut(lundi), heures_lun..heures_dim(numeric 4,1), description_ligne1..6, notes
41
- **bt_feuilles_temps**: id, employe_id, semaine_du(lundi), semaine_au(dimanche), mois, annee, statut(en_cours|soumis|valide), pdf_path, pdf_url
42
- **bt_feuilles_temps_lignes**: id, feuille_temps_id, jour(lundi|mardi|...), ligne_index(0-2), no_projet, heures_reg/comm/res/ind/ind_lourd/genie_civil, heure_debut/pause1_dbt/pause1_fin/diner_dbt/diner_fin/pause2_dbt/pause2_fin/fin, km
43
- **bt_bons**: id, contrat_id, employe_id, semaine_id, feuille_temps_id, no_projet, no_bon, date_bon, description, notes, pdf_path
44
- **bt_materiaux**: id, bon_id, semaine_id, description, qte, unite, prix_unitaire, prix_total
45
-
46
- ### IDENTIFICATION EMPLOYÉ
47
- ```sql
48
- SELECT id, prenom, nom, poste FROM bt_employes
49
- WHERE RIGHT(REPLACE(REPLACE(tel, '-', ''), '+', ''), 10) = RIGHT(REPLACE('<NUMERO>', '+', ''), 10) AND actif = true;
50
- ```
51
- Si non trouvé → SMS: "Bonjour! Je ne te reconnais pas. Demande à ton contremaître de t'inscrire."
52
-
53
- ---
54
-
55
- ## RÈGLES MÉTIER
56
-
57
- ### R1: SYNC BON/FEUILLE
58
- Chaque bon = une semaine sur un chantier (bt_semaines). Trigger DB synchronise vers bt_feuilles_temps_lignes.
59
-
60
- ### R2: CHEF vs ÉQUIPIER
61
- - Chef d'équipe (Nicolas, id=1): rédige le bon, donne descriptions + matériaux
62
- - Équipier (Samuel, id=2): enregistre ses heures mais NE rédige PAS. Dis: "Heures notées! Nicolas s'occupe du bon."
63
- - Exception: équipier seul sur chantier = peut rédiger
64
-
65
- ### R3: NOUVEAU CHANTIER
66
- Si no_projet inexistant: `INSERT INTO bt_contrats (no_projet, client, type, statut) VALUES ('<projet>', 'À confirmer', 'non_regie', 'actif');`
67
- Puis SMS: "Nouveau chantier créé. Nom du client et adresse?"
68
-
69
- ### R4: ÉCRITURE IMMÉDIATE
70
- Quand un employé donne une info → exécute le SQL IMMÉDIATEMENT avant de répondre. Jamais dire "c'est noté" sans avoir fait l'INSERT/UPDATE.
71
-
72
- ### R5: DATE LUNDI OBLIGATOIRE
73
- date_debut et semaine_du = TOUJOURS le lundi de la semaine. Jamais mardi/mercredi.
74
-
75
- ### R6: HORAIRES CCQ PAR DÉFAUT
76
- - heure_debut: heure donnée ou '07:00'
77
- - pause1: 09:00-09:15, dîner: 12:00-12:30, pause2: 14:30-14:45
78
- - heure_fin: début + heures travaillées + 1h pauses
79
- - km: 0.0 par défaut
80
-
81
- ### R7: ÉQUIPE NICOLAS & SAMUEL
82
- - Écritures DISTINCTES obligatoires (id=1 et id=2 séparés)
83
- - Samuel peut arriver en retard (ex: 08:30 au lieu de 07:00)
84
- - ATTENTION TRIGGER: UPDATE bt_semaines efface les horaires détaillés dans bt_feuilles_temps_lignes → DOIT ré-écrire les horaires après chaque UPDATE bt_semaines
85
-
86
- ### R8: DOUBLONS MATÉRIAUX
87
- Vérifie existence avant INSERT. Si similaire → demande clarification.
88
-
89
- ---
90
-
91
- ## PDF PIPELINE
92
-
93
- NE JAMAIS créer de PDF soi-même (pas de fitz/PyMuPDF).
94
-
95
- **Étape A**: Écrire données en DB (INSERT/UPDATE)
96
- **Étape B**: Appeler les scripts:
97
- ```bash
98
- # Bon de travail
99
- /home/demon/bt-sms/pdfjob_clean/.venv/bin/python /home/demon/bt-sms/pdfjob_clean/Outils/fill_bon_travail.py --bon-id <ID>
100
- # Feuille de temps
101
- /home/demon/bt-sms/pdfjob_clean/.venv/bin/python /home/demon/bt-sms/pdfjob_clean/Outils/fill_feuille_temps.py --feuille-id <ID>
102
- ```
103
- **Étape C**: Upload `POST http://localhost:3149/upload-local {path: "/home/demon/bt-sms/bons_pdf/<file>"}` puis `send_mms({dst, message, media1: url})`
104
-
105
- ---
106
-
107
- ## ACTIONS SPÉCIALES
108
-
109
- ### OCR (photos de feuilles)
110
- `/home/demon/bt-sms/pdfjob_clean/.venv/bin/python3 /home/demon/bt-sms/pdfjob_clean/Outils/ocr_extract.py "<URL_MEDIA>"`
111
-
112
- ### Rapport Vocal (MMS MP4)
113
- 1. Rédiger résumé hebdo complet
114
- 2. `/home/demon/bt-sms/pdfjob_clean/.venv/bin/python3 /home/demon/bt-sms/pdfjob_clean/Outils/generate_vocal_mms.py --text "<rapport>" --name "rapport_<semaine>"`
115
- 3. `send_mms({dst, message, media1: url})`
116
-
117
- ### Email
118
- - Expéditeur: agenticspeedworkflow@gmail.com
119
- - CC: nicolasracine44@gmail.com
120
- - Templates HTML: /home/demon/bt-sms/templates/email_rapport_hebdo.html
121
- - Toujours vérifier heures en DB avant d'envoyer (SQL SELECT)
122
- - 1 bon de travail par chantier (pas de doublon par employé)
123
-
124
- ---
125
-
126
- ## RÈGLES ABSOLUES
127
- 1. Identifier l'employé en PREMIER
128
- 2. Ne jamais inventer de données
129
- 3. Répondre par SMS/MMS via voipms-mcp
130
- 4. Texte brut sans markdown dans les SMS
131
- 5. Écrire en DB avant de confirmer
132
- 6. Jamais afficher de code technique dans un SMS
@@ -1,524 +0,0 @@
1
- # Tutoriel : Créer et piloter des agents via HTTP (Overmind MCP)
2
-
3
- > **Note** : `runner` est **obligatoire** dans `run_agent` (pas déduit du registry). Doit correspondre au runner utilisé lors du `create_agent`.
4
- >
5
- > `claude` et `kilo` nécessitent une auth (EXIT_CODE_1 = token manquant). `gemini` fonctionne avec le token libre. `hermes` fonctionne avec les tokens ZAI.
6
- > Auth : `Authorization: Bearer $OVERMIND_AUTH`
7
- > Tous les appels retournent du SSE (`Accept: application/json, text/event-stream`)
8
-
9
- ---
10
-
11
- ## Prérequis
12
-
13
- ```bash
14
- # Le serveur Overmind doit tourner (via start-all-mcp-servers.bat ou manuellement)
15
- curl http://localhost:3099/health
16
- # → ✓ Ok
17
- ```
18
-
19
- ---
20
-
21
- ## Méthode 1 — Via l'API HTTP MCP (externe, n'importe quel client)
22
-
23
- Toutes les opérations passent par `tools/call` avec le bon `name` d'outil.
24
-
25
- ### Headers obligatoires
26
-
27
- ```
28
- Content-Type: application/json
29
- Accept: application/json, text/event-stream
30
- Authorization: Bearer $OVERMIND_AUTH
31
- ```
32
-
33
- ---
34
-
35
- ### 1.1 Créer 5 agents (Claude, Kilo, Hermes × 2, Gemini)
36
-
37
- Chaque `create_agent` enregistre l'agent dans le registry. `run_agent` lancera le bon runner selon le champ `runner`.
38
-
39
- ```bash
40
- # Agent 1 — ClaudeRunner
41
- curl -s -X POST http://localhost:3099/mcp \
42
- -H "Content-Type: application/json" \
43
- -H "Accept: application/json, text/event-stream" \
44
- -H "Authorization: Bearer $OVERMIND_AUTH" \
45
- -d '{
46
- "jsonrpc": "2.0", "id": 1, "method": "tools/call",
47
- "params": {
48
- "name": "create_agent",
49
- "arguments": {
50
- "name": "dev_assistant",
51
- "runner": "claude",
52
- "prompt": "Tu es un assistant développement. Réponds en moins de 3 phrases."
53
- }
54
- }
55
- }' | grep -o '"text":"[^"]*"' | python3 -c "import sys,json; print(json.loads(sys.stdin.read())['text'])" 2>/dev/null || curl -s -X POST http://localhost:3099/mcp \
56
- -H "Content-Type: application/json" \
57
- -H "Accept: application/json, text/event-stream" \
58
- -H "Authorization: Bearer $OVERMIND_AUTH" \
59
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"create_agent","arguments":{"name":"dev_assistant","runner":"claude","prompt":"Tu es un assistant développement."}}}'
60
- ```
61
-
62
- **En JSON (copier-coller dans Postman/Insomnia) :**
63
-
64
- ```json
65
- {
66
- "jsonrpc": "2.0", "id": 1, "method": "tools/call",
67
- "params": {
68
- "name": "create_agent",
69
- "arguments": {
70
- "name": "dev_assistant",
71
- "runner": "claude",
72
- "prompt": "Tu es un assistant développement."
73
- }
74
- }
75
- }
76
- ```
77
-
78
- ```json
79
- // Agent 2 — KiloRunner
80
- {
81
- "jsonrpc": "2.0", "id": 2, "method": "tools/call",
82
- "params": {
83
- "name": "create_agent",
84
- "arguments": {
85
- "name": "archi_bot",
86
- "runner": "kilo",
87
- "prompt": "Tu es un expert architecture système."
88
- }
89
- }
90
- }
91
- ```
92
-
93
- ```json
94
- // Agent 3 — HermesRunner #1
95
- {
96
- "jsonrpc": "2.0", "id": 3, "method": "tools/call",
97
- "params": {
98
- "name": "create_agent",
99
- "arguments": {
100
- "name": "nexus_guard",
101
- "runner": "hermes",
102
- "prompt": "Tu es un garde système. Rapporte tout incident."
103
- }
104
- }
105
- }
106
- ```
107
-
108
- ```json
109
- // Agent 4 — HermesRunner #2
110
- {
111
- "jsonrpc": "2.0", "id": 4, "method": "tools/call",
112
- "params": {
113
- "name": "create_agent",
114
- "arguments": {
115
- "name": "nexus_sentinel",
116
- "runner": "hermes",
117
- "prompt": "Tu surveilles les métriques système."
118
- }
119
- }
120
- }
121
- ```
122
-
123
- ```json
124
- // Agent 5 — GeminiRunner
125
- {
126
- "jsonrpc": "2.0", "id": 5, "method": "tools/call",
127
- "params": {
128
- "name": "create_agent",
129
- "arguments": {
130
- "name": "fast_probe",
131
- "runner": "gemini",
132
- "prompt": "Réponds en une phrase concise."
133
- }
134
- }
135
- }
136
- ```
137
-
138
- **Runners disponibles** : `claude` | `gemini` | `kilo` | `qwencli` | `openclaw` | `cline` | `opencode` | `hermes`
139
-
140
- ---
141
-
142
- ### 1.2 Lister les agents
143
-
144
- ```json
145
- {
146
- "jsonrpc": "2.0", "id": 10, "method": "tools/call",
147
- "params": { "name": "list_agents", "arguments": {} }
148
- }
149
- ```
150
-
151
- ---
152
-
153
- ### 1.3 Lancer un agent (run_agent)
154
-
155
- ```json
156
- {
157
- "jsonrpc": "2.0", "id": 11, "method": "tools/call",
158
- "params": {
159
- "name": "run_agent",
160
- "arguments": {
161
- "agentName": "dev_assistant",
162
- "prompt": "Explique ce qu'est un mutex en 2 phrases.",
163
- "timeoutMs": 60000
164
- }
165
- }
166
- }
167
- ```
168
-
169
- Le runner correspondant (`claude`) est automatiquement choisi d'après le registry.
170
- Le PID du child process est inscrit dans `agent_lifecycle` (RAM, pas de disk I/O).
171
-
172
- ---
173
-
174
- ### 1.4 Surveiller en temps réel (stream)
175
-
176
- ```json
177
- // Lire l'output sans bloquer (polling)
178
- {
179
- "jsonrpc": "2.0", "id": 12, "method": "tools/call",
180
- "params": {
181
- "name": "agent_control",
182
- "arguments": {
183
- "agentName": "dev_assistant",
184
- "action": "stream"
185
- }
186
- }
187
- }
188
- ```
189
-
190
- ```json
191
- // Statut complet (pid, status, sessionId, buffer)
192
- {
193
- "jsonrpc": "2.0", "id": 13, "method": "tools/call",
194
- "params": {
195
- "name": "agent_control",
196
- "arguments": {
197
- "agentName": "dev_assistant",
198
- "action": "status"
199
- }
200
- }
201
- }
202
- ```
203
-
204
- ---
205
-
206
- ### 1.5 Lancer 5 agents en parallèle
207
-
208
- ```bash
209
- # Lancer les 5 en arrière-plan avec '&'
210
- curl -s -X POST http://localhost:3099/mcp \
211
- -H "Content-Type: application/json" \
212
- -H "Accept: application/json, text/event-stream" \
213
- -H "Authorization: Bearer $OVERMIND_AUTH" \
214
- -d '{"jsonrpc":"2.0","id":20,"method":"tools/call","params":{"name":"run_agent","arguments":{"agentName":"dev_assistant","prompt":"Question rapide","timeoutMs":30000}}}' &
215
-
216
- curl -s -X POST http://localhost:3099/mcp \
217
- -H "Content-Type: application/json" \
218
- -H "Accept: application/json, text/event-stream" \
219
- -H "Authorization: Bearer $OVERMIND_AUTH" \
220
- -d '{"jsonrpc":"2.0","id":21,"method":"tools/call","params":{"name":"run_agent","arguments":{"agentName":"archi_bot","prompt":"Question rapide","timeoutMs":30000}}}' &
221
-
222
- curl -s -X POST http://localhost:3099/mcp \
223
- -H "Content-Type: application/json" \
224
- -H "Accept: application/json, text/event-stream" \
225
- -H "Authorization: Bearer $OVERMIND_AUTH" \
226
- -d '{"jsonrpc":"2.0","id":22,"method":"tools/call","params":{"name":"run_agent","arguments":{"agentName":"nexus_guard","prompt":"Rapporte létat du système","timeoutMs":30000}}}' &
227
-
228
- curl -s -X POST http://localhost:3099/mcp \
229
- -H "Content-Type: application/json" \
230
- -H "Accept: application/json, text/event-stream" \
231
- -H "Authorization: Bearer $OVERMIND_AUTH" \
232
- -d '{"jsonrpc":"2.0","id":23,"method":"tools/call","params":{"name":"run_agent","arguments":{"agentName":"nexus_sentinel","prompt":"Liste les processus actifs","timeoutMs":30000}}}' &
233
-
234
- curl -s -X POST http://localhost:3099/mcp \
235
- -H "Content-Type: application/json" \
236
- -H "Accept: application/json, text/event-stream" \
237
- -H "Authorization: Bearer $OVERMIND_AUTH" \
238
- -d '{"jsonrpc":"2.0","id":24,"method":"tools/call","params":{"name":"run_agent","arguments":{"agentName":"fast_probe","prompt":"Ping","timeoutMs":30000}}}' &
239
-
240
- wait
241
- echo "Tous les agents ont répondu (ou expiré)"
242
- ```
243
-
244
- Chaque agent s'exécute dans son propre child process (PID distinct).
245
- Les outputs sont collectés dans `agent_lifecycle` (RAM, ring buffer 256KB/agent).
246
-
247
- ---
248
-
249
- ### 1.6 Attendre qu'un agent finisse (wait)
250
-
251
- ```json
252
- {
253
- "jsonrpc": "2.0", "id": 30, "method": "tools/call",
254
- "params": {
255
- "name": "agent_control",
256
- "arguments": {
257
- "agentName": "dev_assistant",
258
- "action": "wait",
259
- "timeoutMs": 900000
260
- }
261
- }
262
- }
263
- ```
264
-
265
- Blocage jusqu'à terminaison (max 15 min par défaut). Retourne l'output complet.
266
-
267
- ---
268
-
269
- ### 1.7 Tuer un agent
270
-
271
- ```json
272
- {
273
- "jsonrpc": "2.0", "id": 31, "method": "tools/call",
274
- "params": {
275
- "name": "agent_control",
276
- "arguments": {
277
- "agentName": "dev_assistant",
278
- "action": "kill"
279
- }
280
- }
281
- }
282
- ```
283
-
284
- Envoie `taskkill /F /T /PID <pid>` (Windows) ou `kill -9` (Unix).
285
-
286
- ---
287
-
288
- ### 1.8 Supprimer un agent du registry
289
-
290
- ```json
291
- {
292
- "jsonrpc": "2.0", "id": 32, "method": "tools/call",
293
- "params": {
294
- "name": "delete_agent",
295
- "arguments": { "agentName": "dev_assistant" }
296
- }
297
- }
298
- ```
299
-
300
- ---
301
-
302
- ## Méthode 2 — Via le SDK Node.js (import direct des runners)
303
-
304
- Importe les classes directement dans ton script Node pour un contrôle programme par programme.
305
-
306
- ### Installation / Setup
307
-
308
- ```bash
309
- cd /votre/projet/Workflow
310
- npm run build # compile le TypeScript
311
- ```
312
-
313
- ### 2.1 Lancer un agent avec ClaudeRunner
314
-
315
- ```javascript
316
- // run_claude_direct.mjs
317
- import { ClaudeRunner } from './dist/services/ClaudeRunner.js';
318
- import { loadEnvQuietly } from './dist/lib/loadEnv.js';
319
-
320
- const runner = new ClaudeRunner();
321
-
322
- // Lancer l'agent
323
- const result = await runner.runAgent({
324
- agentName: 'mon_agent',
325
- prompt: 'Explique les channels Go en 2 phrases.',
326
- timeoutMs: 60_000,
327
- silent: false, // false = logs dans stderr
328
- configPath: undefined,
329
- });
330
-
331
- console.log('Status:', result.error ?? 'OK');
332
- console.log('Output:', result.result);
333
- console.log('Session:', result.sessionId);
334
- ```
335
-
336
- ```bash
337
- node run_claude_direct.mjs
338
- ```
339
-
340
- ---
341
-
342
- ### 2.2 Lancer avec KiloRunner
343
-
344
- ```javascript
345
- // run_kilo_direct.mjs
346
- import { KiloRunner } from './dist/services/KiloRunner.js';
347
-
348
- const runner = new KiloRunner();
349
-
350
- const result = await runner.runAgent({
351
- agentName: 'archi_kilo',
352
- prompt: 'Décris larchitecture microservices en 3 points.',
353
- timeoutMs: 90_000,
354
- silent: false,
355
- configPath: undefined,
356
- });
357
-
358
- console.log(result.result ?? result.error);
359
- ```
360
-
361
- ---
362
-
363
- ### 2.3 Lancer 2 HermesRunner en parallèle
364
-
365
- ```javascript
366
- // run_hermes_pool.mjs
367
- import { HermesRunner } from './dist/services/HermesRunner.js';
368
-
369
- const runners = [
370
- new HermesRunner({ model: 'glm-5.2' }),
371
- new HermesRunner({ model: 'glm-4' }),
372
- ];
373
-
374
- const [res1, res2] = await Promise.all([
375
- runners[0].runAgent({
376
- agentName: 'hermes_guard',
377
- prompt: 'Rapporte les 3 dernières alertes.',
378
- timeoutMs: 60_000,
379
- silent: false,
380
- }),
381
- runners[1].runAgent({
382
- agentName: 'hermes_sentinel',
383
- prompt: 'Affiche les métriques CPU/mémoire.',
384
- timeoutMs: 60_000,
385
- silent: false,
386
- }),
387
- ]);
388
-
389
- console.log('Guard:', res1.result ?? res1.error);
390
- console.log('Sentinel:', res2.result ?? res2.error);
391
- ```
392
-
393
- ---
394
-
395
- ### 2.4 Lancer 5 agents mixed pool
396
-
397
- ```javascript
398
- // run_pool_5.mjs
399
- import { ClaudeRunner } from './dist/services/ClaudeRunner.js';
400
- import { KiloRunner } from './dist/services/KiloRunner.js';
401
- import { HermesRunner } from './dist/services/HermesRunner.js';
402
- import { GeminiRunner } from './dist/services/GeminiRunner.js';
403
-
404
- const agents = [
405
- // 1× ClaudeRunner
406
- { runner: new ClaudeRunner(), name: 'dev', prompt: 'Réponds en 1 phrase.', model: null },
407
- // 1× KiloRunner
408
- { runner: new KiloRunner(), name: 'archi', prompt: 'Décris un pattern.', model: null },
409
- // 2× HermesRunner
410
- { runner: new HermesRunner({ model: 'glm-5.2' }), name: 'nexus_g', prompt: 'Ping système.', model: 'glm-5.2' },
411
- { runner: new HermesRunner({ model: 'glm-4' }), name: 'nexus_s', prompt: 'Rapport RAM.', model: 'glm-4' },
412
- // 1× GeminiRunner
413
- { runner: new GeminiRunner(), name: 'probe', prompt: 'Combien de cores CPU ?', model: null },
414
- ];
415
-
416
- const runs = agents.map(({ runner, name, prompt, model }) =>
417
- runner.runAgent({ agentName: name, prompt, timeoutMs: 45_000, silent: false })
418
- .then(r => ({ name, result: r.result ?? r.error, model }))
419
- );
420
-
421
- const results = await Promise.all(runs);
422
-
423
- for (const { name, result, model } of results) {
424
- console.log(`[${model ?? 'default'}] ${name}: ${String(result).slice(0, 80)}`);
425
- }
426
- ```
427
-
428
- ```bash
429
- node run_pool_5.mjs
430
- ```
431
-
432
- ---
433
-
434
- ### 2.5 Cycle de vie complet avec abort
435
-
436
- ```javascript
437
- import { ClaudeRunner } from './dist/services/ClaudeRunner.js';
438
- import { AgentController } from './dist/lib/agent_lifecycle.js'; // wait helpers
439
-
440
- const runner = new ClaudeRunner();
441
- const controller = new AbortController();
442
-
443
- const agent = runner.runAgent({
444
- agentName: 'stoppable',
445
- prompt: 'Décris lUnivers en détail (va prendre longtemps).',
446
- timeoutMs: 300_000,
447
- signal: controller.signal, // AbortController = kill externe
448
- });
449
-
450
- // Kill après 5 secondes
451
- setTimeout(() => {
452
- console.log('→ Abort envoyé');
453
- controller.abort();
454
- }, 5_000);
455
-
456
- const result = await agent;
457
- console.log('Résultat:', result.error ?? result.result);
458
- ```
459
-
460
- ---
461
-
462
- ## Outil : bin/install-overmind-windows.bat
463
-
464
- ```batch
465
- :: Lancer le serveur Overmind MCP (via le script d'installation)
466
- bin\install-overmind-windows.bat Start (ou restart si déjà lancé)
467
- bin\install-overmind-windows.bat stop Arrêt propre
468
- bin\install-overmind-windows.bat restart Restart
469
- bin\install-overmind-windows.bat status Voir si ça tourne
470
- bin\install-overmind-windows.bat tail 20 dernières lignes du log
471
- bin\install-overmind-windows.bat kill Kill forcé
472
- ```
473
-
474
- Log : `Workflow/logs/overmind.log`
475
- PID file : `Workflow/overmind.pid`
476
- Health : `curl http://localhost:3099/health`
477
-
478
- ## Outil : overmind-pool.mjs (client CLI)
479
-
480
- ```bash
481
- node bin/overmind-pool.mjs --status # health check
482
- node bin/overmind-pool.mjs --agents # lister agents
483
- node bin/overmind-pool.mjs --pool # demo 5 agents
484
- node bin/overmind-pool.mjs --run <n> <r> <p> # run un agent
485
- node bin/overmind-pool.mjs --create <n> <r> <p> # créer un agent
486
- node bin/overmind-pool.mjs --kill <name> # tuer un agent
487
- ```
488
-
489
- ## Comparatif rapide
490
-
491
- | | HTTP MCP (Méthode 1) | SDK Node (Méthode 2) |
492
- |---|---|---|
493
- | **Usage** | Scripts, CI, autre machine | Code programme |
494
- | **Auth** | Bearer token HTTP | Aucun (process local) |
495
- | **Paralélisme** | curl × N ou HTTP client async | `Promise.all([...])` |
496
- | **Output streaming** | `agent_control stream` (SSE) | Callback `stdout.on('data')` |
497
- | **Lifecycle management** | Via `agent_control` tool | Via `agent_lifecycle` + AbortController |
498
- | **Déploiement** | HTTP ouvert, remote-ready | Même host que le serveur |
499
-
500
- ---
501
-
502
- ## Commandes utilitaires
503
-
504
- ```bash
505
- # Health check
506
- curl http://localhost:3099/health
507
-
508
- # Lister tous les outils disponibles
509
- curl -s -X POST http://localhost:3099/mcp \
510
- -H "Content-Type: application/json" \
511
- -H "Accept: application/json, text/event-stream" \
512
- -H "Authorization: Bearer $OVERMIND_AUTH" \
513
- -d '{"jsonrpc":"2.0","id":0,"method":"tools/list","params":{}}'
514
-
515
- # Lister les agents
516
- curl -s -X POST http://localhost:3099/mcp \
517
- -H "Content-Type: application/json" \
518
- -H "Accept: application/json, text/event-stream" \
519
- -H "Authorization: Bearer $OVERMIND_AUTH" \
520
- -d '{"jsonrpc":"2.0","id":0,"method":"tools/call","params":{"name":"list_agents","arguments":{}}}'
521
-
522
- # Voir le contenu du registry disk
523
- cat .claude/process-registry.json
524
- ```