Add .gitignore, remove __pycache__ from tracking, and update MCP/orchestrator modules

- Add .gitignore to exclude .env, __pycache__, node_modules, and IDE files
- Remove all __pycache__ bytecode files from version control
- Add MCP config files (mcp.json, mcp.json.example)
- Add MCP manager, registry, and config modules
- Update routes, orchestrator engine, and agent base with latest changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jordan
2026-04-01 23:47:26 +01:00
parent 91cfdaee72
commit 264acc90b4
49 changed files with 749 additions and 68 deletions

105
README.md
View File

@@ -227,20 +227,93 @@ mensaje → planner → [step₁ → step₂ → ... → stepₙ] → reviewer
## MCP (Model Context Protocol)
Cliente stdio que se conecta a un servidor MCP al arrancar:
Arquitectura **per-session**: el microservicio corre como un Docker único, y cada sesión arranca sus propios subprocesos MCP con las env vars del proyecto del usuario.
### Modelo de operación
```
Docker (microservicio — uno solo corriendo)
└── mcp.json ← template: QUÉ servers arrancar (global)
└── mcp-server/ ← código MCP (baked-in)
POST /sessions { mcp_env: { ACAI_WEB_URL: "https://tienda.com", ... } }
→ Arranca subprocesos MCP con esas env vars
→ Session aislada con su propio MCPManager
→ 33 tools descubiertas automáticamente
DELETE /sessions/{id}
→ Mata los subprocesos MCP de esa sesión
```
### Configuración
**1. Template global** (`mcp.json` en la raíz — define QUÉ servers existen):
```json
{
"mcpServers": {
"acai-code": {
"command": "node",
"args": ["mcp-server/stdio.js"],
"env": {},
"timeout": 30,
"startup_timeout": 10
}
}
}
```
```bash
# En .env
AGENTIC_MCP_SERVER_COMMAND=node
AGENTIC_MCP_SERVER_ARGS=["mcp-server/stdio.js"]
# Variables del MCP server (se heredan al subproceso)
ACAI_WEB_URL=http://localhost:8080
ACAI_WEBSITE=mi-sitio
ACAI_PROJECT_DIR=/ruta/al/proyecto
AGENTIC_MCP_CONFIG_PATH=mcp.json
```
El cliente descubre tools automáticamente vía `tools/list`, y los agentes las usan durante la ejecución. Los resultados de tools **nunca** entran al contexto como raw output — se resumen como artifacts.
**2. Per-session env vars** (cada usuario/proyecto pasa las suyas al crear sesión):
```bash
curl -X POST http://localhost:8001/api/v1/sessions \
-H "Content-Type: application/json" \
-d '{
"project_profile": {"name": "tienda-online"},
"mcp_env": {
"ACAI_WEB_URL": "https://superadmin_tienda.forge.acaisuite.com/",
"ACAI_WEBSITE": "tienda.com",
"ACAI_PROJECT_DIR": "/projects/tienda"
}
}'
```
Las env vars de `mcp_env` se fusionan con las del template y se pasan al subproceso MCP. El MCP server lee el token desde el `.acai` del proyecto automáticamente.
**3. Legacy** (un solo server global, sin `mcp.json`):
```bash
AGENTIC_MCP_SERVER_COMMAND=node
AGENTIC_MCP_SERVER_ARGS=["mcp-server/stdio.js"]
```
### Tool namespacing
En modo multi-server, los tools se namespean: `acai-code.compile_module`, `filesystem.read_file`. En modo single-server los tools mantienen su nombre original.
### API de gestión MCP
```bash
# Ver estado de todos los MCP servers activos (por sesión)
curl http://localhost:8001/api/v1/mcp/status
# Hot-reload del template (re-lee mcp.json, no afecta sesiones activas)
curl -X POST http://localhost:8001/api/v1/mcp/reload
```
### Ciclo de vida
1. `POST /sessions` con `mcp_env` → arranca subprocesos MCP para esa sesión
2. `POST /sessions/{id}/messages` → el agente usa los tools del MCP de esa sesión
3. Si el server se reinicia y la sesión sigue en Redis → el MCP se reconecta automáticamente al siguiente mensaje
4. `DELETE /sessions/{id}` → mata subprocesos MCP de esa sesión
Los resultados de tools **nunca** entran al contexto como raw output — se resumen como artifacts.
## Configuración
@@ -261,8 +334,9 @@ Variables de entorno con prefijo `AGENTIC_`:
| `AGENTIC_MAX_EXECUTION_STEPS` | `25` | Max steps por task |
| `AGENTIC_MAX_EXECUTION_TIMEOUT_SECONDS` | `300` | Timeout global (5 min) |
| `AGENTIC_SUBAGENT_MAX_STEPS` | `10` | Max iterations por subagent |
| `AGENTIC_MCP_SERVER_COMMAND` | — | Comando del servidor MCP |
| `AGENTIC_MCP_SERVER_ARGS` | `[]` | Argumentos del servidor MCP |
| `AGENTIC_MCP_CONFIG_PATH` | — | Ruta a `mcp.json` (multi-MCP per-session) |
| `AGENTIC_MCP_SERVER_COMMAND` | — | Legacy: comando del servidor MCP (single) |
| `AGENTIC_MCP_SERVER_ARGS` | `[]` | Legacy: argumentos del servidor MCP |
| `AGENTIC_MCP_TIMEOUT_SECONDS` | `30` | Timeout por tool call |
| `AGENTIC_DEBUG` | `false` | Logging verbose |
@@ -302,8 +376,11 @@ agentic:memory:_type:{type} → Set de doc IDs por tipo
│ │ ├── base.py # ModelAdapter interface
│ │ ├── claude_adapter.py # Anthropic Claude (streaming)
│ │ └── openai_adapter.py # OpenAI GPT (streaming)
│ ├── mcp/ # MCP client
│ │ ── client.py # stdio transport, tool registry
│ ├── mcp/ # MCP (per-session, multi-server)
│ │ ── client.py # stdio transport, tool registry
│ │ ├── config.py # mcp.json parser (Pydantic)
│ │ ├── manager.py # MCPManager (aggregates tools, routes calls)
│ │ └── registry.py # Per-session MCP lifecycle
│ ├── orchestrator/ # Agent orchestration
│ │ ├── engine.py # Pipeline + error recovery + timeout
│ │ ├── router.py # Step-to-agent routing
@@ -328,6 +405,8 @@ agentic:memory:_type:{type} → Set de doc IDs por tipo
│ └── components/ # Sidebar, chat, event log, inspector, timeline
├── mcp-server/ # Acai MCP server (Node.js, stdio)
├── docs/ # Knowledge base documents (*.md)
├── mcp.json # MCP server template (qué servers arrancar)
├── mcp.json.example # Ejemplo con múltiples servers
├── Dockerfile
├── docker-compose.yml
├── requirements.txt