overmind-mcp 2.8.6 → 2.8.8

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.
Files changed (83) hide show
  1. package/bin/launch.bat +40 -0
  2. package/bin/launch.js +78 -0
  3. package/bin/launch.sh +46 -0
  4. package/bin/restart_mcp.bat +3 -0
  5. package/bin/start_server.bat +3 -0
  6. package/bin/test_mcp.bat +4 -0
  7. package/dist/bin/cli.js +13 -0
  8. package/dist/bin/cli.js.map +1 -1
  9. package/dist/bin/launch.js +78 -0
  10. package/dist/bridge/BridgeProxy.d.ts +52 -0
  11. package/dist/bridge/BridgeProxy.d.ts.map +1 -0
  12. package/dist/bridge/BridgeProxy.js +265 -0
  13. package/dist/bridge/BridgeProxy.js.map +1 -0
  14. package/dist/bridge/OverBridgeService.d.ts +96 -0
  15. package/dist/bridge/OverBridgeService.d.ts.map +1 -0
  16. package/dist/bridge/OverBridgeService.js +334 -0
  17. package/dist/bridge/OverBridgeService.js.map +1 -0
  18. package/dist/bridge/index.d.ts +11 -0
  19. package/dist/bridge/index.d.ts.map +1 -0
  20. package/dist/bridge/index.js +11 -0
  21. package/dist/bridge/index.js.map +1 -0
  22. package/dist/bridge/types.d.ts +132 -0
  23. package/dist/bridge/types.d.ts.map +1 -0
  24. package/dist/bridge/types.js +19 -0
  25. package/dist/bridge/types.js.map +1 -0
  26. package/dist/bridge/utils.d.ts +48 -0
  27. package/dist/bridge/utils.d.ts.map +1 -0
  28. package/dist/bridge/utils.js +128 -0
  29. package/dist/bridge/utils.js.map +1 -0
  30. package/dist/lib/config.d.ts.map +1 -1
  31. package/dist/lib/config.js +11 -4
  32. package/dist/lib/config.js.map +1 -1
  33. package/dist/lib/envUtils.d.ts +2 -0
  34. package/dist/lib/envUtils.d.ts.map +1 -1
  35. package/dist/lib/envUtils.js +13 -2
  36. package/dist/lib/envUtils.js.map +1 -1
  37. package/dist/lib/logger.js +1 -1
  38. package/dist/lib/processRegistry.d.ts.map +1 -1
  39. package/dist/lib/processRegistry.js +34 -21
  40. package/dist/lib/processRegistry.js.map +1 -1
  41. package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
  42. package/dist/memory/PostgresMemoryProvider.js +14 -3
  43. package/dist/memory/PostgresMemoryProvider.js.map +1 -1
  44. package/dist/server.d.ts.map +1 -1
  45. package/dist/server.js +2 -1
  46. package/dist/server.js.map +1 -1
  47. package/dist/services/AgentManager.d.ts.map +1 -1
  48. package/dist/services/AgentManager.js +473 -97
  49. package/dist/services/AgentManager.js.map +1 -1
  50. package/dist/services/GeminiRunner.d.ts +18 -16
  51. package/dist/services/GeminiRunner.d.ts.map +1 -1
  52. package/dist/services/GeminiRunner.js +112 -126
  53. package/dist/services/GeminiRunner.js.map +1 -1
  54. package/dist/services/NousHermesRunner.d.ts.map +1 -1
  55. package/dist/services/NousHermesRunner.js +172 -56
  56. package/dist/services/NousHermesRunner.js.map +1 -1
  57. package/dist/tools/agent_control.d.ts +1 -1
  58. package/dist/tools/agent_control.d.ts.map +1 -1
  59. package/dist/tools/agent_control.js +4 -3
  60. package/dist/tools/agent_control.js.map +1 -1
  61. package/dist/tools/config_example.d.ts +1 -1
  62. package/dist/tools/create_agent.d.ts +1 -1
  63. package/dist/tools/manage_agents.d.ts +1 -1
  64. package/dist/tools/run_agent.d.ts +1 -1
  65. package/dist/tools/run_agent.d.ts.map +1 -1
  66. package/dist/tools/run_agent.js +3 -0
  67. package/dist/tools/run_agent.js.map +1 -1
  68. package/dist/tools/run_agents_parallel.d.ts +1 -1
  69. package/dist/tools/run_hermes.d.ts +1 -0
  70. package/dist/tools/run_hermes.d.ts.map +1 -1
  71. package/dist/tools/run_hermes.js +22 -15
  72. package/dist/tools/run_hermes.js.map +1 -1
  73. package/docs/provider-config-map.md +170 -105
  74. package/package.json +8 -10
  75. package/scripts/_db_check.py +10 -0
  76. package/scripts/postgres-manager.mjs +1 -1
  77. package/scripts/postinstall.mjs +10 -20
  78. package/scripts/setup.mjs +14 -16
  79. package/scripts/status_check.py +20 -0
  80. package/dist/services/AntigravityRunner.d.ts +0 -42
  81. package/dist/services/AntigravityRunner.d.ts.map +0 -1
  82. package/dist/services/AntigravityRunner.js +0 -404
  83. package/dist/services/AntigravityRunner.js.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "overmind-mcp",
