overmind-mcp 2.8.52 → 2.8.53
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/ScenarioLoader.d.ts +20 -1
- package/dist/bridge/ScenarioLoader.d.ts.map +1 -1
- package/dist/bridge/ScenarioLoader.js +42 -0
- package/dist/bridge/ScenarioLoader.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/agent_lifecycle.d.ts +19 -0
- package/dist/lib/agent_lifecycle.d.ts.map +1 -1
- package/dist/lib/agent_lifecycle.js +92 -1
- package/dist/lib/agent_lifecycle.js.map +1 -1
- package/dist/lib/orchestration/dispatcher.d.ts +13 -0
- package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
- package/dist/lib/orchestration/dispatcher.js +100 -0
- package/dist/lib/orchestration/dispatcher.js.map +1 -1
- package/dist/services/AgentManager.d.ts +4 -4
- package/dist/services/AgentManager.d.ts.map +1 -1
- package/dist/services/AgentManager.js +139 -191
- package/dist/services/AgentManager.js.map +1 -1
- package/dist/services/HermesProfileManager.d.ts +99 -0
- package/dist/services/HermesProfileManager.d.ts.map +1 -0
- package/dist/services/HermesProfileManager.js +356 -0
- package/dist/services/HermesProfileManager.js.map +1 -0
- package/dist/services/HermesRunner.d.ts +53 -0
- package/dist/services/HermesRunner.d.ts.map +1 -0
- package/dist/services/HermesRunner.js +313 -0
- package/dist/services/HermesRunner.js.map +1 -0
- package/dist/services/KanbanAdapter.d.ts +135 -0
- package/dist/services/KanbanAdapter.d.ts.map +1 -0
- package/dist/services/KanbanAdapter.js +320 -0
- package/dist/services/KanbanAdapter.js.map +1 -0
- package/dist/tools/manage_agents.js +4 -4
- package/dist/tools/manage_agents.js.map +1 -1
- package/dist/tools/memory_store.d.ts +1 -1
- package/dist/tools/run_hermes.d.ts +1 -0
- package/dist/tools/run_hermes.d.ts.map +1 -1
- package/dist/tools/run_hermes.js +12 -6
- package/dist/tools/run_hermes.js.map +1 -1
- package/docs/PLAN_MIGRATION_V3.md +339 -0
- package/package.json +2 -2
- package/scripts/migrate-to-profiles.mjs +205 -0
- package/dist/lib/orchestration/swarm.d.ts +0 -76
- package/dist/lib/orchestration/swarm.d.ts.map +0 -1
- package/dist/lib/orchestration/swarm.js +0 -241
- package/dist/lib/orchestration/swarm.js.map +0 -1
- package/dist/prompts/agent_prompts.d.ts +0 -2
- package/dist/prompts/agent_prompts.d.ts.map +0 -1
- package/dist/prompts/agent_prompts.js +0 -21
- package/dist/prompts/agent_prompts.js.map +0 -1
- package/dist/services/NousHermesRunner.d.ts +0 -83
- package/dist/services/NousHermesRunner.d.ts.map +0 -1
- package/dist/services/NousHermesRunner.js +0 -1241
- package/dist/services/NousHermesRunner.js.map +0 -1
- package/dist/services/hermes/binaryFinder.d.ts +0 -8
- package/dist/services/hermes/binaryFinder.d.ts.map +0 -1
- package/dist/services/hermes/binaryFinder.js +0 -92
- package/dist/services/hermes/binaryFinder.js.map +0 -1
- package/dist/services/hermes/configYamlFilter.d.ts +0 -12
- package/dist/services/hermes/configYamlFilter.d.ts.map +0 -1
- package/dist/services/hermes/configYamlFilter.js +0 -70
- package/dist/services/hermes/configYamlFilter.js.map +0 -1
- package/dist/services/hermes/providerConfig.d.ts +0 -19
- package/dist/services/hermes/providerConfig.d.ts.map +0 -1
- package/dist/services/hermes/providerConfig.js +0 -53
- package/dist/services/hermes/providerConfig.js.map +0 -1
- package/dist/services/hermesTokenResolver.d.ts +0 -74
- package/dist/services/hermesTokenResolver.d.ts.map +0 -1
- package/dist/services/hermesTokenResolver.js +0 -140
- package/dist/services/hermesTokenResolver.js.map +0 -1
- package/dist/tools/initialization_check.d.ts +0 -2
- package/dist/tools/initialization_check.d.ts.map +0 -1
- package/dist/tools/initialization_check.js +0 -23
- package/dist/tools/initialization_check.js.map +0 -1
- /package/bin/{launch.js → launch.cjs} +0 -0
- /package/dist/bin/{launch.js → launch.cjs} +0 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Plan de Migration — Overmind Hermes v2 → v3.0 (Native Profiles)
|
|
2
|
+
|
|
3
|
+
> **Objectif** : Migrer les 6 anciens agents Hermes du layout Overmind custom vers les profils Hermes natifs (`~/.hermes/profiles/<name>/`), puis appliquer le modèle kanban (PostgreSQL 18 registry + SQLite state local + homes standardisés).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Inventaire des agents à migrer
|
|
8
|
+
|
|
9
|
+
### Agents Hermes (layout Overmind custom → profils natifs)
|
|
10
|
+
|
|
11
|
+
| # | Agent | Modèle | Provider | MCP | SOUL.md | Statut |
|
|
12
|
+
|---|-------|--------|----------|-----|---------|--------|
|
|
13
|
+
| 1 | `sniperbot_analyst` | MiniMax-M3 | minimax-cn | 3 | 4278b | ✅ **DÉJÀ MIGRÉ** |
|
|
14
|
+
| 2 | `tradingview_analyst` | MiniMax-M3 | minimax-cn | 9 | 5170b | ⬜ À migrer |
|
|
15
|
+
| 3 | `pdf_bon_travail` | MiniMax-M3 | minimax-cn | 3 | 0b* | ⬜ À migrer |
|
|
16
|
+
| 4 | `test_hermes_runner` | MiniMax-M3 | minimax-cn | 2 | 2699b | ⬜ À migrer (test) |
|
|
17
|
+
| 5 | `hermes_test_validation` | MiniMax-M3 | minimax-cn | 3 | 2528b | ⬜ À migrer (test) |
|
|
18
|
+
| 6 | `hermes_test_validation_agent` | claude-sonnet-4-6 | minimax-cn* | 8 | 2545b | ⬜ À migrer (test) |
|
|
19
|
+
|
|
20
|
+
*pdf_bon_travail n'a pas de SOUL.md dans le layout Overmind, mais en a un (4283b) dans `~/.hermes/agents/`.
|
|
21
|
+
*hermes_test_validation_agent a model=claude-sonnet-4-6 mais provider=minimax-cn → mismatch à corriger.
|
|
22
|
+
|
|
23
|
+
### Agents Claude/Kilo (NON affectés)
|
|
24
|
+
|
|
25
|
+
91 agents dans `.claude/agents/*.md` — **aucune migration nécessaire**. Ils restent dans le layout Overmind existant.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 0 — Sauvegarde (préalable)
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Backup complet du dossier .overmind/hermes (ancien layout)
|
|
33
|
+
cp -r ".overmind/hermes" ".overmind/hermes.backup.$(date +%Y%m%d)"
|
|
34
|
+
|
|
35
|
+
# Backup des profils Hermes actuels
|
|
36
|
+
cp -r "$LOCALAPPDATA/hermes/profiles" "$LOCALAPPDATA/hermes/profiles.backup.$(date +%Y%m%d)"
|
|
37
|
+
|
|
38
|
+
# Backup du registry PostgreSQL
|
|
39
|
+
pg_dump -h localhost -p 5432 overmind_registry > "overmind_registry_backup_$(date +%Y%m%d).sql"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Phase 1 — Migration des agents (4 étapes par agent)
|
|
45
|
+
|
|
46
|
+
Pour chaque agent de la liste ci-dessus (sauf sniperbot_analyst déjà fait):
|
|
47
|
+
|
|
48
|
+
### Étape 1: Créer le profil natif
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
hermes profile create <name> --no-alias --description "<description from SOUL.md>"
|
|
52
|
+
hermes -p <name> config set model.provider <provider>
|
|
53
|
+
hermes -p <name> config set model.model <model>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Étape 2: Copier les fichiers
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# SOUL.md (system prompt)
|
|
60
|
+
cp ".overmind/hermes/agents/<name>/SOUL.md" \
|
|
61
|
+
"$LOCALAPPDATA/hermes/profiles/<name>/SOUL.md"
|
|
62
|
+
|
|
63
|
+
# .env (credentials — extraits de settings.json)
|
|
64
|
+
# Les clés sont mappées selon le provider:
|
|
65
|
+
# sk-cp-* → MINIMAX_CN_API_KEY
|
|
66
|
+
# 32hex → GLM_API_KEY
|
|
67
|
+
# sk-ant-* → ANTHROPIC_API_KEY
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Étape 3: Configurer les MCP servers
|
|
71
|
+
|
|
72
|
+
Le `HermesProfileManager.setMcpServers()` lit automatiquement le `.mcp.json` du workspace et écrit les vraies URLs dans le `config.yaml` du profil.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Vérifier
|
|
76
|
+
hermes -p <name> mcp list
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Étape 4: Valider
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Test basique
|
|
83
|
+
hermes -p <name> chat -q "Reply with: <NAME> OK" -Q --yolo
|
|
84
|
+
|
|
85
|
+
# Test MCP tools
|
|
86
|
+
hermes -p <name> chat -q "List all mcp_ tools available" -Q --yolo
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Phase 2 — Ordre de migration (par priorité)
|
|
92
|
+
|
|
93
|
+
### Priorité 1: Production agents
|
|
94
|
+
|
|
95
|
+
1. **tradingview_analyst** — 9 MCP servers, SOUL.md complet
|
|
96
|
+
- Provider: minimax-cn
|
|
97
|
+
- MCPs: memory, discord, postgres, + 6 autres
|
|
98
|
+
- Action: migration complète + test MCP
|
|
99
|
+
|
|
100
|
+
2. **pdf_bon_travail** — 3 MCP servers
|
|
101
|
+
- Provider: minimax-cn
|
|
102
|
+
- SOUL.md: récupérer depuis `~/.hermes/agents/pdf_bon_travail/SOUL.md` (4283b)
|
|
103
|
+
- Action: fusionner les deux sources (Overmind + ~/.hermes)
|
|
104
|
+
|
|
105
|
+
### Priorité 2: Test agents (optionnel)
|
|
106
|
+
|
|
107
|
+
3. **test_hermes_runner** — agent de test
|
|
108
|
+
4. **hermes_test_validation** — agent de test
|
|
109
|
+
5. **hermes_test_validation_agent** — agent de test (corriger provider mismatch)
|
|
110
|
+
|
|
111
|
+
### Priorité 3: Cleanup
|
|
112
|
+
|
|
113
|
+
6. Supprimer les profils de test après validation
|
|
114
|
+
7. Archiver le dossier `.overmind/hermes/` (ne pas supprimer immédiatement)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Phase 3 — Script de migration automatique
|
|
119
|
+
|
|
120
|
+
Le script `scripts/migrate-to-profiles.mjs` automatise toute la Phase 1:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Dry-run (voir ce qui serait fait)
|
|
124
|
+
node scripts/migrate-to-profiles.mjs --dry-run
|
|
125
|
+
|
|
126
|
+
# Migration réelle
|
|
127
|
+
node scripts/migrate-to-profiles.mjs
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Le script:
|
|
131
|
+
1. Scanne `.overmind/hermes/agents/*/settings.json`
|
|
132
|
+
2. Pour chaque agent:
|
|
133
|
+
- Détecte le provider depuis le token prefix
|
|
134
|
+
- Crée le profil via `hermes profile create`
|
|
135
|
+
- Configure model + provider via `hermes config set`
|
|
136
|
+
- Copie SOUL.md
|
|
137
|
+
- Écrit .env avec les bonnes clés provider
|
|
138
|
+
- Configure les MCP servers depuis .mcp.json
|
|
139
|
+
3. Affiche le résumé
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Phase 4 — Registry PostgreSQL (model kanban)
|
|
144
|
+
|
|
145
|
+
Après la migration des agents, créer le registry central dans PostgreSQL 18:
|
|
146
|
+
|
|
147
|
+
### Schema `overmind_registry`
|
|
148
|
+
|
|
149
|
+
```sql
|
|
150
|
+
CREATE SCHEMA IF NOT EXISTS overmind_registry;
|
|
151
|
+
|
|
152
|
+
-- Table: agents (registre canonique)
|
|
153
|
+
CREATE TABLE overmind_registry.agents (
|
|
154
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
155
|
+
name TEXT UNIQUE NOT NULL,
|
|
156
|
+
runner TEXT NOT NULL DEFAULT 'hermes',
|
|
157
|
+
profile_path TEXT,
|
|
158
|
+
model TEXT,
|
|
159
|
+
provider TEXT,
|
|
160
|
+
description TEXT,
|
|
161
|
+
mcp_servers TEXT[],
|
|
162
|
+
status TEXT DEFAULT 'active', -- active | archived | deprecated
|
|
163
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
164
|
+
updated_at TIMESTAMPTZ DEFAULT now()
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
-- Table: profiles (mapping profil Hermes → agent Overmind)
|
|
168
|
+
CREATE TABLE overmind_registry.profiles (
|
|
169
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
170
|
+
agent_id UUID REFERENCES overmind_registry.agents(id) ON DELETE CASCADE,
|
|
171
|
+
profile_name TEXT UNIQUE NOT NULL,
|
|
172
|
+
home_path TEXT NOT NULL,
|
|
173
|
+
soUL_hash TEXT,
|
|
174
|
+
config_hash TEXT,
|
|
175
|
+
created_at TIMESTAMPTZ DEFAULT now()
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
-- Table: workspaces (workspace typés)
|
|
179
|
+
CREATE TABLE overmind_registry.workspaces (
|
|
180
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
181
|
+
agent_id UUID REFERENCES overmind_registry.agents(id),
|
|
182
|
+
kind TEXT NOT NULL, -- scratch | dir | worktree
|
|
183
|
+
path TEXT NOT NULL,
|
|
184
|
+
tenant TEXT,
|
|
185
|
+
created_at TIMESTAMPTZ DEFAULT now(),
|
|
186
|
+
archived_at TIMESTAMPTZ
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
-- Table: gc_log (garbage collection déterministe)
|
|
190
|
+
CREATE TABLE overmind_registry.gc_log (
|
|
191
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
192
|
+
action TEXT NOT NULL, -- prune | archive | delete
|
|
193
|
+
target TEXT NOT NULL,
|
|
194
|
+
reason TEXT,
|
|
195
|
+
ts TIMESTAMPTZ DEFAULT now()
|
|
196
|
+
);
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Migration des données
|
|
200
|
+
|
|
201
|
+
```sql
|
|
202
|
+
-- Insérer les agents migrés
|
|
203
|
+
INSERT INTO overmind_registry.agents (name, runner, profile_path, model, provider, description)
|
|
204
|
+
VALUES
|
|
205
|
+
('sniperbot_analyst', 'hermes', '~/.hermes/profiles/sniperbot_analyst', 'MiniMax-M3', 'minimax-cn', 'Discord assistant + Overmind orchestrator'),
|
|
206
|
+
('tradingview_analyst', 'hermes', '~/.hermes/profiles/tradingview_analyst', 'MiniMax-M3', 'minimax-cn', 'TradingView analysis agent'),
|
|
207
|
+
('pdf_bon_travail', 'hermes', '~/.hermes/profiles/pdf_bon_travail', 'MiniMax-M3', 'minimax-cn', 'PDF work order management');
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Phase 5 — Standardisation des homes
|
|
213
|
+
|
|
214
|
+
Chaque profil doit avoir une structure standardisée:
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
~/.hermes/profiles/<name>/
|
|
218
|
+
├── config.yaml ← provider + model + mcp_servers
|
|
219
|
+
├── .env ← credentials (1 set par profil)
|
|
220
|
+
├── SOUL.md ← system prompt
|
|
221
|
+
├── profile.yaml ← description (pour kanban routing)
|
|
222
|
+
├── memories/ ← state.db (SQLite runtime)
|
|
223
|
+
├── sessions/ ← historique conversations
|
|
224
|
+
├── skills/ ← skills du profil
|
|
225
|
+
├── cron/ ← jobs programmés
|
|
226
|
+
├── workspace.yaml ← NEW: workspace config (kind, path, tenant)
|
|
227
|
+
└── README.md ← NEW: doc du profil
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### workspace.yaml (nouveau)
|
|
231
|
+
|
|
232
|
+
```yaml
|
|
233
|
+
# Workspace configuration for <name>
|
|
234
|
+
kind: dir # scratch | dir | worktree
|
|
235
|
+
path: ~/.hermes/profiles/<name>/workspace
|
|
236
|
+
tenant: default # tenant namespace
|
|
237
|
+
auto_clean: false # GC auto pour scratch only
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### README.md (nouveau)
|
|
241
|
+
|
|
242
|
+
```markdown
|
|
243
|
+
# <name>
|
|
244
|
+
|
|
245
|
+
**Runner:** hermes
|
|
246
|
+
**Model:** MiniMax-M3 (minimax-cn)
|
|
247
|
+
**MCP servers:** memory, discord, postgres, tradingview
|
|
248
|
+
|
|
249
|
+
## Description
|
|
250
|
+
<from SOUL.md first paragraph>
|
|
251
|
+
|
|
252
|
+
## MCP Tools
|
|
253
|
+
- mcp_postgres_* — PostgreSQL queries
|
|
254
|
+
- mcp_discord_* — Discord messaging
|
|
255
|
+
- mcp_tradingview_* — TradingView analysis
|
|
256
|
+
|
|
257
|
+
## Credentials
|
|
258
|
+
Credentials are in `.env` (not committed).
|
|
259
|
+
|
|
260
|
+
## Migration
|
|
261
|
+
Migrated from Overmind v2 custom layout on 2026-06-28.
|
|
262
|
+
Original: .overmind/hermes/agents/<name>/
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Phase 6 — Symlinks rétrocompat
|
|
268
|
+
|
|
269
|
+
Pour ne pas casser les scripts existants qui référencent l'ancien layout:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Pour chaque agent migré, créer un symlink:
|
|
273
|
+
ln -s "$LOCALAPPDATA/hermes/profiles/<name>" \
|
|
274
|
+
".overmind/hermes/agents/<name>"
|
|
275
|
+
|
|
276
|
+
# Les anciens chemins pointent maintenant vers le profil natif.
|
|
277
|
+
# Au prochain cycle de dev, on supprimera progressivement les symlinks.
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Checklist de validation
|
|
283
|
+
|
|
284
|
+
### Par agent
|
|
285
|
+
|
|
286
|
+
- [ ] Profil créé: `hermes profile list` le montre
|
|
287
|
+
- [ ] config.yaml: provider + model corrects
|
|
288
|
+
- [ ] .env: credentials présents et valides
|
|
289
|
+
- [ ] SOUL.md: copié intégralement
|
|
290
|
+
- [ ] MCP servers: `hermes -p <name> mcp list` les montre
|
|
291
|
+
- [ ] Test basic: `hermes -p <name> chat -q "test" -Q --yolo` répond
|
|
292
|
+
- [ ] Test MCP: agent peut utiliser mcp_postgres_explore
|
|
293
|
+
- [ ] Test Overmind: `run_agent(runner: "hermes", agentName: "<name>")` répond
|
|
294
|
+
|
|
295
|
+
### Global
|
|
296
|
+
|
|
297
|
+
- [ ] Tous les agents Hermes migrés vers profils natifs
|
|
298
|
+
- [ ] `hermes profile list` montre tous les agents
|
|
299
|
+
- [ ] `list_agents` MCP tool les montre tous
|
|
300
|
+
- [ ] Registry PostgreSQL créé avec le bon schema
|
|
301
|
+
- [ ] Agents enregistrés dans overmind_registry.agents
|
|
302
|
+
- [ ] Symlinks rétrocompat en place
|
|
303
|
+
- [ ] Ancien layout archivé (pas supprimé)
|
|
304
|
+
- [ ] Bot Discord (sniperbot_analyst) fonctionne toujours
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Rollback
|
|
309
|
+
|
|
310
|
+
Si la migration échoue:
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
# 1. Restaurer les profils backup
|
|
314
|
+
cp -r "$LOCALAPPDATA/hermes/profiles.backup.YYYYMMDD/*" "$LOCALAPPDATA/hermes/profiles/"
|
|
315
|
+
|
|
316
|
+
# 2. Restaurer l'ancien layout
|
|
317
|
+
cp -r ".overmind/hermes.backup.YYYYMMDD" ".overmind/hermes"
|
|
318
|
+
|
|
319
|
+
# 3. Restaurer le registry PostgreSQL
|
|
320
|
+
psql -h localhost -p 5432 overmind_registry < "overmind_registry_backup_YYYYMMDD.sql"
|
|
321
|
+
|
|
322
|
+
# 4. Redémarrer le MCP server
|
|
323
|
+
kill $(netstat -ano | grep ":3099.*LISTENING" | awk '{print $5}')
|
|
324
|
+
cd Workflow && node dist/bin/cli.js --transport httpStream --port 3099
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Timeline estimée
|
|
330
|
+
|
|
331
|
+
| Phase | Durée | Downtime |
|
|
332
|
+
|-------|-------|----------|
|
|
333
|
+
| Phase 0: Sauvegarde | 15min | 0 |
|
|
334
|
+
| Phase 1: Migration agents (3 prod) | 1h | ~5min/agent |
|
|
335
|
+
| Phase 2: Script auto + tests | 30min | 0 |
|
|
336
|
+
| Phase 3: Registry PostgreSQL | 1h | 0 |
|
|
337
|
+
| Phase 4: Standardisation homes | 2h | 0 |
|
|
338
|
+
| Phase 5: Symlinks rétrocompat | 30min | 0 |
|
|
339
|
+
| **Total** | **~5h** | **~15min** |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overmind-mcp",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.53",
|
|
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",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"postgres:status": "overmind-postgres-mcp status",
|
|
59
59
|
"postgres:logs": "overmind-postgres-mcp logs",
|
|
60
60
|
"postgres:reset": "overmind-postgres-mcp reset",
|
|
61
|
-
"prebuild": "node -e \"try{require('fs').copyFileSync('bin/launch.
|
|
61
|
+
"prebuild": "node -e \"try{require('fs').mkdirSync('dist/bin',{recursive:true});require('fs').copyFileSync('bin/launch.cjs','dist/bin/launch.cjs');console.log('Copied launch.cjs')}catch{console.log('dist/bin not ready yet')}\""
|
|
62
62
|
},
|
|
63
63
|
"keywords": [
|
|
64
64
|
"mcp",
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* migrate-to-profiles.mjs — Migrate old Hermes agents to native profiles.
|
|
4
|
+
*
|
|
5
|
+
* Scans the old Overmind Hermes layout (<HERMES_HOME>/agents/<name>/settings.json)
|
|
6
|
+
* and creates a native Hermes profile for each, preserving:
|
|
7
|
+
* - SOUL.md (system prompt)
|
|
8
|
+
* - credentials (.env)
|
|
9
|
+
* - model + provider (config.yaml)
|
|
10
|
+
* - MCP servers
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* node scripts/migrate-to-profiles.mjs [--dry-run]
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { exec } from 'child_process';
|
|
17
|
+
import { promisify } from 'util';
|
|
18
|
+
import fs from 'fs';
|
|
19
|
+
import path from 'path';
|
|
20
|
+
import os from 'os';
|
|
21
|
+
|
|
22
|
+
const execAsync = promisify(exec);
|
|
23
|
+
|
|
24
|
+
// ─── Resolve old HERMES_HOME ──────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
function resolveOldHermesHome() {
|
|
27
|
+
if (process.env.OVERMIND_HERMES_HOME) return process.env.OVERMIND_HERMES_HOME;
|
|
28
|
+
|
|
29
|
+
// Workspace fallback
|
|
30
|
+
const wsHome = path.join(process.cwd(), '.overmind', 'hermes');
|
|
31
|
+
if (fs.existsSync(wsHome)) return wsHome;
|
|
32
|
+
|
|
33
|
+
// HOME-based
|
|
34
|
+
const homeBase = process.env.LOCALAPPDATA || os.homedir();
|
|
35
|
+
return process.platform === 'win32'
|
|
36
|
+
? path.join(homeBase, 'overmind', 'hermes')
|
|
37
|
+
: path.join(homeBase, '.overmind', 'hermes');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function resolveOldAgentsDir() {
|
|
41
|
+
const home = resolveOldHermesHome();
|
|
42
|
+
const agentsDir = path.join(home, 'agents');
|
|
43
|
+
if (fs.existsSync(agentsDir)) return agentsDir;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ─── Detect provider from credentials ─────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
function detectProvider(token, baseUrl) {
|
|
50
|
+
if (!token) return 'openrouter';
|
|
51
|
+
const url = (baseUrl || '').toLowerCase();
|
|
52
|
+
const t = token.toLowerCase();
|
|
53
|
+
|
|
54
|
+
if (url.includes('minimaxi') || url.includes('minimax') || t.startsWith('sk-cp-') || t.startsWith('sk-mm-')) {
|
|
55
|
+
return url.includes('minimaxi') ? 'minimax-cn' : 'minimax';
|
|
56
|
+
}
|
|
57
|
+
if (url.includes('z.ai') || url.includes('bigmodel') || /^[0-9a-f]{32}/i.test(token)) {
|
|
58
|
+
return 'zai';
|
|
59
|
+
}
|
|
60
|
+
if (url.includes('anthropic') || t.startsWith('sk-ant-')) {
|
|
61
|
+
return 'anthropic';
|
|
62
|
+
}
|
|
63
|
+
if (url.includes('openai') || t.startsWith('sk-')) {
|
|
64
|
+
return 'openai';
|
|
65
|
+
}
|
|
66
|
+
return 'openrouter';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function buildCredentialsMap(provider, authToken) {
|
|
70
|
+
const creds = {};
|
|
71
|
+
if (!authToken) return creds;
|
|
72
|
+
|
|
73
|
+
switch (provider) {
|
|
74
|
+
case 'minimax-cn':
|
|
75
|
+
creds['MINIMAX_CN_API_KEY'] = authToken;
|
|
76
|
+
break;
|
|
77
|
+
case 'minimax':
|
|
78
|
+
creds['MINIMAX_API_KEY'] = authToken;
|
|
79
|
+
break;
|
|
80
|
+
case 'zai':
|
|
81
|
+
creds['GLM_API_KEY'] = authToken;
|
|
82
|
+
creds['ZAI_ANTHROPIC_FALLBACK_KEY'] = authToken;
|
|
83
|
+
break;
|
|
84
|
+
case 'anthropic':
|
|
85
|
+
creds['ANTHROPIC_API_KEY'] = authToken;
|
|
86
|
+
break;
|
|
87
|
+
case 'openai':
|
|
88
|
+
creds['OPENAI_API_KEY'] = authToken;
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
creds['OPENROUTER_API_KEY'] = authToken;
|
|
92
|
+
}
|
|
93
|
+
return creds;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ─── Migration ────────────────────────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
async function migrate(dryRun = false) {
|
|
99
|
+
const agentsDir = resolveOldAgentsDir();
|
|
100
|
+
if (!agentsDir) {
|
|
101
|
+
console.log('ℹ️ No old Hermes agents directory found. Nothing to migrate.');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const agentDirs = fs.readdirSync(agentsDir)
|
|
106
|
+
.filter(d => fs.statSync(path.join(agentsDir, d)).isDirectory());
|
|
107
|
+
|
|
108
|
+
if (agentDirs.length === 0) {
|
|
109
|
+
console.log('ℹ️ No old Hermes agents found. Nothing to migrate.');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
console.log(`Found ${agentDirs.length} old Hermes agent(s) to migrate:\n`);
|
|
114
|
+
|
|
115
|
+
let migrated = 0;
|
|
116
|
+
let skipped = 0;
|
|
117
|
+
let failed = 0;
|
|
118
|
+
|
|
119
|
+
for (const agentName of agentDirs) {
|
|
120
|
+
const agentDir = path.join(agentsDir, agentName);
|
|
121
|
+
const settingsPath = path.join(agentDir, 'settings.json');
|
|
122
|
+
const soulPath = path.join(agentDir, 'SOUL.md');
|
|
123
|
+
|
|
124
|
+
console.log(` 📦 ${agentName}`);
|
|
125
|
+
|
|
126
|
+
// Read settings.json
|
|
127
|
+
if (!fs.existsSync(settingsPath)) {
|
|
128
|
+
console.log(` ⚠️ No settings.json found — skipping.`);
|
|
129
|
+
skipped++;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
let settings;
|
|
134
|
+
try {
|
|
135
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
136
|
+
} catch (e) {
|
|
137
|
+
console.log(` ❌ Failed to parse settings.json: ${e.message}`);
|
|
138
|
+
failed++;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const env = settings.env || {};
|
|
143
|
+
const authToken = env.ANTHROPIC_AUTH_TOKEN || env.ANTHROPIC_API_KEY || '';
|
|
144
|
+
const baseUrl = env.ANTHROPIC_BASE_URL || '';
|
|
145
|
+
const model = env.ANTHROPIC_MODEL || env.MODEL || 'MiniMax-M3';
|
|
146
|
+
const provider = env.ANTHROPIC_PROVIDER || detectProvider(authToken, baseUrl);
|
|
147
|
+
const mcpServers = settings.enabledMcpjsonServers || [];
|
|
148
|
+
|
|
149
|
+
// Read SOUL.md
|
|
150
|
+
let soulContent = '';
|
|
151
|
+
if (fs.existsSync(soulPath)) {
|
|
152
|
+
soulContent = fs.readFileSync(soulPath, 'utf-8');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
console.log(` Model: ${model} (${provider})`);
|
|
156
|
+
console.log(` MCPs: ${mcpServers.length} server(s)`);
|
|
157
|
+
console.log(` Auth: ${authToken ? `***${authToken.slice(-4)}` : '(none)'}`);
|
|
158
|
+
|
|
159
|
+
if (dryRun) {
|
|
160
|
+
console.log(` 🔄 [DRY-RUN] Would create profile: hermes profile create ${agentName}`);
|
|
161
|
+
migrated++;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
// 1. Create profile
|
|
167
|
+
const { HermesProfileManager } = await import('../dist/services/HermesProfileManager.js');
|
|
168
|
+
const credentials = buildCredentialsMap(provider, authToken);
|
|
169
|
+
|
|
170
|
+
const { profilePath } = await HermesProfileManager.create({
|
|
171
|
+
name: agentName,
|
|
172
|
+
prompt: soulContent || `You are ${agentName}, an AI assistant.`,
|
|
173
|
+
model,
|
|
174
|
+
provider,
|
|
175
|
+
credentials,
|
|
176
|
+
mcpServers,
|
|
177
|
+
description: `Migrated agent: ${agentName}`,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
console.log(` ✅ Profile created: ${profilePath}`);
|
|
181
|
+
migrated++;
|
|
182
|
+
} catch (e) {
|
|
183
|
+
console.log(` ❌ Migration failed: ${e.message}`);
|
|
184
|
+
failed++;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
console.log(`\n📊 Migration complete: ${migrated} migrated, ${skipped} skipped, ${failed} failed.`);
|
|
189
|
+
|
|
190
|
+
if (!dryRun && migrated > 0) {
|
|
191
|
+
console.log(`\n💡 Next steps:`);
|
|
192
|
+
console.log(` • Verify profiles: hermes profile list`);
|
|
193
|
+
console.log(` • Test an agent: hermes -p <name> chat "test"`);
|
|
194
|
+
console.log(` • Old layout preserved at: ${agentsDir}`);
|
|
195
|
+
console.log(` • Delete old layout when ready: rm -rf ${agentsDir}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ─── CLI ──────────────────────────────────────────────────────────────────────
|
|
200
|
+
|
|
201
|
+
const dryRun = process.argv.includes('--dry-run');
|
|
202
|
+
migrate(dryRun).catch(e => {
|
|
203
|
+
console.error('Migration error:', e);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export interface AgentCapability {
|
|
2
|
-
agentName: string;
|
|
3
|
-
runner: string;
|
|
4
|
-
capabilities: string[];
|
|
5
|
-
maxConcurrentTasks: number;
|
|
6
|
-
currentLoad: number;
|
|
7
|
-
estimatedCompletionTime?: number;
|
|
8
|
-
}
|
|
9
|
-
export interface SwarmTask {
|
|
10
|
-
id: string;
|
|
11
|
-
type: string;
|
|
12
|
-
prompt: string;
|
|
13
|
-
priority: number;
|
|
14
|
-
estimatedDuration?: number;
|
|
15
|
-
requiresCapabilities: string[];
|
|
16
|
-
agentName?: string;
|
|
17
|
-
model?: string;
|
|
18
|
-
path?: string;
|
|
19
|
-
}
|
|
20
|
-
export interface SwarmConfig {
|
|
21
|
-
agents: AgentCapability[];
|
|
22
|
-
tasks: SwarmTask[];
|
|
23
|
-
maxParallelTasks: number;
|
|
24
|
-
enableLoadBalancing: boolean;
|
|
25
|
-
enableTaskPriority: boolean;
|
|
26
|
-
}
|
|
27
|
-
export interface SwarmAllocation {
|
|
28
|
-
taskId: string;
|
|
29
|
-
agentName: string;
|
|
30
|
-
runner: string;
|
|
31
|
-
estimatedStart: number;
|
|
32
|
-
estimatedCompletion: number;
|
|
33
|
-
}
|
|
34
|
-
export interface SwarmResult {
|
|
35
|
-
taskId: string;
|
|
36
|
-
status: 'pending' | 'assigned' | 'running' | 'completed' | 'failed';
|
|
37
|
-
agentName?: string;
|
|
38
|
-
result?: unknown;
|
|
39
|
-
error?: string;
|
|
40
|
-
startedAt?: number;
|
|
41
|
-
completedAt?: number;
|
|
42
|
-
}
|
|
43
|
-
export declare class SwarmOrchestrator {
|
|
44
|
-
private agents;
|
|
45
|
-
private taskQueue;
|
|
46
|
-
private allocations;
|
|
47
|
-
private results;
|
|
48
|
-
private maxParallelTasks;
|
|
49
|
-
private enableLoadBalancing;
|
|
50
|
-
private enableTaskPriority;
|
|
51
|
-
private roundRobinIndex;
|
|
52
|
-
constructor(config: SwarmConfig);
|
|
53
|
-
private findBestAgent;
|
|
54
|
-
private canAgentHandleTask;
|
|
55
|
-
private selectByLoadBalancing;
|
|
56
|
-
private selectByRoundRobin;
|
|
57
|
-
private calculateAgentScore;
|
|
58
|
-
allocateTasks(): Promise<SwarmAllocation[]>;
|
|
59
|
-
executeTask(task: SwarmTask, allocation: SwarmAllocation): Promise<SwarmResult>;
|
|
60
|
-
getTaskStatus(taskId: string): SwarmResult | undefined;
|
|
61
|
-
getAllResults(): SwarmResult[];
|
|
62
|
-
getPendingTasks(): SwarmTask[];
|
|
63
|
-
getAgentStatus(agentName: string): AgentCapability | undefined;
|
|
64
|
-
getAllAgents(): AgentCapability[];
|
|
65
|
-
getStatistics(): {
|
|
66
|
-
totalTasks: number;
|
|
67
|
-
completed: number;
|
|
68
|
-
failed: number;
|
|
69
|
-
running: number;
|
|
70
|
-
pending: number;
|
|
71
|
-
totalAgents: number;
|
|
72
|
-
averageLoad: number;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
export declare function createSwarmOrchestrator(config: SwarmConfig): SwarmOrchestrator;
|
|
76
|
-
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/lib/orchestration/swarm.ts"],"names":[],"mappings":"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"}
|