overmind-mcp 3.1.0 → 3.1.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.
- package/README.md +39 -0
- package/bin/install-overmind-native.sh +8 -1
- package/bin/install-overmind-unix.sh +14 -0
- package/package.json +4 -2
- package/scripts/postinstall.mjs +19 -5
- package/scripts/verify-install.mjs +170 -0
package/README.md
CHANGED
|
@@ -205,6 +205,45 @@ La migration est recommandée mais pas obligatoire immédiatement.
|
|
|
205
205
|
|
|
206
206
|
---
|
|
207
207
|
|
|
208
|
+
## ✅ Vérification post-install
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
overmind-verify
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Vérifie: binaire, .env, PostgreSQL, port 3099, MCP health, Hermes CLI.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 🌐 Webhook Tunnel (ngrok, optionnel)
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Installer ngrok (facultatif)
|
|
222
|
+
npm install -g ngrok
|
|
223
|
+
|
|
224
|
+
# Démarrer un tunnel vers le bridge
|
|
225
|
+
overmind-ngrok # bridge :3100, tous providers
|
|
226
|
+
overmind-ngrok --port 3149 # bt-sms :3149
|
|
227
|
+
overmind-ngrok --provider telegram # URL Telegram seulement
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 🔑 Ethereum Key Generator
|
|
233
|
+
|
|
234
|
+
Génère des clés EVM utilisées comme secrets pour les helpers Overmind:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
# Après npm install -g overmind-mcp
|
|
238
|
+
pip3 install eth-account
|
|
239
|
+
overmind-keygen --cli --count 10
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Le script `overmind-keygen` est inclus dans le package npm (`bin/overmind_keygen2000.py`).
|
|
243
|
+
Dépendance Python: `eth-account` (`pip3 install eth-account`).
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
208
247
|