3
- "version": "2.8.6",
4
- "preferGlobal": true,
3
+ "version": "2.8.8",
5
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.",
6
5
  "type": "module",
7
6
  "main": "dist/index.js",
@@ -45,14 +44,15 @@
45
44
  "version": "changeset version && node scripts/auto-changelog.mjs",
46
45
  "release": "pnpm run build && changeset publish",
47
46
  "prepublishOnly": "pnpm run rebuild",
48
- "postinstall": "node scripts/postinstall.mjs || exit 0",
47
+ "postinstall": "node scripts/postinstall.mjs",
49
48
  "setup": "overmind-setup",
50
49
  "setup:deps": "node scripts/install-dependencies.mjs",
51
50
  "postgres:up": "overmind-postgres-mcp up",
52
51
  "postgres:down": "overmind-postgres-mcp down",
53
52
  "postgres:status": "overmind-postgres-mcp status",
54
53
  "postgres:logs": "overmind-postgres-mcp logs",
55
- "postgres:reset": "overmind-postgres-mcp reset"
54
+ "postgres:reset": "overmind-postgres-mcp reset",
55
+ "prebuild": "node -e \"try{require('fs').copyFileSync('bin/launch.js','dist/bin/launch.js');console.log('Copied launch.js')}catch{console.log('dist/bin not ready yet')}\""
56
56
  },
57
57
  "keywords": [
58
58
  "mcp",
@@ -76,8 +76,8 @@
76
76
  "url": "https://discord.gg/4AR82phtBz"
77
77
  },
78
78
  "homepage": "https://deamondev888.github.io/overmind-mcp/",
79
- "engines": {
80
- "node": ">=20.0.0 <=25"
79
+ "engines": {
80
+ "node": ">=20.0.0"
81
81
  },
82
82
  "packageManager": "pnpm@10.18.0",
83
83
  "devDependencies": {
@@ -85,10 +85,10 @@
85
85
  "@eslint/js": "^10.0.1",
86
86
  "@types/node": "^25.6.2",
87
87
  "@types/pg": "^8.20.0",
88
- "@types/pino": "^7.0.5",
89
88
  "eslint": "^10.3.0",
90
89
  "eslint-config-prettier": "^10.1.8",
91
90
  "globals": "^17.6.0",
91
+ "pino-pretty": "^13.1.3",
92
92
  "prettier": "^3.8.3",
93
93
  "rimraf": "^6.1.3",
94
94
  "typescript": "^6.0.3",
@@ -102,13 +102,11 @@
102
102
  "overmind-postgres-mcp": "^1.3.0",
103
103
  "pg": "^8.20.0",
104
104
  "pino": "^10.3.1",
105
- "pino-pretty": "^13.1.3",
106
105
  "pino-roll": "^4.0.0",
107
106
  "tinyglobby": "^0.2.16",
108
- "tslib": "^2.8.1",
109
107
  "zod": "^4.4.3"
110
108
  },
111
109
  "peerDependencies": {
112
110
  "tslib": "^2.0.0"
113
111
  }
114
- }
112
+ }
@@ -0,0 +1,10 @@
1
+
2
+ import psycopg2
3
+ conn = psycopg2.connect(host="localhost", port=5432, dbname="financial_analyst", user="postgres")
4
+ cur = conn.cursor()
5
+ cur.execute("SELECT id, ligne, qte, description FROM bt_materiaux WHERE bon_id = 5 ORDER BY ligne")
6
+ rows = cur.fetchall()
7
+ print("MATERIAUX_BON5:", len(rows))
8
+ for r in rows:
9
+ print("LIGNE", r[1], "QTE", r[2], "DESC:", r[3][:80])
10
+ conn.close()
@@ -24,7 +24,7 @@ const __filename = fileURLToPath(import.meta.url);
24
24
  const __dirname = dirname(__filename);
25
25
 
