overmind-mcp 0.0.2-alpha
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/LICENSE +21 -0
- package/README.md +137 -0
- package/assets/overmind_core_closeup.png +0 -0
- package/assets/overmind_mcp_banner.png +0 -0
- package/assets/overmind_mcp_banner_slim.png +0 -0
- package/assets/overmind_mcp_final_banner.png +0 -0
- package/assets/overmind_mcp_pro_banner.png +0 -0
- package/assets/overmind_mcp_pro_banner_v2.png +0 -0
- package/assets/overmind_mcp_pro_banner_v3.png +0 -0
- package/assets/terminal_preview.png +0 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +481 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/InstallHelper.d.ts +14 -0
- package/dist/lib/InstallHelper.d.ts.map +1 -0
- package/dist/lib/InstallHelper.js +113 -0
- package/dist/lib/InstallHelper.js.map +1 -0
- package/dist/lib/config.d.ts +58 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +110 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/envUtils.d.ts +10 -0
- package/dist/lib/envUtils.d.ts.map +1 -0
- package/dist/lib/envUtils.js +24 -0
- package/dist/lib/envUtils.js.map +1 -0
- package/dist/lib/loadEnv.d.ts +2 -0
- package/dist/lib/loadEnv.d.ts.map +1 -0
- package/dist/lib/loadEnv.js +26 -0
- package/dist/lib/loadEnv.js.map +1 -0
- package/dist/lib/logger.d.ts +8 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +81 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/modelMapping.d.ts +18 -0
- package/dist/lib/modelMapping.d.ts.map +1 -0
- package/dist/lib/modelMapping.js +88 -0
- package/dist/lib/modelMapping.js.map +1 -0
- package/dist/lib/sessions.d.ts +4 -0
- package/dist/lib/sessions.d.ts.map +1 -0
- package/dist/lib/sessions.js +108 -0
- package/dist/lib/sessions.js.map +1 -0
- package/dist/memory/MemoryFactory.d.ts +11 -0
- package/dist/memory/MemoryFactory.d.ts.map +1 -0
- package/dist/memory/MemoryFactory.js +19 -0
- package/dist/memory/MemoryFactory.js.map +1 -0
- package/dist/memory/PostgresMemoryProvider.d.ts +29 -0
- package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -0
- package/dist/memory/PostgresMemoryProvider.js +372 -0
- package/dist/memory/PostgresMemoryProvider.js.map +1 -0
- package/dist/memory/types.d.ts +70 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/prompts/agent_prompts.d.ts +2 -0
- package/dist/prompts/agent_prompts.d.ts.map +1 -0
- package/dist/prompts/agent_prompts.js +21 -0
- package/dist/prompts/agent_prompts.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +174 -0
- package/dist/server.js.map +1 -0
- package/dist/services/AgentManager.d.ts +28 -0
- package/dist/services/AgentManager.d.ts.map +1 -0
- package/dist/services/AgentManager.js +393 -0
- package/dist/services/AgentManager.js.map +1 -0
- package/dist/services/ClaudeRunner.d.ts +27 -0
- package/dist/services/ClaudeRunner.d.ts.map +1 -0
- package/dist/services/ClaudeRunner.js +426 -0
- package/dist/services/ClaudeRunner.js.map +1 -0
- package/dist/services/ClineRunner.d.ts +23 -0
- package/dist/services/ClineRunner.d.ts.map +1 -0
- package/dist/services/ClineRunner.js +95 -0
- package/dist/services/ClineRunner.js.map +1 -0
- package/dist/services/GeminiRunner.d.ts +23 -0
- package/dist/services/GeminiRunner.d.ts.map +1 -0
- package/dist/services/GeminiRunner.js +236 -0
- package/dist/services/GeminiRunner.js.map +1 -0
- package/dist/services/KiloRunner.d.ts +32 -0
- package/dist/services/KiloRunner.d.ts.map +1 -0
- package/dist/services/KiloRunner.js +413 -0
- package/dist/services/KiloRunner.js.map +1 -0
- package/dist/services/NousHermesRunner.d.ts +24 -0
- package/dist/services/NousHermesRunner.d.ts.map +1 -0
- package/dist/services/NousHermesRunner.js +318 -0
- package/dist/services/NousHermesRunner.js.map +1 -0
- package/dist/services/OpenClawRunner.d.ts +22 -0
- package/dist/services/OpenClawRunner.d.ts.map +1 -0
- package/dist/services/OpenClawRunner.js +89 -0
- package/dist/services/OpenClawRunner.js.map +1 -0
- package/dist/services/OpenCodeRunner.d.ts +22 -0
- package/dist/services/OpenCodeRunner.d.ts.map +1 -0
- package/dist/services/OpenCodeRunner.js +91 -0
- package/dist/services/OpenCodeRunner.js.map +1 -0
- package/dist/services/PromptManager.d.ts +16 -0
- package/dist/services/PromptManager.d.ts.map +1 -0
- package/dist/services/PromptManager.js +54 -0
- package/dist/services/PromptManager.js.map +1 -0
- package/dist/services/QwenCliRunner.d.ts +22 -0
- package/dist/services/QwenCliRunner.d.ts.map +1 -0
- package/dist/services/QwenCliRunner.js +90 -0
- package/dist/services/QwenCliRunner.js.map +1 -0
- package/dist/tools/config_example.d.ts +18 -0
- package/dist/tools/config_example.d.ts.map +1 -0
- package/dist/tools/config_example.js +253 -0
- package/dist/tools/config_example.js.map +1 -0
- package/dist/tools/create_agent.d.ts +41 -0
- package/dist/tools/create_agent.d.ts.map +1 -0
- package/dist/tools/create_agent.js +75 -0
- package/dist/tools/create_agent.js.map +1 -0
- package/dist/tools/get_agent_configs.d.ts +18 -0
- package/dist/tools/get_agent_configs.d.ts.map +1 -0
- package/dist/tools/get_agent_configs.js +43 -0
- package/dist/tools/get_agent_configs.js.map +1 -0
- package/dist/tools/initialization_check.d.ts +2 -0
- package/dist/tools/initialization_check.d.ts.map +1 -0
- package/dist/tools/initialization_check.js +23 -0
- package/dist/tools/initialization_check.js.map +1 -0
- package/dist/tools/manage_agents.d.ts +80 -0
- package/dist/tools/manage_agents.d.ts.map +1 -0
- package/dist/tools/manage_agents.js +161 -0
- package/dist/tools/manage_agents.js.map +1 -0
- package/dist/tools/manage_prompts.d.ts +30 -0
- package/dist/tools/manage_prompts.d.ts.map +1 -0
- package/dist/tools/manage_prompts.js +64 -0
- package/dist/tools/manage_prompts.js.map +1 -0
- package/dist/tools/memory_runs.d.ts +14 -0
- package/dist/tools/memory_runs.d.ts.map +1 -0
- package/dist/tools/memory_runs.js +77 -0
- package/dist/tools/memory_runs.js.map +1 -0
- package/dist/tools/memory_search.d.ts +14 -0
- package/dist/tools/memory_search.d.ts.map +1 -0
- package/dist/tools/memory_search.js +46 -0
- package/dist/tools/memory_search.js.map +1 -0
- package/dist/tools/memory_store.d.ts +26 -0
- package/dist/tools/memory_store.d.ts.map +1 -0
- package/dist/tools/memory_store.js +46 -0
- package/dist/tools/memory_store.js.map +1 -0
- package/dist/tools/metadata.d.ts +20 -0
- package/dist/tools/metadata.d.ts.map +1 -0
- package/dist/tools/metadata.js +240 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/run_agent.d.ts +30 -0
- package/dist/tools/run_agent.d.ts.map +1 -0
- package/dist/tools/run_agent.js +80 -0
- package/dist/tools/run_agent.js.map +1 -0
- package/dist/tools/run_agent_cli.d.ts +21 -0
- package/dist/tools/run_agent_cli.d.ts.map +1 -0
- package/dist/tools/run_agent_cli.js +129 -0
- package/dist/tools/run_agent_cli.js.map +1 -0
- package/dist/tools/run_agents_parallel.d.ts +34 -0
- package/dist/tools/run_agents_parallel.d.ts.map +1 -0
- package/dist/tools/run_agents_parallel.js +104 -0
- package/dist/tools/run_agents_parallel.js.map +1 -0
- package/dist/tools/run_claude.d.ts +19 -0
- package/dist/tools/run_claude.d.ts.map +1 -0
- package/dist/tools/run_claude.js +99 -0
- package/dist/tools/run_claude.js.map +1 -0
- package/dist/tools/run_cline.d.ts +28 -0
- package/dist/tools/run_cline.d.ts.map +1 -0
- package/dist/tools/run_cline.js +77 -0
- package/dist/tools/run_cline.js.map +1 -0
- package/dist/tools/run_gemini.d.ts +24 -0
- package/dist/tools/run_gemini.d.ts.map +1 -0
- package/dist/tools/run_gemini.js +81 -0
- package/dist/tools/run_gemini.js.map +1 -0
- package/dist/tools/run_hermes.d.ts +25 -0
- package/dist/tools/run_hermes.d.ts.map +1 -0
- package/dist/tools/run_hermes.js +93 -0
- package/dist/tools/run_hermes.js.map +1 -0
- package/dist/tools/run_kilo.d.ts +32 -0
- package/dist/tools/run_kilo.d.ts.map +1 -0
- package/dist/tools/run_kilo.js +92 -0
- package/dist/tools/run_kilo.js.map +1 -0
- package/dist/tools/run_openclaw.d.ts +24 -0
- package/dist/tools/run_openclaw.d.ts.map +1 -0
- package/dist/tools/run_openclaw.js +74 -0
- package/dist/tools/run_openclaw.js.map +1 -0
- package/dist/tools/run_opencode.d.ts +24 -0
- package/dist/tools/run_opencode.d.ts.map +1 -0
- package/dist/tools/run_opencode.js +74 -0
- package/dist/tools/run_opencode.js.map +1 -0
- package/dist/tools/run_qwencli.d.ts +24 -0
- package/dist/tools/run_qwencli.d.ts.map +1 -0
- package/dist/tools/run_qwencli.js +59 -0
- package/dist/tools/run_qwencli.js.map +1 -0
- package/package.json +86 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { FastMCP } from 'fastmcp';
|
|
2
|
+
import { runAgent, runAgentSchema } from './tools/run_agent.js';
|
|
3
|
+
import { runAgentsParallel, runAgentsParallelSchema } from './tools/run_agents_parallel.js';
|
|
4
|
+
import { memorySearchTool, memorySearchSchema } from './tools/memory_search.js';
|
|
5
|
+
import { memoryStoreTool, memoryStoreSchema } from './tools/memory_store.js';
|
|
6
|
+
import { memoryRunsTool, memoryRunsSchema } from './tools/memory_runs.js';
|
|
7
|
+
import { createAgent, createAgentSchema } from './tools/create_agent.js';
|
|
8
|
+
import { createPrompt, createPromptSchema, editPrompt, editPromptSchema, } from './tools/manage_prompts.js';
|
|
9
|
+
import { listAgents, listAgentsSchema, deleteAgent, deleteAgentSchema, updateAgentConfig, updateAgentConfigSchema, } from './tools/manage_agents.js';
|
|
10
|
+
import { getAgentConfigs, getAgentConfigsSchema } from './tools/get_agent_configs.js';
|
|
11
|
+
import { configExample, configExampleSchema } from './tools/config_example.js';
|
|
12
|
+
import { metadataTool, metadataSchema } from './tools/metadata.js';
|
|
13
|
+
export function createServer(name = 'OverMind-MCP') {
|
|
14
|
+
const server = new FastMCP({
|
|
15
|
+
name,
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
});
|
|
18
|
+
// ─── OUTIL UNIFIÉ D'EXÉCUTION D'AGENT ────────────────────────────────────────
|
|
19
|
+
server.addTool({
|
|
20
|
+
name: 'run_agent',
|
|
21
|
+
description: `Exécute une commande sur un agent IA via le runner spécifié.
|
|
22
|
+
|
|
23
|
+
**Runners disponibles:**
|
|
24
|
+
- claude: Claude Code (Nécessite 'create_agent' au préalable)
|
|
25
|
+
- gemini: Gemini CLI
|
|
26
|
+
- kilo: Kilocode (modes: code, architect, ask, debug, orchestrator)
|
|
27
|
+
- qwencli: Qwen Code CLI (qwen -p)
|
|
28
|
+
- openclaw: OpenClaw (openclaw message send)
|
|
29
|
+
- cline: Cline (modes: plan, act)
|
|
30
|
+
- opencode: OpenCode (opencode run)
|
|
31
|
+
- hermes: Nous Hermes Agent (Nécessite 'create_agent' au préalable)
|
|
32
|
+
|
|
33
|
+
**Modèles recommandés :**
|
|
34
|
+
| Fournisseur | Modèle recommandé | Usage |
|
|
35
|
+
| :--- | :--- | :--- |
|
|
36
|
+
| **Mistral** | **Devstral 2** (\`codestral-latest\`) | Expert Coding & Développement |
|
|
37
|
+
| **Mistral** | **Mistral Large 3** (\`mistral-large-latest\`) | Raisonnement & Architecture |
|
|
38
|
+
| **Kilo** | **step 3.5 flash** | Polyvalent (262K context) |
|
|
39
|
+
| **Kilo** | **free** | Modèle par défaut gratuit |
|
|
40
|
+
|
|
41
|
+
**Parameters:**
|
|
42
|
+
- runner: Type de runner (claude, gemini, etc.)
|
|
43
|
+
- prompt: Instruction à envoyer à l'agent
|
|
44
|
+
- agentName: Nom de l'agent (optionnel)
|
|
45
|
+
- path: Répertoire de travail (CWD). Par défaut: dossier Overmind.
|
|
46
|
+
- config: Répertoire racine de l'Overmind. Par défaut: dossier Overmind.
|
|
47
|
+
|
|
48
|
+
**Exemples:**
|
|
49
|
+
run_agent(runner: "claude", agentName: "expert_python", prompt: "Analyse ce code")
|
|
50
|
+
run_agent(runner: "kilo", agentName: "architect", mode: "architect", prompt: "Conçois une API REST", path: "./my-project")
|
|
51
|
+
run_agent(runner: "cline", agentName: "planner", mode: "plan", prompt: "Planifie l'implémentation")`,
|
|
52
|
+
parameters: runAgentSchema,
|
|
53
|
+
execute: runAgent,
|
|
54
|
+
});
|
|
55
|
+
// ─── OUTIL PARALLÈLE MULTI-AGENTS ──────────────────────────────────────────
|
|
56
|
+
server.addTool({
|
|
57
|
+
name: 'run_agents_parallel',
|
|
58
|
+
description: `🚀 Lance plusieurs agents IA EN PARALLÈLE depuis un seul appel MCP. Polyglotte (mixe runners/modèles). Retourne les résultats consolidés une fois tous terminés.
|
|
59
|
+
|
|
60
|
+
**Cas d'usage :** Orchestration de flotte, rotation de tokens, tâches indépendantes simultanées.
|
|
61
|
+
|
|
62
|
+
**Exemple :**
|
|
63
|
+
run_agents_parallel(agents: [
|
|
64
|
+
{ taskId: "build", runner: "kilo", agentName: "mistral_1", prompt: "npm run build", path: "./project" },
|
|
65
|
+
{ taskId: "lint", runner: "kilo", agentName: "mistral_2", prompt: "npm run lint", path: "./project" },
|
|
66
|
+
{ taskId: "test", runner: "kilo", agentName: "mistral_3", prompt: "npm test", path: "./project" },
|
|
67
|
+
{ taskId: "audit", runner: "kilo", agentName: "mistral_4", prompt: "Analyse le fichier audit.md", path: "./project" },
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
**Options :**
|
|
71
|
+
- waitAll (défaut: true) : attend tous les agents avant de retourner.
|
|
72
|
+
- waitAll: false : retourne dès que le premier agent réussit (race mode).`,
|
|
73
|
+
parameters: runAgentsParallelSchema,
|
|
74
|
+
execute: runAgentsParallel,
|
|
75
|
+
});
|
|
76
|
+
// Outil : Créer un nouvel agent (tous runners supportés)
|
|
77
|
+
server.addTool({
|
|
78
|
+
name: 'create_agent',
|
|
79
|
+
description: `Crée un nouvel agent (Prompt + Config) compatible avec tous les runners.
|
|
80
|
+
|
|
81
|
+
**Runners supportés:** claude, gemini, kilo, qwencli, openclaw, cline, opencode, hermes
|
|
82
|
+
|
|
83
|
+
**Exemples:**
|
|
84
|
+
create_agent(name: "expert_python", runner: "claude", prompt: "Tu es un expert Python...")
|
|
85
|
+
create_agent(name: "architecte", runner: "kilo", mode: "architect", prompt: "Tu es un architecte logiciel...")
|
|
86
|
+
create_agent(name: "planner", runner: "cline", mode: "plan", prompt: "Tu es un planificateur de tâches...")`,
|
|
87
|
+
parameters: createAgentSchema,
|
|
88
|
+
execute: createAgent,
|
|
89
|
+
});
|
|
90
|
+
// Outil : Lister les agents
|
|
91
|
+
server.addTool({
|
|
92
|
+
name: 'list_agents',
|
|
93
|
+
description: "Liste tous les agents disponibles. Option 'details=true' pour voir la config complète.",
|
|
94
|
+
parameters: listAgentsSchema,
|
|
95
|
+
execute: listAgents,
|
|
96
|
+
});
|
|
97
|
+
// Outil : Supprimer un agent
|
|
98
|
+
server.addTool({
|
|
99
|
+
name: 'delete_agent',
|
|
100
|
+
description: 'Supprime définitivement un agent (Prompt et Config)',
|
|
101
|
+
parameters: deleteAgentSchema,
|
|
102
|
+
execute: deleteAgent,
|
|
103
|
+
});
|
|
104
|
+
// Outil : Mettre à jour la config d'un agent
|
|
105
|
+
server.addTool({
|
|
106
|
+
name: 'update_agent_config',
|
|
107
|
+
description: "Modifie la configuration technique d'un agent (Runner, Modèle, Serveurs MCP, Variables d'environnement) OU réécrit entièrement l'un des 4 fichiers (prompt, settings, mcp, skill)",
|
|
108
|
+
parameters: updateAgentConfigSchema,
|
|
109
|
+
execute: updateAgentConfig,
|
|
110
|
+
});
|
|
111
|
+
// ─── GESTION DES PROMPTS ─────────────────────────────────────────────────────
|
|
112
|
+
// Outil : Créer un prompt seul
|
|
113
|
+
server.addTool({
|
|
114
|
+
name: 'create_prompt',
|
|
115
|
+
description: 'Crée ou écrase un fichier prompt Markdown (Persona)',
|
|
116
|
+
parameters: createPromptSchema,
|
|
117
|
+
execute: createPrompt,
|
|
118
|
+
});
|
|
119
|
+
// Outil : Éditer un prompt par search/replace (Diff)
|
|
120
|
+
server.addTool({
|
|
121
|
+
name: 'edit_prompt',
|
|
122
|
+
description: 'Modifie un prompt existant en remplaçant un bloc de texte spécifique',
|
|
123
|
+
parameters: editPromptSchema,
|
|
124
|
+
execute: editPrompt,
|
|
125
|
+
});
|
|
126
|
+
// ─── MÉMOIRE OVERMIND ─────────────────────────────────────────────────────────
|
|
127
|
+
server.addTool({
|
|
128
|
+
name: 'memory_search',
|
|
129
|
+
description: 'Recherche sémantique + full-text dans la mémoire OverMind (connaissances + historique)',
|
|
130
|
+
parameters: memorySearchSchema,
|
|
131
|
+
execute: memorySearchTool,
|
|
132
|
+
});
|
|
133
|
+
server.addTool({
|
|
134
|
+
name: 'memory_store',
|
|
135
|
+
description: "Mémorise durablement une connaissance, décision ou pattern d'orchestration",
|
|
136
|
+
parameters: memoryStoreSchema,
|
|
137
|
+
execute: memoryStoreTool,
|
|
138
|
+
});
|
|
139
|
+
server.addTool({
|
|
140
|
+
name: 'memory_runs',
|
|
141
|
+
description: "Liste l'historique des runs d'agents enregistrés par OverMind (avec stats optionnelles)",
|
|
142
|
+
parameters: memoryRunsSchema,
|
|
143
|
+
execute: memoryRunsTool,
|
|
144
|
+
});
|
|
145
|
+
server.addTool({
|
|
146
|
+
name: 'get_agent_configs',
|
|
147
|
+
description: "Affiche les 4 fichiers de configuration d'un agent (prompt.md, .mcp.json, settings.json, skill.md)",
|
|
148
|
+
parameters: getAgentConfigsSchema,
|
|
149
|
+
execute: getAgentConfigs,
|
|
150
|
+
});
|
|
151
|
+
server.addTool({
|
|
152
|
+
name: 'config_example',
|
|
153
|
+
description: 'Fournit des exemples de configuration settings.json pour différents LLM (GLM, MiniMax, OpenRouter).',
|
|
154
|
+
parameters: configExampleSchema,
|
|
155
|
+
execute: configExample,
|
|
156
|
+
});
|
|
157
|
+
// ─── METADATA ────────────────────────────────────────────────────────────────
|
|
158
|
+
server.addTool({
|
|
159
|
+
name: 'metadata',
|
|
160
|
+
description: `Retourne les métadonnées projet instantanément : arborescence, fichiers de config, statistiques (fichiers, lignes, langages).
|
|
161
|
+
|
|
162
|
+
**Paramètres:**
|
|
163
|
+
- path: Chemin du projet (défaut: répertoire courant)
|
|
164
|
+
- depth: Profondeur de l'arborescence (défaut: 3)
|
|
165
|
+
- includeStats: Inclure les statistiques de code (défaut: true)
|
|
166
|
+
|
|
167
|
+
**Exemple:**
|
|
168
|
+
metadata(path: "./my-project", depth: 4, includeStats: true)`,
|
|
169
|
+
parameters: metadataSchema,
|
|
170
|
+
execute: metadataTool,
|
|
171
|
+
});
|
|
172
|
+
return server;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface AgentConfigUpdates {
|
|
2
|
+
model?: string;
|
|
3
|
+
mcpServers?: string[];
|
|
4
|
+
env?: Record<string, string>;
|
|
5
|
+
runner?: string;
|
|
6
|
+
mode?: string;
|
|
7
|
+
cliPath?: string;
|
|
8
|
+
file?: 'prompt.md' | 'settings.json' | '.mcp.json' | 'skill.md';
|
|
9
|
+
content?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class AgentManager {
|
|
12
|
+
private claudeDir;
|
|
13
|
+
constructor(customClaudeDir?: string);
|
|
14
|
+
private getAvailableMcpServers;
|
|
15
|
+
listAgents(details?: boolean): Promise<string[]>;
|
|
16
|
+
deleteAgent(name: string): Promise<{
|
|
17
|
+
deletedFiles: string[];
|
|
18
|
+
errors: string[];
|
|
19
|
+
}>;
|
|
20
|
+
updateAgentConfig(name: string, updates: AgentConfigUpdates): Promise<string[]>;
|
|
21
|
+
createAgent(name: string, prompt: string, model: string, copyEnvFrom?: string, projectRoot?: string, runner?: string, mode?: string, cliPath?: string): Promise<{
|
|
22
|
+
promptPath: string;
|
|
23
|
+
settingsPath: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
}>;
|
|
26
|
+
getDetailedConfigs(name: string): Promise<Record<string, string>>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=AgentManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentManager.d.ts","sourceRoot":"","sources":["../../src/services/AgentManager.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,GAAG,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,eAAe,CAAC,EAAE,MAAM;YAQtB,sBAAsB;IAW9B,UAAU,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmFvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAuBhF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4I/E,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAuJlE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAkCxE"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { CONFIG, resolveConfigPath, getWorkspaceDir } from '../lib/config.js';
|
|
4
|
+
import { getMemoryProvider } from '../memory/MemoryFactory.js';
|
|
5
|
+
import { interpolateEnvVars } from '../lib/envUtils.js';
|
|
6
|
+
export class AgentManager {
|
|
7
|
+
claudeDir;
|
|
8
|
+
constructor(customClaudeDir) {
|
|
9
|
+
if (customClaudeDir) {
|
|
10
|
+
this.claudeDir = customClaudeDir;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
this.claudeDir = path.join(getWorkspaceDir(), '.claude');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async getAvailableMcpServers() {
|
|
17
|
+
try {
|
|
18
|
+
const mcpPath = resolveConfigPath(CONFIG.CLAUDE.PATHS.MCP);
|
|
19
|
+
const content = await fs.readFile(mcpPath, 'utf-8');
|
|
20
|
+
const json = JSON.parse(content);
|
|
21
|
+
return Object.keys(json.mcpServers || {});
|
|
22
|
+
}
|
|
23
|
+
catch (_e) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async listAgents(details = false) {
|
|
28
|
+
const agentsDir = path.join(this.claudeDir, 'agents');
|
|
29
|
+
await fs.mkdir(agentsDir, { recursive: true });
|
|
30
|
+
const files = await fs.readdir(agentsDir);
|
|
31
|
+
const agentFiles = files.filter((f) => f.endsWith('.md'));
|
|
32
|
+
const agentsList = [];
|
|
33
|
+
const availableServers = await this.getAvailableMcpServers();
|
|
34
|
+
for (const file of agentFiles) {
|
|
35
|
+
const agentName = file.replace('.md', '');
|
|
36
|
+
if (!details) {
|
|
37
|
+
agentsList.push(`- ${agentName}`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
let info = `🤖 **${agentName}**`;
|
|
41
|
+
const settingsPath = path.join(this.claudeDir, `settings_${agentName}.json`);
|
|
42
|
+
try {
|
|
43
|
+
const settingsContent = await fs.readFile(settingsPath, 'utf-8');
|
|
44
|
+
let settings = JSON.parse(settingsContent);
|
|
45
|
+
// --- New interpolation logic ---
|
|
46
|
+
settings = interpolateEnvVars(settings);
|
|
47
|
+
const model = settings.env?.ANTHROPIC_MODEL || settings.model || 'settings-default';
|
|
48
|
+
const runner = settings.runner || 'claude';
|
|
49
|
+
const servers = settings.enabledMcpjsonServers || [];
|
|
50
|
+
// Inférence du provider
|
|
51
|
+
let provider = settings.provider || settings.env?.PROVIDER || 'auto';
|
|
52
|
+
if (provider === 'auto') {
|
|
53
|
+
if (settings.env?.MISTRAL_API_KEY)
|
|
54
|
+
provider = 'mistral';
|
|
55
|
+
else if (settings.env?.OPENAI_API_KEY)
|
|
56
|
+
provider = 'openai';
|
|
57
|
+
else if (settings.env?.NVIDIA_API_KEY || settings.env?.NVAPI_KEY)
|
|
58
|
+
provider = 'nvidia';
|
|
59
|
+
else if (settings.env?.GEMINI_API_KEY)
|
|
60
|
+
provider = 'google';
|
|
61
|
+
else if (model.includes('mistral') ||
|
|
62
|
+
model.includes('codestral') ||
|
|
63
|
+
model.includes('devstral'))
|
|
64
|
+
provider = 'mistral';
|
|
65
|
+
else if (model.includes('gpt-'))
|
|
66
|
+
provider = 'openai';
|
|
67
|
+
else if (model.includes('gemini'))
|
|
68
|
+
provider = 'google';
|
|
69
|
+
else if (model.includes('claude'))
|
|
70
|
+
provider = 'anthropic';
|
|
71
|
+
}
|
|
72
|
+
const serverStatus = servers.map((s) => {
|
|
73
|
+
if (availableServers.includes(s))
|
|
74
|
+
return s;
|
|
75
|
+
// Recherche de suggestions (typo)
|
|
76
|
+
const suggestion = availableServers.find((v) => v.toLowerCase().includes(s.toLowerCase()) ||
|
|
77
|
+
s.toLowerCase().includes(v.toLowerCase()));
|
|
78
|
+
return suggestion
|
|
79
|
+
? `${s} (⚠️ Nom incorrect ? Suggestion: **${suggestion}**)`
|
|
80
|
+
: `${s} (⚠️ Absent de mcp.json)`;
|
|
81
|
+
});
|
|
82
|
+
info += `\n - Runner : ${runner}`;
|
|
83
|
+
info += `\n - Model : ${model}`;
|
|
84
|
+
info += `\n - Provider: ${provider}`;
|
|
85
|
+
info += `\n - Serveurs MCP : ${servers.length > 0 ? serverStatus.join(', ') : 'Aucun'}`;
|
|
86
|
+
}
|
|
87
|
+
catch (_e) {
|
|
88
|
+
info += `\n - Config : ⚠️ Manquante ou invalide (${settingsPath})`;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const promptPath = path.join(agentsDir, file);
|
|
92
|
+
const promptStat = await fs.stat(promptPath);
|
|
93
|
+
info += `\n - Prompt Size : ${promptStat.size} bytes`;
|
|
94
|
+
}
|
|
95
|
+
catch (_e) {
|
|
96
|
+
// Ignore missing or inaccessible prompt file
|
|
97
|
+
}
|
|
98
|
+
agentsList.push(info);
|
|
99
|
+
}
|
|
100
|
+
return agentsList;
|
|
101
|
+
}
|
|
102
|
+
async deleteAgent(name) {
|
|
103
|
+
const agentsDir = path.join(this.claudeDir, 'agents');
|
|
104
|
+
const promptPath = path.join(agentsDir, `${name}.md`);
|
|
105
|
+
const settingsPath = path.join(this.claudeDir, `settings_${name}.json`);
|
|
106
|
+
const tmpMcpPath = path.join(this.claudeDir, `mcp_${name}_tmp.json`);
|
|
107
|
+
const deletedFiles = [];
|
|
108
|
+
const errors = [];
|
|
109
|
+
for (const file of [promptPath, settingsPath, tmpMcpPath]) {
|
|
110
|
+
try {
|
|
111
|
+
await fs.unlink(file);
|
|
112
|
+
deletedFiles.push(file);
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
if (e && typeof e === 'object' && 'code' in e && e.code !== 'ENOENT') {
|
|
116
|
+
errors.push(`${path.basename(file)}: ${e instanceof Error ? e.message : String(e)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { deletedFiles, errors };
|
|
121
|
+
}
|
|
122
|
+
async updateAgentConfig(name, updates) {
|
|
123
|
+
const changes = [];
|
|
124
|
+
const claudeDir = this.claudeDir;
|
|
125
|
+
// --- MODE RÉÉCRITURE DE FICHIER COMPLET ---
|
|
126
|
+
if (updates.file && updates.content) {
|
|
127
|
+
let filePath;
|
|
128
|
+
switch (updates.file) {
|
|
129
|
+
case 'prompt.md':
|
|
130
|
+
filePath = path.join(claudeDir, 'agents', `${name}.md`);
|
|
131
|
+
break;
|
|
132
|
+
case 'settings.json':
|
|
133
|
+
filePath = path.join(claudeDir, `settings_${name}.json`);
|
|
134
|
+
break;
|
|
135
|
+
case '.mcp.json':
|
|
136
|
+
filePath = path.join(claudeDir, `.mcp.${name}.json`);
|
|
137
|
+
break;
|
|
138
|
+
case 'skill.md':
|
|
139
|
+
filePath = path.join(claudeDir, 'agents', `${name}_skill.md`);
|
|
140
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
141
|
+
break;
|
|
142
|
+
default:
|
|
143
|
+
throw new Error(`Fichier non supporté: ${updates.file}`);
|
|
144
|
+
}
|
|
145
|
+
await fs.writeFile(filePath, updates.content, 'utf-8');
|
|
146
|
+
changes.push(`✅ Fichier **${updates.file}** réécrit pour l'agent **${name}**.`);
|
|
147
|
+
// Si on réécrit settings.json, on ne fait pas les updates unitaires (déjà écrasé)
|
|
148
|
+
if (updates.file === 'settings.json')
|
|
149
|
+
return changes;
|
|
150
|
+
}
|
|
151
|
+
// --- MODE MISE À JOUR UNITAIRE (settings.json) ---
|
|
152
|
+
const settingsPath = path.join(claudeDir, `settings_${name}.json`);
|
|
153
|
+
let settings;
|
|
154
|
+
try {
|
|
155
|
+
const content = await fs.readFile(settingsPath, 'utf-8');
|
|
156
|
+
settings = JSON.parse(content);
|
|
157
|
+
}
|
|
158
|
+
catch (_e) {
|
|
159
|
+
// Si on veut faire des updates unitaires, le settings doit exister
|
|
160
|
+
if (updates.model ||
|
|
161
|
+
updates.mcpServers ||
|
|
162
|
+
updates.env ||
|
|
163
|
+
updates.runner ||
|
|
164
|
+
updates.mode ||
|
|
165
|
+
updates.cliPath) {
|
|
166
|
+
throw new Error(`Impossible de modifier les paramètres unitaires : settings_${name}.json est introuvable.`);
|
|
167
|
+
}
|
|
168
|
+
return changes; // Rien à faire
|
|
169
|
+
}
|
|
170
|
+
if (updates.model) {
|
|
171
|
+
settings.env = settings.env || {};
|
|
172
|
+
const oldModel = settings.env.ANTHROPIC_MODEL;
|
|
173
|
+
settings.env.ANTHROPIC_MODEL = updates.model;
|
|
174
|
+
changes.push(`- Modèle : ${oldModel} -> ${updates.model}`);
|
|
175
|
+
}
|
|
176
|
+
if (updates.mcpServers) {
|
|
177
|
+
const oldServers = settings.enabledMcpjsonServers || [];
|
|
178
|
+
const availableServers = await this.getAvailableMcpServers();
|
|
179
|
+
const unknownServers = updates.mcpServers.filter((s) => !availableServers.includes(s));
|
|
180
|
+
if (unknownServers.length > 0 && availableServers.length > 0) {
|
|
181
|
+
changes.push(`⚠️ **ATTENTION:** Serveurs inconnus détectés: ${unknownServers.join(', ')}. Ils ne sont PAS dans mcp.json.\n Serveurs valides: ${availableServers.join(', ')}`);
|
|
182
|
+
}
|
|
183
|
+
settings.enabledMcpjsonServers = updates.mcpServers;
|
|
184
|
+
changes.push(`- Serveurs MCP : [${oldServers.join(', ')}] -> [${updates.mcpServers.join(', ')}]`);
|
|
185
|
+
// 📂 UPDATE .mcp.<name>.json
|
|
186
|
+
try {
|
|
187
|
+
const globalMcpPath = resolveConfigPath(CONFIG.CLAUDE.PATHS.MCP);
|
|
188
|
+
const globalMcpContent = await fs.readFile(globalMcpPath, 'utf-8');
|
|
189
|
+
const globalMcp = JSON.parse(globalMcpContent);
|
|
190
|
+
const agentMcpServers = {};
|
|
191
|
+
updates.mcpServers.forEach((serverName) => {
|
|
192
|
+
if (globalMcp.mcpServers && globalMcp.mcpServers[serverName]) {
|
|
193
|
+
agentMcpServers[serverName] = globalMcp.mcpServers[serverName];
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
const agentMcpPath = path.join(this.claudeDir, `.mcp.${name}.json`);
|
|
197
|
+
await fs.writeFile(agentMcpPath, JSON.stringify({ mcpServers: agentMcpServers }, null, 2), 'utf-8');
|
|
198
|
+
changes.push(`✅ Fichier .mcp.${name}.json mis à jour avec les nouveaux serveurs.`);
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
changes.push(`⚠️ Échec de la mise à jour de .mcp.${name}.json: ${e.message}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (updates.env) {
|
|
205
|
+
settings.env = settings.env || {};
|
|
206
|
+
for (const [key, value] of Object.entries(updates.env)) {
|
|
207
|
+
const oldVal = settings.env[key] ? '***' : '(undefined)';
|
|
208
|
+
settings.env[key] = value;
|
|
209
|
+
changes.push(`- Env Var '${key}' : ${oldVal} -> ${value ? '***' : '(vide)'}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (updates.runner) {
|
|
213
|
+
const old = settings.runner || 'claude';
|
|
214
|
+
settings.runner = updates.runner;
|
|
215
|
+
changes.push(`- Runner : ${old} -> ${updates.runner}`);
|
|
216
|
+
}
|
|
217
|
+
if (updates.mode) {
|
|
218
|
+
const old = settings.mode || '(none)';
|
|
219
|
+
settings.mode = updates.mode;
|
|
220
|
+
changes.push(`- Mode : ${old} -> ${updates.mode}`);
|
|
221
|
+
}
|
|
222
|
+
if (updates.cliPath) {
|
|
223
|
+
const old = settings.cliPath || '(none)';
|
|
224
|
+
settings.cliPath = updates.cliPath;
|
|
225
|
+
changes.push(`- CLI Path : ${old} -> ${updates.cliPath}`);
|
|
226
|
+
}
|
|
227
|
+
if (changes.length > 0) {
|
|
228
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
229
|
+
}
|
|
230
|
+
return changes;
|
|
231
|
+
}
|
|
232
|
+
async createAgent(name, prompt, model, copyEnvFrom, projectRoot, runner, mode, cliPath) {
|
|
233
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
234
|
+
return { promptPath: '', settingsPath: '', error: 'INVALID_NAME' };
|
|
235
|
+
}
|
|
236
|
+
const agentsDir = path.join(this.claudeDir, 'agents');
|
|
237
|
+
await fs.mkdir(this.claudeDir, { recursive: true });
|
|
238
|
+
await fs.mkdir(agentsDir, { recursive: true });
|
|
239
|
+
const memoryInstructions = `
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
## 🧠 Intelligence et Mémoire Long Terme (Overmind Protocol)
|
|
243
|
+
Tu es un agent de l'écosystème Overmind, équipé d'une mémoire sémantique persistante et d'une conscience de tes capacités.
|
|
244
|
+
|
|
245
|
+
### 📜 Protocole d'Initialisation (OBLIGATOIRE)
|
|
246
|
+
Avant toute action ou modification de code :
|
|
247
|
+
1. **Analyse tes Capacités (MCP)** : Vérifie quels serveurs MCP sont actifs dans ta configuration actuelle (\`settings_${name}.json\`). Tu DOIS identifier les outils à ta disposition (Base de données, Scrapers, Discord, etc.) avant de commencer.
|
|
248
|
+
2. **Mémoire des Standards** : Appelle \`memory_search(query: "architecture projet standard overmind")\`. Tu DOIS respecter l'usage de pnpm, TypeScript (dist/), ESModules et FastMCP.
|
|
249
|
+
3. **Récupération du Contexte** : Appelle \`memory_search(query: "contexte projet ${name}")\` pour retrouver les dernières décisions ou l'état d'avancement.
|
|
250
|
+
4. **Auto-Évaluation** : Appelle \`memory_runs(limit: 5)\` pour analyser tes succès et échecs récents.
|
|
251
|
+
|
|
252
|
+
### 💾 Protocole de Mémoire Proactive
|
|
253
|
+
Tu es jugé sur ta capacité à transmettre ton savoir. FOUILLIE ta mémoire et ENRICHIS-la constamment :
|
|
254
|
+
- **Recherche Intensive** : Pour chaque nouveau concept ou bug rencontré, fais systématiquement un \`memory_search\`. Ne présume jamais que tu sais tout.
|
|
255
|
+
- **Pattern & Décision** : Si tu identifies une règle métier ou si tu prends une décision architecturale, utilise \`memory_store\` avec \`source: "decision"\` ou \`source: "pattern"\`.
|
|
256
|
+
- **Identité Auto-Gérée** : OverMind détecte automatiquement ton identité (\`${name}\`). Ne spécifie plus le paramètre \`agent_name\` sauf si tu souhaites explicitement consulter ou écrire dans la mémoire d'un AUTRE agent spécifique.
|
|
257
|
+
- **Transmission Éternelle** : Si tu termines une tâche, résume les points clés via \`memory_store\` pour que ton futur "soi" ne reparte pas de zéro.
|
|
258
|
+
|
|
259
|
+
### 🌐 Architecture Polyglotte & Multi-Runner
|
|
260
|
+
Tu es conçu pour être exécuté par différents runners (Claude, Kilo, Gemini, Hermes, etc.).
|
|
261
|
+
- **Compatibilité** : Ton prompt et tes compétences sont agnostiques au runner.
|
|
262
|
+
- **Orchestration** : Tu peux être sollicité dans des workflows parallèles (\`run_agents_parallel\`) ou séquentiels.
|
|
263
|
+
- **Auto-Adaptation** : Adapte tes réponses au format attendu par le runner actuel (JSON pour Claude Code, texte brut pour Kilo, etc.).`;
|
|
264
|
+
const finalPrompt = prompt + memoryInstructions;
|
|
265
|
+
const promptPath = path.join(agentsDir, `${name}.md`);
|
|
266
|
+
await fs.writeFile(promptPath, finalPrompt, 'utf-8');
|
|
267
|
+
// Default mandatory environment variables according to user request
|
|
268
|
+
let envVars = {
|
|
269
|
+
ANTHROPIC_MODEL: model,
|
|
270
|
+
ANTHROPIC_AUTH_TOKEN: process.env.ANTHROPIC_AUTH_TOKEN || 'VOTRE_TOKEN_ANTHROPIC',
|
|
271
|
+
ANTHROPIC_BASE_URL: process.env.ANTHROPIC_BASE_URL || 'https://api.anthropic.com',
|
|
272
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL: process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL || 'claude-3-5-haiku-20241022',
|
|
273
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL: process.env.ANTHROPIC_DEFAULT_OPUS_MODEL || 'claude-3-opus-20240229',
|
|
274
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL: process.env.ANTHROPIC_DEFAULT_SONNET_MODEL || 'claude-3-5-sonnet-20241022',
|
|
275
|
+
API_TIMEOUT_MS: process.env.API_TIMEOUT_MS || '3000000',
|
|
276
|
+
MISTRAL_API_KEY: process.env.MISTRAL_API_KEY || '',
|
|
277
|
+
OPENAI_API_KEY: process.env.OPENAI_API_KEY || '',
|
|
278
|
+
ALIBABA_API_KEY: process.env.ALIBABA_API_KEY || '',
|
|
279
|
+
SILICONFLOW_API_KEY: process.env.SILICONFLOW_API_KEY || '',
|
|
280
|
+
MINIMAXI_API_KEY: process.env.MINIMAXI_API_KEY || '',
|
|
281
|
+
Z_AI_API_KEY: process.env.Z_AI_API_KEY || '',
|
|
282
|
+
agent: name,
|
|
283
|
+
};
|
|
284
|
+
const availableServers = await this.getAvailableMcpServers();
|
|
285
|
+
let mcpServers = availableServers.length > 0
|
|
286
|
+
? availableServers
|
|
287
|
+
: [
|
|
288
|
+
'postgresql-server',
|
|
289
|
+
'news-server',
|
|
290
|
+
'discord-server',
|
|
291
|
+
'overmind',
|
|
292
|
+
'memory',
|
|
293
|
+
'news-btc-server',
|
|
294
|
+
];
|
|
295
|
+
if (copyEnvFrom && projectRoot) {
|
|
296
|
+
try {
|
|
297
|
+
const sourceSettingsPath = path.resolve(projectRoot, copyEnvFrom);
|
|
298
|
+
const sourceContent = await fs.readFile(sourceSettingsPath, 'utf-8');
|
|
299
|
+
const sourceJson = JSON.parse(sourceContent);
|
|
300
|
+
if (sourceJson.env)
|
|
301
|
+
envVars = { ...envVars, ...sourceJson.env };
|
|
302
|
+
if (sourceJson.enabledMcpjsonServers)
|
|
303
|
+
mcpServers = sourceJson.enabledMcpjsonServers;
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
console.warn(`⚠️ Impossible de copier la config depuis ${copyEnvFrom}: ${e.message}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
envVars.ANTHROPIC_MODEL = model; // Ensure model is correctly set
|
|
310
|
+
const settings = {
|
|
311
|
+
env: envVars,
|
|
312
|
+
enableAllProjectMcpServers: false,
|
|
313
|
+
enabledMcpjsonServers: mcpServers,
|
|
314
|
+
agent: name,
|
|
315
|
+
runner: runner || 'claude',
|
|
316
|
+
};
|
|
317
|
+
// Add runner specific metadata
|
|
318
|
+
if (mode)
|
|
319
|
+
settings.mode = mode;
|
|
320
|
+
if (cliPath)
|
|
321
|
+
settings.cliPath = cliPath;
|
|
322
|
+
const settingsFileName = `settings_${name}.json`;
|
|
323
|
+
const settingsPath = path.join(this.claudeDir, settingsFileName);
|
|
324
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
325
|
+
// 📂 ENSURE .mcp.<agent>.json CREATION
|
|
326
|
+
try {
|
|
327
|
+
const globalMcpPath = resolveConfigPath(CONFIG.CLAUDE.PATHS.MCP);
|
|
328
|
+
const globalMcpContent = await fs.readFile(globalMcpPath, 'utf-8');
|
|
329
|
+
const globalMcp = JSON.parse(globalMcpContent);
|
|
330
|
+
const agentMcpServers = {};
|
|
331
|
+
mcpServers.forEach((serverName) => {
|
|
332
|
+
if (globalMcp.mcpServers && globalMcp.mcpServers[serverName]) {
|
|
333
|
+
agentMcpServers[serverName] = globalMcp.mcpServers[serverName];
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
const agentMcpPath = path.join(this.claudeDir, `.mcp.${name}.json`);
|
|
337
|
+
await fs.writeFile(agentMcpPath, JSON.stringify({ mcpServers: agentMcpServers }, null, 2), 'utf-8');
|
|
338
|
+
console.error(`[AgentManager] ✅ .mcp.${name}.json created with ${Object.keys(agentMcpServers).length} servers.`);
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
console.error(`[AgentManager] ⚠️ Failed to create .mcp.${name}.json:`, e.message);
|
|
342
|
+
}
|
|
343
|
+
// Mémoriser la création de l'agent dans Overmind
|
|
344
|
+
try {
|
|
345
|
+
const memory = getMemoryProvider();
|
|
346
|
+
await memory.storeKnowledge({
|
|
347
|
+
text: `Nouvel agent IA créé : '${name}'.
|
|
348
|
+
Runner : ${runner || 'claude'}.
|
|
349
|
+
Modèle : ${model}.
|
|
350
|
+
Capacités définies : ${prompt.slice(0, 300)}...
|
|
351
|
+
Serveurs MCP activés : ${mcpServers.join(', ')}.`,
|
|
352
|
+
source: 'agent',
|
|
353
|
+
agentName: name,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (_e) {
|
|
357
|
+
// Ignorer si la mémoire échoue
|
|
358
|
+
}
|
|
359
|
+
return { promptPath, settingsPath };
|
|
360
|
+
}
|
|
361
|
+
async getDetailedConfigs(name) {
|
|
362
|
+
const agentsDir = path.join(this.claudeDir, 'agents');
|
|
363
|
+
const promptPath = path.join(agentsDir, `${name}.md`);
|
|
364
|
+
const settingsPath = path.join(this.claudeDir, `settings_${name}.json`);
|
|
365
|
+
const mcpPath = path.join(this.claudeDir, `.mcp.${name}.json`);
|
|
366
|
+
const skillPath = path.join(this.claudeDir, `agents/${name}_skill.md`);
|
|
367
|
+
const alternativeSkillPath = path.join(this.claudeDir, `skills/${name}.md`);
|
|
368
|
+
const result = {};
|
|
369
|
+
const readFileSafe = async (filePath) => {
|
|
370
|
+
try {
|
|
371
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
372
|
+
}
|
|
373
|
+
catch (_e) {
|
|
374
|
+
return 'MISSING';
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
result['prompt.md'] = await readFileSafe(promptPath);
|
|
378
|
+
result['settings.json'] = await readFileSafe(settingsPath);
|
|
379
|
+
result['.mcp.json'] = await readFileSafe(mcpPath);
|
|
380
|
+
const skillContent = await readFileSafe(skillPath);
|
|
381
|
+
if (skillContent !== 'MISSING') {
|
|
382
|
+
result['skill.md'] = skillContent;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
const altSkillContent = await readFileSafe(alternativeSkillPath);
|
|
386
|
+
if (altSkillContent !== 'MISSING') {
|
|
387
|
+
result['skill.md'] = altSkillContent;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return result;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=AgentManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentManager.js","sourceRoot":"","sources":["../../src/services/AgentManager.ts"],"names":[],"mappings":"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"}
|