|
|
209
248
|
|
|
210
249
|
_Projet propulsé par DeaMoN888 — 2026_
|
|
@@ -18,7 +18,14 @@ die() { echo -e "${R}[FAIL]${N} $*"; exit 1; }
|
|
|
18
18
|
|
|
19
19
|
# ---------- Constantes ----------
|
|
20
20
|
OM_USER="${SUDO_USER:-$(whoami)}"
|
|
21
|
-
|
|
21
|
+
# Multi-OS home resolution (Linux: getent, macOS: dscl, fallback: eval ~)
|
|
22
|
+
if command -v getent >/dev/null 2>&1; then
|
|
23
|
+
OM_HOME="$(getent passwd "$OM_USER" | cut -d: -f6)"
|
|
24
|
+
elif command -v dscl >/dev/null 2>&1; then
|
|
25
|
+
OM_HOME="$(dscl . -read "/Users/$OM_USER" NFSHomeDirectory | awk '{print $2}')"
|
|
26
|
+
else
|
|
27
|
+
OM_HOME="$(eval echo "~$OM_USER")"
|
|
28
|
+
fi
|
|
22
29
|
OM_DIR="$OM_HOME/.overmind"
|
|
23
30
|
LOG_DIR="$OM_DIR/logs"
|
|
24
31
|
PG_DB="overmind_memory"
|
|
@@ -44,11 +44,25 @@ if ! command -v node &> /dev/null; then
|
|
|
44
44
|
fi
|
|
45
45
|
|
|
46
46
|
echo -e "${GREEN}[OK] Node.js détecté:${NC}"
|
|
47
|
+
NODE_MAJ=$(node -p "process.versions.node.split('.')[0]")
|
|
47
48
|
node --version
|
|
48
49
|
echo -e "${GREEN}[OK] NPM détecté:${NC}"
|
|
49
50
|
npm --version
|
|
50
51
|
echo ""
|
|
51
52
|
|
|
53
|
+
# Check Node version compatibility (overmind-postgres-mcp requires <25)
|
|
54
|
+
if [ "$NODE_MAJ" -ge 25 ]; then
|
|
55
|
+
echo -e "${YELLOW}[WARN] Node $NODE_MAJ détecté. overmind-postgres-mcp nécessite Node < 25.${NC}"
|
|
56
|
+
if [ -d "$HOME/.nvm" ]; then
|
|
57
|
+
echo -e "${YELLOW}[INFO] Bascule vers Node 24 via nvm...${NC}"
|
|
58
|
+
\. "$HOME/.nvm/nvm.sh" 2>/dev/null
|
|
59
|
+
nvm install 24 2>/dev/null && nvm use 24 2>/dev/null && hash -r || true
|
|
60
|
+
echo -e "${GREEN}[OK] Node $(node --version) actif${NC}"
|
|
61
|
+
else
|
|
62
|
+
echo -e "${YELLOW}[INFO] Installez Node 24: nvm install 24 && nvm use 24${NC}"
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
|
|
52
66
|
# ============================================================
|
|
53
67
|
# STEP 2: Installer OverMind-MCP
|
|
54
68
|
# ============================================================
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overmind-mcp",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.1",
|
|
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",
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"overmind-postgres-mcp": "./scripts/postgres-manager.mjs",
|
|
13
13
|
"overmind-uninstall": "./scripts/uninstall.mjs",
|
|
14
14
|
"overmind-install-native": "./scripts/install-native.mjs",
|
|
15
|
-
"overmind-ngrok": "./scripts/ngrok-webhook.mjs"
|
|
15
|
+
"overmind-ngrok": "./scripts/ngrok-webhook.mjs",
|
|
16
|
+
"overmind-verify": "./scripts/verify-install.mjs",
|
|
17
|
+
"overmind-keygen": "./bin/overmind_keygen2000.py"
|
|
16
18
|
},
|
|
17
19
|
"exports": {
|
|
18
20
|
".": {
|
package/scripts/postinstall.mjs
CHANGED
|
@@ -198,6 +198,7 @@ async function setupPostgreSQL() {
|
|
|
198
198
|
'--name', 'overmind-postgres-pgvector',
|
|
199
199
|
'-p', '5432:5432',
|
|
200
200
|
'-e', 'POSTGRES_PASSWORD=overmind_temp_password_change_me',
|
|
201
|
+
'-e', 'POSTGRES_DB=overmind_memory',
|
|
201
202
|
'-e', 'POSTGRES_USER=postgres',
|
|
202
203
|
'-v', 'overmind_postgres_data:/var/lib/postgresql/data',
|
|
203
204
|
'--restart', 'unless-stopped',
|
|
@@ -307,25 +308,38 @@ function createEnvConfig() {
|
|
|
307
308
|
|
|
308
309
|
// Créer .env minimal si n'existe pas
|
|
309
310
|
if (!existsSync(envFile)) {
|
|
310
|
-
|
|
311
|
+
// Generate random password for security
|
|
312
|
+
const crypto = await import('crypto');
|
|
313
|
+
const randomPassword = crypto.randomBytes(18).toString('base64url');
|
|
314
|
+
|
|
315
|
+
const envContent = `# OverMind-MCP Environment Configuration (v3.1)
|
|
311
316
|
# Généré automatiquement par npm install
|
|
312
317
|
|
|
313
|
-
# PostgreSQL
|
|
318
|
+
# PostgreSQL + pgvector
|
|
314
319
|
POSTGRES_HOST=localhost
|
|
315
320
|
POSTGRES_PORT=5432
|
|
316
321
|
POSTGRES_USER=postgres
|
|
317
|
-
POSTGRES_PASSWORD
|
|
318
|
-
|
|
322
|
+
POSTGRES_PASSWORD=${randomPassword}
|
|
323
|
+
POSTGRES_DATABASE=overmind_memory
|
|
319
324
|
|
|
320
325
|
# OverMind
|
|
321
326
|
OVERMIND_WORKSPACE=${INSTALL_DIR}
|
|
322
327
|
OVERMIND_MEMORY_TYPE=postgres
|
|
328
|
+
OVERMIND_LOG_LEVEL=info
|
|
329
|
+
|
|
330
|
+
# Embeddings (Qwen 3 Embedding 8B - 4096D)
|
|
331
|
+
OVERMIND_EMBEDDING_MODEL=qwen/qwen3-embedding-8b
|
|
332
|
+
OVERMIND_EMBEDDING_DIMENSIONS=4096
|
|
333
|
+
# OVERMIND_EMBEDDING_URL=https://openrouter.ai/api/v1
|
|
334
|
+
# OVERMIND_EMBEDDING_KEY=sk-or-v1-...
|
|
323
335
|
|
|
324
336
|
# OpenTelemetry (optionnel)
|
|
325
337
|
OTEL_ENABLED=false
|
|
326
338
|
`;
|
|
327
339
|
writeFileSync(envFile, envContent);
|
|
328
|
-
log(COLORS.green, '✅
|
|
340
|
+
log(COLORS.green, '✅ .env créé: ' + envFile);
|
|
341
|
+
log(COLORS.yellow, '⚠️ Password généré automatiquement. Sauvegardez-le!');
|
|
342
|
+
log(COLORS.cyan, ' Éditez .env pour ajouter vos clés API LLM.');
|
|
329
343
|
}
|
|
330
344
|
|
|
331
345
|
// Créer .env.postgres pour overmind-postgres-mcp
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
* OVERMIND-MCP — Post-Install Verification (Smoke Test)
|
|
5
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
6
|
+
*
|
|
7
|
+
* Vérifie que l'installation overmind-mcp est fonctionnelle:
|
|
8
|
+
* 1. Binaire overmind accessible dans le PATH
|
|
9
|
+
* 2. ~/.overmind/.env existe et contient les vars critiques
|
|
10
|
+
* 3. PostgreSQL est accessible (Docker ou natif)
|
|
11
|
+
* 4. Port 3099 est libre ou répond
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* overmind-verify # après installation
|
|
15
|
+
* node scripts/verify-install.mjs
|
|
16
|
+
* ═══════════════════════════════════════════════════════════════════════════════
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { execSync } from 'child_process';
|
|
20
|
+
import { existsSync, readFileSync } from 'fs';
|
|
21
|
+
import { join } from 'path';
|
|
22
|
+
import { createRequire } from 'module';
|
|
23
|
+
|
|
24
|
+
const require = createRequire(import.meta.url);
|
|
25
|
+
let PKG_VERSION = 'unknown';
|
|
26
|
+
try {
|
|
27
|
+
const pkg = require('../../package.json');
|
|
28
|
+
PKG_VERSION = pkg.version;
|
|
29
|
+
} catch {}
|
|
30
|
+
|
|
31
|
+
const C = {
|
|
32
|
+
green: '\x1b[32m',
|
|
33
|
+
yellow: '\x1b[33m',
|
|
34
|
+
red: '\x1b[31m',
|
|
35
|
+
cyan: '\x1b[36m',
|
|
36
|
+
bold: '\x1b[1m',
|
|
37
|
+
reset: '\x1b[0m',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const HOME = process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH || '';
|
|
41
|
+
const OVERMIND_DIR = join(HOME, '.overmind');
|
|
42
|
+
const ENV_FILE = join(OVERMIND_DIR, '.env');
|
|
43
|
+
|
|
44
|
+
let passed = 0;
|
|
45
|
+
let warnings = 0;
|
|
46
|
+
let failed = 0;
|
|
47
|
+
|
|
48
|
+
function ok(msg) { console.log(`${C.green} ✅${C.reset} ${msg}`); passed++; }
|
|
49
|
+
function warn(msg) { console.log(`${C.yellow} ⚠️ ${C.reset} ${msg}`); warnings++; }
|
|
50
|
+
function fail(msg) { console.log(`${C.red} ❌${C.reset} ${msg}`); failed++; }
|
|
51
|
+
|
|
52
|
+
function runCmd(cmd) {
|
|
53
|
+
try { return execSync(cmd, { encoding: 'utf8', timeout: 5000, stdio: 'pipe' }).trim(); }
|
|
54
|
+
catch { return null; }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
58
|
+
|
|
59
|
+
console.log(`\n${C.bold}${C.cyan}══════════════════════════════════════════════════════${C.reset}`);
|
|
60
|
+
console.log(`${C.bold}${C.cyan} 🧪 Overmind Post-Install Verification v${PKG_VERSION}${C.reset}`);
|
|
61
|
+
console.log(`${C.bold}${C.cyan}══════════════════════════════════════════════════════${C.reset}\n`);
|
|
62
|
+
|
|
63
|
+
// 1. Binaire overmind
|
|
64
|
+
console.log(`${C.bold}1. Binaire overmind${C.reset}`);
|
|
65
|
+
const overmindBin = runCmd('which overmind') || runCmd('where overmind');
|
|
66
|
+
if (overmindBin) {
|
|
67
|
+
ok(`overmind trouvé: ${overmindBin}`);
|
|
68
|
+
} else {
|
|
69
|
+
fail('overmind non trouvé dans le PATH — rejeu: npm install -g overmind-mcp');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const version = runCmd('overmind --version 2>&1') || runCmd('overmind version 2>&1');
|
|
73
|
+
if (version && (version.includes(PKG_VERSION) || version.length > 0)) {
|
|
74
|
+
ok(`Version: ${version.split('\n')[0]}`);
|
|
75
|
+
} else {
|
|
76
|
+
warn('overmind --version ne répond pas (peut nécessiter .env configuré)');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// 2. .env
|
|
80
|
+
console.log(`\n${C.bold}2. Configuration .env${C.reset}`);
|
|
81
|
+
if (!existsSync(ENV_FILE)) {
|
|
82
|
+
fail(`${ENV_FILE} non trouvé — rejeu: overmind-setup`);
|
|
83
|
+
} else {
|
|
84
|
+
ok('.env existe');
|
|
85
|
+
const envContent = readFileSync(ENV_FILE, 'utf8');
|
|
86
|
+
|
|
87
|
+
const requiredVars = [
|
|
88
|
+
'POSTGRES_HOST',
|
|
89
|
+
'POSTGRES_DATABASE',
|
|
90
|
+
'POSTGRES_PASSWORD',
|
|
91
|
+
'POSTGRES_USER',
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
for (const varName of requiredVars) {
|
|
95
|
+
const re = new RegExp(`^${varName}=(.+)$`, 'm');
|
|
96
|
+
const match = envContent.match(re);
|
|
97
|
+
if (match && match[1].trim() && !match[1].includes('change_me')) {
|
|
98
|
+
ok(`${varName} = ${match[1].substring(0, 8)}...`);
|
|
99
|
+
} else if (match && match[1].includes('change_me')) {
|
|
100
|
+
warn(`${varName} contient encore le mot de passe par défaut — changez-le!`);
|
|
101
|
+
} else {
|
|
102
|
+
fail(`${varName} manquant dans .env`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Check for old POSTGRES_DB (v2.x compat)
|
|
107
|
+
if (envContent.match(/^POSTGRES_DB=/m) && !envContent.match(/^POSTGRES_DATABASE=/m)) {
|
|
108
|
+
warn('POSTGRES_DB détecté (v2.x) — renommez en POSTGRES_DATABASE (v3.x)');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// 3. PostgreSQL
|
|
113
|
+
console.log(`\n${C.bold}3. PostgreSQL${C.reset}`);
|
|
114
|
+
const pgDocker = runCmd('docker ps --filter "name=postgres" --format "{{.Names}}" 2>/dev/null');
|
|
115
|
+
const pgNative = runCmd('pg_isready -h localhost -p 5432 2>/dev/null');
|
|
116
|
+
|
|
117
|
+
if (pgDocker && pgDocker.length > 0) {
|
|
118
|
+
ok(`PostgreSQL Docker actif: ${pgDocker.split('\n')[0]}`);
|
|
119
|
+
} else if (pgNative && pgNative.includes('accepting')) {
|
|
120
|
+
ok('PostgreSQL natif actif sur :5432');
|
|
121
|
+
} else {
|
|
122
|
+
warn('PostgreSQL non détecté — démarrez-le: overmind-postgres-mcp up (Docker) ou sudo apt install postgresql (natif)');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 4. Port 3099
|
|
126
|
+
console.log(`\n${C.bold}4. Port Overmind MCP${C.reset}`);
|
|
127
|
+
const portCheck = runCmd('lsof -iTCP:3099 -sTCP:LISTEN 2>/dev/null') || runCmd('ss -tlnp 2>/dev/null | grep 3099');
|
|
128
|
+
if (portCheck && portCheck.length > 0) {
|
|
129
|
+
ok('Port 3099 en écoute — Overmind MCP est démarré');
|
|
130
|
+
} else {
|
|
131
|
+
warn('Port 3099 libre — démarrez: overmind --transport httpStream --port 3099');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// 5. MCP health check
|
|
135
|
+
if (portCheck) {
|
|
136
|
+
console.log(`\n${C.bold}5. MCP Health Check${C.reset}`);
|
|
137
|
+
const health = runCmd('curl -s -m 5 http://localhost:3099/mcp -X POST -H "Content-Type: application/json" -d \'{"jsonrpc":"2.0","id":1,"method":"ping","params":{}}\' 2>/dev/null');
|
|
138
|
+
if (health && (health.includes('jsonrpc') || health.includes('pong'))) {
|
|
139
|
+
ok('MCP :3099 répond au ping');
|
|
140
|
+
} else {
|
|
141
|
+
warn('MCP :3099 ne répond pas au ping (peut nécessiter auth token)');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// 6. Hermes (optionnel)
|
|
146
|
+
console.log(`\n${C.bold}6. Hermes CLI (optionnel)${C.reset}`);
|
|
147
|
+
const hermes = runCmd('which hermes 2>/dev/null');
|
|
148
|
+
if (hermes) {
|
|
149
|
+
const hermesVersion = runCmd('hermes version 2>/dev/null');
|
|
150
|
+
ok(`Hermes trouvé: ${hermes} (${hermesVersion || 'version inconnue'})`);
|
|
151
|
+
} else {
|
|
152
|
+
warn('Hermes non installé — requis pour les agents Hermes: pip install hermes-agent');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
156
|
+
|
|
157
|
+
console.log(`\n${C.bold}${C.cyan}══════════════════════════════════════════════════════${C.reset}`);
|
|
158
|
+
console.log(`${C.bold} Résultat: ${C.green}${passed} OK${C.reset}${failed > 0 ? `, ${C.red}${failed} échec${C.reset}` : ''}${warnings > 0 ? `, ${C.yellow}${warnings} avertissement${warnings > 1 ? 's' : ''}${C.reset}` : ''}`);
|
|
159
|
+
console.log(`${C.bold}${C.cyan}══════════════════════════════════════════════════════${C.reset}\n`);
|
|
160
|
+
|
|
161
|
+
if (failed > 0) {
|
|
162
|
+
console.log(`${C.red}${C.bold}❌ Échec — corrigez les erreurs ci-dessus avant de continuer.${C.reset}\n`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
} else if (warnings > 0) {
|
|
165
|
+
console.log(`${C.yellow}⚠️ Installation fonctionnelle avec avertissements.${C.reset}\n`);
|
|
166
|
+
process.exit(0);
|
|
167
|
+
} else {
|
|
168
|
+
console.log(`${C.green}${C.bold}✅ Tout est prêt! Overmind MCP est opérationnel.${C.reset}\n`);
|
|
169
|
+
process.exit(0);
|
|
170
|
+
}
|