26
26
  const PROJECT_ROOT = join(__dirname, '..');
27
- const COMPOSE_FILE = join(PROJECT_ROOT, 'docker-compose.yml');
27
+ const COMPOSE_FILE = join(PROJECT_ROOT, 'docker', 'docker-compose.yml');
28
28
 
29
29
  // ═══════════════════════════════════════════════════════════════════════════════
30
30
  // UTILS
@@ -262,17 +262,12 @@ function createEnvConfig() {
262
262
 
263
263
  // Copier .env.example → .env si existe
264
264
  if (existsSync(envExampleFile) && !existsSync(envFile)) {
265
- let envContent;
266
-
267
- if (process.platform === 'win32') {
268
- envContent = runCommand(`type "${envExampleFile}"`, { stdio: 'pipe' });
269
- } else {
270
- envContent = runCommand(`cat "${envExampleFile}"`, { stdio: 'pipe' });
271
- }
272
-
273
- if (envContent) {
274
- writeFileSync(envFile, envContent);
265
+ try {
266
+ const content = readFileSync(envExampleFile, 'utf8');
267
+ writeFileSync(envFile, content);
275
268
  log(COLORS.green, '✅ .env créé (à partir de .env.example)');
269
+ } catch (e) {
270
+ log(COLORS.yellow, '⚠️ Impossible de copier .env.example: ' + e.message);
276
271
  }
277
272
  }
278
273
 
@@ -335,17 +330,12 @@ EMBEDDING_CACHE_SIZE=1000
335
330
 
336
331
  // Copier .mcp.json.example → .mcp.json si existe
337
332
  if (existsSync(mcpExampleFile) && !existsSync(mcpFile)) {
338
- let mcpContent;
339
-
340
- if (process.platform === 'win32') {
341
- mcpContent = runCommand(`type "${mcpExampleFile}"`, { stdio: 'pipe' });
342
- } else {
343
- mcpContent = runCommand(`cat "${mcpExampleFile}"`, { stdio: 'pipe' });
344
- }
345
-
346
- if (mcpContent) {
347
- writeFileSync(mcpFile, mcpContent);
333
+ try {
334
+ const content = readFileSync(mcpExampleFile, 'utf8');
335
+ writeFileSync(mcpFile, content);
348
336
  log(COLORS.green, '✅ .mcp.json créé (à partir de .mcp.json.example)');
337
+ } catch (e) {
338
+ log(COLORS.yellow, '⚠️ Impossible de copier .mcp.json.example: ' + e.message);
349
339
  }
350
340
  }
351
341
  }
package/scripts/setup.mjs CHANGED
@@ -215,12 +215,12 @@ function setupConfigurationFiles() {
215
215
  }
216
216
 
217
217
  // Copy docker-compose file
218
- const dockerComposePath = join(projectRoot, 'docker-compose.overmind.yml');
219
- const destComposePath = join(INSTALL_DIR, 'docker-compose.overmind.yml');
218
+ const dockerComposePath = join(projectRoot, 'docker', 'docker-compose.yml');
219
+ const destComposePath = join(INSTALL_DIR, 'docker-compose.yml');
220
220
 
221
221
  if (existsSync(dockerComposePath)) {
222
222
  copyFileSync(dockerComposePath, destComposePath);
223
- console.log('✅ docker-compose.overmind.yml copié');
223
+ console.log('✅ docker-compose.yml copié');
224
224
  }
225
225
 
226
226
  // Copy .env.example if .env doesn't exist
@@ -232,12 +232,14 @@ function setupConfigurationFiles() {
232
232
  console.log('✅ .env créé (à éditer avec vos credentials)');
233
233
  }
234
234
 
235
- // Copy docker-manager script
236
- const dockerManagerPath = join(__dirname, 'docker-manager.mjs');
237
- const destManagerPath = join(INSTALL_DIR, 'docker-manager.mjs');
235
+ // Copy postgres-manager script
236
+ const dockerManagerPath = join(__dirname, 'postgres-manager.mjs');
237
+ const destManagerPath = join(INSTALL_DIR, 'postgres-manager.mjs');
238
238
 
239
- copyFileSync(dockerManagerPath, destManagerPath);
240
- console.log('✅ Scripts Docker installés');
239
+ if (existsSync(dockerManagerPath)) {
240
+ copyFileSync(dockerManagerPath, destManagerPath);
241
+ console.log('✅ Scripts Docker installés');
242
+ }
241
243
 
242
244
  return true;
243
245
  }
@@ -245,19 +247,15 @@ function setupConfigurationFiles() {
245
247
  async function startDockerServices() {
246
248
  logSection('DÉMARRAGE SERVICES DOCKER');
247
249
 
248
- const composeFile = join(INSTALL_DIR, 'docker-compose.overmind.yml');
250
+ const composeFile = join(INSTALL_DIR, 'docker-compose.yml');
249
251
 
250
- console.log('🚀 Démarrage RabbitMQ + Temporal...');
252
+ console.log('🚀 Démarrage PostgreSQL + pgvector...');
251
253
  try {
252
254
  await runCommandAsync(
253
255
  `docker-compose -f "${composeFile}" up -d`,
254
- 'Démarrage services'
256
+ 'Démarrage PostgreSQL'
255
257
  );
256
- console.log('✅ Services Docker démarrés');
257
- console.log('');
258
- console.log('🌐 Interfaces disponibles:');
259
- console.log(' 📊 RabbitMQ: http://localhost:15672');
260
- console.log(' 📈 Temporal: http://localhost:8088');
258
+ console.log('✅ PostgreSQL + pgvector démarré');
261
259
  return true;
262
260
  } catch (error) {
263
261
  console.error('❌ Erreur démarrage Docker:', error.message);
@@ -0,0 +1,20 @@
1
+ import psycopg2
2
+ conn = psycopg2.connect(host='localhost', port=5433, dbname='financial_analyst', user='postgres')
3
+ cur = conn.cursor()
4
+ cur.execute('''SELECT s.id, s.date_debut, s.date_fin, c.no_contrat, e.nom as employe
5
+ FROM bt_semaines s
6
+ JOIN bt_contrats c ON s.contrat_id = c.id
7
+ JOIN bt_employes e ON s.employe_id = e.id
8
+ ORDER BY s.date_debut DESC LIMIT 5''')
9
+ rows = cur.fetchall()
10
+ print('Dernieres semaines:')
11
+ for r in rows:
12
+ print(f' ID={r[0]} | {r[1]} a {r[2]} | contrat={r[3]} | employe={r[4]}')
13
+
14
+ cur.execute('SELECT COUNT(*) FROM bt_semaines')
15
+ print(f'Total semaines: {cur.fetchone()[0]}')
16
+
17
+ cur.execute('SELECT COUNT(*) FROM bt_employes WHERE actif=true')
18
+ print(f'Employes actifs: {cur.fetchone()[0]}')
19
+
20
+ conn.close()
@@ -1,42 +0,0 @@
1
- /**
2
- * AntigravityRunner — Exécute des agents IA via Antigravity IDE CLI
3
- *
4
- * Antigravity CLI est le runner natif de Google pour l'agent Antigravity.
5
- * Il est bundlé dans Antigravity IDE (C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\)
6
- *
7
- *-différences avec l'ancien gemini-cli:
8
- * - CLI intégré n'utilise pas npm (@google/gemini-cli)
9
- * - Authentification via Google OAuth interne (pas de fichier .env externe)
10
- * - Configuration par projet via .antigravity/ local
11
- * - Modes: GENERAL, CONTEXT_CHECK, PLAN, COMMAND, CASCADE, EVAL, ANTIGRAVITY_REVIEW, etc.
12
- */
13
- export interface RunAgentOptions {
14
- prompt: string;
15
- agentName?: string;
16
- sessionId?: string;
17
- autoResume?: boolean;
18
- cwd?: string;
19
- configPath?: string;
20
- silent?: boolean;
21
- model?: string;
22
- /** Mode Antigravity (défaut: GENERAL) */
23
- mode?: 'GENERAL' | 'CONTEXT_CHECK' | 'PLAN' | 'COMMAND' | 'CASCADE' | 'EVAL' | 'ANTIGRAVITY_REVIEW' | 'MQUERY' | 'COMMIT_MESSAGE' | 'CHECKPOINT' | 'FAST_APPLY';
24
- }
25
- export interface RunAgentResult {
26
- result: string;
27
- sessionId?: string;
28
- error?: string;
29
- rawOutput?: string;
30
- model?: string;
31
- nickname?: string;
32
- fallbackUsed?: string;
33
- }
34
- export declare class AntigravityRunner {
35
- private config;
36
- private timeoutMs;
37
- private tempFiles;
38
- constructor();
39
- private cleanupTempFiles;
40
- runAgent(options: RunAgentOptions): Promise<RunAgentResult>;
41
- }
42
- //# sourceMappingURL=AntigravityRunner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AntigravityRunner.d.ts","sourceRoot":"","sources":["../../src/services/AntigravityRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsGH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,oBAAoB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,CAAC;CACjK;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAgB;;IAOjC,OAAO,CAAC,gBAAgB;IAclB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAiXlE"}
@@ -1,404 +0,0 @@
1
- /**
2
- * AntigravityRunner — Exécute des agents IA via Antigravity IDE CLI
3
- *
4
- * Antigravity CLI est le runner natif de Google pour l'agent Antigravity.
5
- * Il est bundlé dans Antigravity IDE (C:\Users\Deamon\AppData\Local\Programs\Antigravity IDE\)
6
- *
7
- *-différences avec l'ancien gemini-cli:
8
- * - CLI intégré n'utilise pas npm (@google/gemini-cli)
9
- * - Authentification via Google OAuth interne (pas de fichier .env externe)
10
- * - Configuration par projet via .antigravity/ local
11
- * - Modes: GENERAL, CONTEXT_CHECK, PLAN, COMMAND, CASCADE, EVAL, ANTIGRAVITY_REVIEW, etc.
12
- */
13
- import fs from 'fs';
14
- import path from 'path';
15
- import { spawn } from 'child_process';
16
- import { CONFIG, resolveConfigPath } from '../lib/config.js';
17
- import { getLastSessionId, saveSessionId } from '../lib/sessions.js';
18
- import { interpolateEnvVars } from '../lib/envUtils.js';
19
- import { withSpan } from '../lib/telemetry.js';
20
- import { loadEnvQuietly } from '../lib/loadEnv.js';
21
- import pino from 'pino';
22
- import { registerProcess, linkSessionToPid, appendOutput, updateProcessStatus, killProcessTree, } from '../lib/processRegistry.js';
23
- const logger = pino({ name: 'AntigravityRunner' });
24
- // ============================================================================
25
- // CHEMINS ANTIGRAVITY (nouveaux pour Antigravity)
26
- // ============================================================================
27
- /** Dossier d'installation d'Antigravity IDE */
28
- const ANTIGRAVITY_IDE_PATH = path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Antigravity IDE');
29
- /** CLI Antigravity (Electron wrapper) */
30
- const ANTIGRAVITY_CLI_EXE = path.join(ANTIGRAVITY_IDE_PATH, 'Antigravity IDE.exe');
31
- /** Resources/app pour les outils internes */
32
- const ANTIGRAVITY_RESOURCES_APP = path.join(ANTIGRAVITY_IDE_PATH, 'resources', 'app');
33
- /** Bin containing language_server */
34
- const ANTIGRAVITY_BIN = path.join(ANTIGRAVITY_RESOURCES_APP, 'extensions', 'antigravity', 'bin');
35
- /** Language server pour les opérations de code */
36
- const ANTIGRAVITY_LANGUAGE_SERVER = path.join(ANTIGRAVITY_BIN, 'language_server_windows_x64.exe');
37
- /** Dossier .antigravity local par agent */
38
- function getAgentAntigravityDir(agentName, configPath) {
39
- const baseDir = configPath || process.cwd();
40
- return path.resolve(baseDir, '.antigravity', agentName ? `agent_${agentName}` : 'default');
41
- }
42
- /**
43
- * Vérifie si Antigravity IDE est installé
44
- */
45
- function isAntigravityInstalled() {
46
- return fs.existsSync(ANTIGRAVITY_CLI_EXE);
47
- }
48
- /**
49
- * Récupère le CLI à utiliser (Antigravity ou fallback)
50
- */
51
- function getAntigravityCommand() {
52
- if (isAntigravityInstalled()) {
53
- // Utiliser Antigravity IDE CLI (Electron-based)
54
- return {
55
- command: ANTIGRAVITY_CLI_EXE,
56
- args: [],
57
- useElectron: true,
58
- };
59
- }
60
- // Fallback: pas d'Antigravity installé
61
- return {
62
- command: 'echo',
63
- args: ['Antigravity IDE non installé'],
64
- useElectron: false,
65
- };
66
- }
67
- // ============================================================================
68
- // ANTIGRAVITYRUNNER
69
- // ============================================================================
70
- export class AntigravityRunner {
71
- config;
72
- timeoutMs;
73
- tempFiles = [];
74
- constructor() {
75
- this.config = CONFIG.CLAUDE;
76
- this.timeoutMs = CONFIG.TIMEOUT_MS || 900000; // 15 min default
77
- }
78
- cleanupTempFiles() {
79
- for (const tempFile of this.tempFiles) {
80
- try {
81
- if (fs.existsSync(tempFile)) {
82
- fs.unlinkSync(tempFile);
83
- logger.debug({ tempFile }, 'Cleaned up temp file');
84
- }
85
- }
86
- catch (err) {
87
- logger.warn({ tempFile, error: err }, 'Failed to cleanup temp file');
88
- }
89
- }
90
- this.tempFiles = [];
91
- }
92
- async runAgent(options) {
93
- // Load .env files first
94
- const cwd = options.cwd || process.cwd();
95
- loadEnvQuietly(path.join(cwd, '.env'));
96
- loadEnvQuietly(path.join(cwd, '../Workflow/.env'));
97
- const { prompt, agentName, autoResume, mode = 'GENERAL' } = options;
98
- let { sessionId } = options;
99
- const { PATHS } = this.config;
100
- // ========================================================================
101
- // VÉRIFICATION ANTIGRAVITY
102
- // ========================================================================
103
- if (!isAntigravityInstalled()) {
104
- return {
105
- result: '',
106
- error: `ANTIGRAVITY_NOT_INSTALLED: Antigravity IDE non trouvé.\nInstallez depuis: C:\\Users\\Deamon\\AppData\\Local\\Programs\\Antigravity IDE\\Antigravity IDE.exe`,
107
- };
108
- }
109
- // ========================================================================
110
- // ENV + SESSION
111
- // ========================================================================
112
- const agentCustomEnv = {
113
- ...process.env,
114
- ...(agentName ? { OVERMIND_AGENT_NAME: agentName } : {}),
115
- };
116
- // Auto Resume
117
- if (autoResume && agentName && !sessionId) {
118
- const lastId = await getLastSessionId(agentName, options.configPath, 'antigravity');
119
- if (lastId) {
120
- sessionId = lastId;
121
- }
122
- }
123
- // ========================================================================
124
- // SYSTEM PROMPT LOADING
125
- // ========================================================================
126
- let finalPrompt = prompt;
127
- if (agentName) {
128
- try {
129
- const settingsDir = path.dirname(PATHS.SETTINGS);
130
- let agentPromptPath = resolveConfigPath(path.join(settingsDir, 'agents', `${agentName}.md`), options.configPath);
131
- if (!fs.existsSync(agentPromptPath)) {
132
- agentPromptPath = resolveConfigPath(path.join(path.dirname(settingsDir), 'agents', `${agentName}.md`), options.configPath);
133
- }
134
- if (fs.existsSync(agentPromptPath)) {
135
- const systemPrompt = fs.readFileSync(agentPromptPath, 'utf8');
136
- finalPrompt = `${systemPrompt}\n\n[USER QUERY]:\n${prompt}`;
137
- }
138
- }
139
- catch (err) {
140
- logger.warn({ agentName, error: err }, 'Failed to load agent prompt');
141
- }
142
- }
143
- // ========================================================================
144
- // ANTIGRAVITY CONFIG (oauth, settings, mcp)
145
- // ========================================================================
146
- const agentAntigravityDir = getAgentAntigravityDir(agentName, options.configPath);
147
- // Créer le dossier .antigravity/<agent> si nécessaire
148
- if (!fs.existsSync(agentAntigravityDir)) {
149
- fs.mkdirSync(agentAntigravityDir, { recursive: true });
150
- }
151
- // IMPORTANT: Antigravity utilise son propre système d'auth OAuth
152
- // Pas besoin de sync les creds comme avec gemini-cli (c'était pour Gemini)
153
- // Antigravity a son propre token store dans %APPDATA%/Antigravity/
154
- // ========================================================================
155
- // MCP CONFIG POUR ANTIGRAVITY
156
- // ========================================================================
157
- const mcpPath = path.join(agentAntigravityDir, 'mcp.json');
158
- if (agentName) {
159
- const settingsDir = path.dirname(PATHS.SETTINGS);
160
- const agentSettingsPath = resolveConfigPath(path.join(settingsDir, `settings_${agentName}.json`), options.configPath);
161
- if (fs.existsSync(agentSettingsPath)) {
162
- let settings = JSON.parse(fs.readFileSync(agentSettingsPath, 'utf8'));
163
- settings = interpolateEnvVars(settings);
164
- if (settings.env) {
165
- Object.assign(agentCustomEnv, settings.env);
166
- }
167
- // Copier le MCP config si existant
168
- const originalMcpPath = resolveConfigPath(PATHS.MCP, options.configPath);
169
- if (fs.existsSync(originalMcpPath)) {
170
- const fullMcp = JSON.parse(fs.readFileSync(originalMcpPath, 'utf8'));
171
- let mcpToUse = fullMcp;
172
- if (settings.enableAllProjectMcpServers === false &&
173
- Array.isArray(settings.enabledMcpjsonServers)) {
174
- const filteredMcp = { mcpServers: {} };
175
- for (const serverName of settings.enabledMcpjsonServers) {
176
- if (fullMcp.mcpServers && fullMcp.mcpServers[serverName]) {
177
- filteredMcp.mcpServers[serverName] = fullMcp.mcpServers[serverName];
178
- }
179
- }
180
- mcpToUse = filteredMcp;
181
- }
182
- fs.writeFileSync(mcpPath, JSON.stringify(mcpToUse, null, 2));
183
- this.tempFiles.push(mcpPath);
184
- logger.info({ mcpPath }, 'MCP configuration synchronized for Antigravity');
185
- }
186
- }
187
- }
188
- // ========================================================================
189
- // SPAWN ANTIGRAVITY CLI
190
- // ========================================================================
191
- const isWin = process.platform === 'win32';
192
- // Antigravity utilise ELECTRON_RUN_AS_NODE pour invoquer le CLI interne
193
- const antigravityCmd = getAntigravityCommand();
194
- const argsSpawn = [];
195
- // Pour Antigravity CLI mode agent
196
- // Arguments via variables d'environnement + paramètres CLI
197
- if (antigravityCmd.useElectron) {
198
- // Antigravity CLI via Electron
199
- argsSpawn.push(ELECTRON_RUN_AS_NODE = '1', ANTIGRAVITY_CLI_EXE,
200
- // CLI args pour Antigravity
201
- '--chat', '--mode', mode, '--agent', agentName || 'default', '--project', agentAntigravityDir);
202
- }
203
- else {
204
- // Fallback - juste un message d'erreur
205
- argsSpawn.push('-c', `echo Antigravity non installé`);
206
- }
207
- // Mode Antigravity (pour le prompt)
208
- agentCustomEnv.ANTIGRAVITY_MODE = mode;
209
- agentCustomEnv.ANTIGRAVITY_PROJECT_DIR = agentAntigravityDir;
210
- agentCustomEnv.ANTIGRAVITY_AGENT_NAME = agentName || 'default';
211
- // Session si resume
212
- if (sessionId) {
213
- agentCustomEnv.ANTIGRAVITY_SESSION_ID = sessionId;
214
- }
215
- else if (autoResume) {
216
- agentCustomEnv.ANTIGRAVITY_RESUME = 'latest';
217
- }
218
- const runImpl = async (span) => {
219
- span.setAttribute('agentName', agentName || '');
220
- span.setAttribute('runner', 'antigravity');
221
- span.setAttribute('mode', mode);
222
- return new Promise((resolve) => {
223
- let resolved = false;
224
- const safeResolve = (value) => {
225
- if (!resolved) {
226
- resolved = true;
227
- resolve(value);
228
- }
229
- };
230
- // Construction de la commande
231
- let command;
232
- let spawnArgs;
233
- if (isAntigravityInstalled()) {
234
- // Exécuter via Electron en mode CLI
235
- command = process.execPath; // node
236
- spawnArgs = [
237
- ANTIGRAVITY_CLI_EXE,
238
- '--chat',
239
- '--mode', mode,
240
- ];
241
- // Ajouter le prompt via fichier temporaire pour éviter les problèmes de quotes
242
- const promptFile = path.join(agentAntigravityDir, '.prompt_temp.md');
243
- fs.writeFileSync(promptFile, finalPrompt, 'utf8');
244
- this.tempFiles.push(promptFile);
245
- spawnArgs.push('--prompt-file', promptFile);
246
- if (agentName) {
247
- spawnArgs.push('--agent', agentName);
248
- }
249
- if (sessionId) {
250
- spawnArgs.push('--resume', sessionId);
251
- }
252
- else if (autoResume) {
253
- spawnArgs.push('--resume', 'latest');
254
- }
255
- // Config Antigravity
256
- spawnArgs.push('--antigravity-dir', agentAntigravityDir);
257
- spawnArgs.push('--output-format', 'json');
258
- spawnArgs.push('--approval-mode', 'yolo');
259
- }
260
- else {
261
- command = 'echo';
262
- spawnArgs = ['Antigravity IDE non installé'];
263
- }
264
- const child = spawn(command, spawnArgs, {
265
- cwd: options.cwd || process.cwd(),
266
- shell: false,
267
- windowsHide: true,
268
- env: agentCustomEnv,
269
- });
270
- // Register process
271
- if (child.pid) {
272
- void registerProcess(child.pid, {
273
- agentName: agentName || '',
274
- runner: 'antigravity',
275
- configPath: options.configPath,
276
- });
277
- }
278
- let stdout = '';
279
- let stderr = '';
280
- const MAX_BUF = 10 * 1024 * 1024;
281
- const cleanup = () => {
282
- child.stdout?.removeAllListeners();
283
- child.stderr?.removeAllListeners();
284
- child.removeAllListeners();
285
- };
286
- child.stdout?.on('data', (data) => {
287
- const d = data.toString();
288
- if (child.pid && d) {
289
- void appendOutput(child.pid, d, options.configPath);
290
- }
291
- if (stdout.length + d.length > MAX_BUF)
292
- stdout = stdout.slice(-MAX_BUF);
293
- else
294
- stdout += d;
295
- });
296
- child.stderr?.on('data', (data) => {
297
- const d = data.toString();
298
- if (child.pid && d) {
299
- void appendOutput(child.pid, d, options.configPath);
300
- }
301
- if (stderr.length + d.length > MAX_BUF)
302
- stderr = stderr.slice(-MAX_BUF);
303
- else
304
- stderr += d;
305
- });
306
- const timeout = setTimeout(async () => {
307
- if (child.pid)
308
- await killProcessTree(child.pid);
309
- else
310
- child.kill();
311
- await new Promise((res) => setTimeout(res, 5000));
312
- if (!child.killed) {
313
- if (child.pid)
314
- await killProcessTree(child.pid);
315
- else
316
- child.kill('SIGKILL');
317
- }
318
- if (child.pid) {
319
- void updateProcessStatus(child.pid, 'failed', null, options.configPath);
320
- }
321
- cleanup();
322
- safeResolve({ result: '', error: 'TIMEOUT', rawOutput: stdout + stderr });
323
- }, this.timeoutMs);
324
- child.on('error', (err) => {
325
- clearTimeout(timeout);
326
- safeResolve({ result: '', error: `SPAWN_ERROR: ${err.message}`, rawOutput: '' });
327
- });
328
- child.on('close', async (code) => {
329
- clearTimeout(timeout);
330
- cleanup();
331
- if (code !== 0 && !stdout) {
332
- return safeResolve({
333
- result: '',
334
- error: code === 41 ? '🔑 Erreur Auth/API Key (OAuth/GCloud)' : `EXIT_CODE_${code}`,
335
- rawOutput: stderr,
336
- });
337
- }
338
- try {
339
- let jsonOutput = null;
340
- const trimmedStdout = stdout.trim();
341
- try {
342
- jsonOutput = JSON.parse(trimmedStdout);
343
- }
344
- catch (_) {
345
- // Parser failure - try to extract JSON from output
346
- const lastBrace = trimmedStdout.lastIndexOf('}');
347
- const firstBrace = trimmedStdout.lastIndexOf('{', lastBrace);
348
- if (firstBrace !== -1 && lastBrace !== -1) {
349
- try {
350
- jsonOutput = JSON.parse(trimmedStdout.substring(firstBrace, lastBrace + 1));
351
- }
352
- catch {
353
- // Ignore parsing errors
354
- }
355
- }
356
- }
357
- if (jsonOutput) {
358
- const resultText = jsonOutput.reply ||
359
- jsonOutput.result ||
360
- jsonOutput.output ||
361
- stdout.trim();
362
- const newSessionId = jsonOutput.session_id || sessionId;
363
- if (newSessionId && agentName) {
364
- await saveSessionId(agentName, newSessionId, options.configPath, 'antigravity');
365
- if (child.pid) {
366
- void linkSessionToPid(newSessionId, child.pid, options.configPath);
367
- }
368
- }
369
- return safeResolve({
370
- result: resultText,
371
- sessionId: newSessionId,
372
- rawOutput: stdout,
373
- });
374
- }
375
- // No JSON - return raw output
376
- safeResolve({
377
- result: stdout.trim(),
378
- sessionId: sessionId,
379
- rawOutput: stdout,
380
- });
381
- }
382
- catch {
383
- safeResolve({
384
- result: stdout.trim(),
385
- sessionId: sessionId,
386
- rawOutput: stdout,
387
- });
388
- }
389
- });
390
- if (child.stdin) {
391
- child.stdin.end();
392
- }
393
- });
394
- };
395
- const result = await withSpan('antigravity.runAgent', runImpl, {
396
- agentName: agentName || '',
397
- runner: 'antigravity',
398
- });
399
- // Cleanup
400
- this.cleanupTempFiles();
401
- return result;
402
- }
403
- }
404
- //# sourceMappingURL=AntigravityRunner.js.map