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 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
  ![Aperçu du Terminal](assets/terminal_preview.png)
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
- OM_HOME="$(getent passwd "$OM_USER" | cut -d: -f6)"
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.0",
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
  ".": {
@@ -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
- const envContent = `# OverMind-MCP Environment Configuration
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=overmind_temp_password_change_me
318
- POSTGRES_DB=overmind_memory
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, '✅ Configuration .env créée: ' + envFile);
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
+ }