Commit Graph

46 Commits

Author SHA1 Message Date
Jordan Diaz
f5b9e275c9 imagees del agente generadas y subidas con proxy server 2026-04-12 13:16:50 +00:00
Jordan Diaz
ca39cd2ccd tablas y delete module 2026-04-12 10:16:52 +00:00
Jordan Diaz
224ac2dad7 Control de modo editor/admin produccion/local 2026-04-10 16:52:00 +00:00
Jordan Diaz
0a8756c308 Añadido imagenes en records nuevos 2026-04-10 16:13:35 +00:00
Jordan Diaz
19efed84b7 compactor final 2026-04-09 21:41:11 +00:00
Jordan Diaz
237dc00379 nah 2026-04-09 20:46:03 +00:00
Jordan Diaz
4c73d848bb Primera fase context 2026-04-09 18:27:36 +00:00
Jordan Diaz
993e7d3000 Añadido el modo producción / test 2026-04-08 23:52:54 +00:00
Jordan Diaz
c1a29bbbf8 Selector de agentes 2026-04-07 10:57:40 +00:00
Jordan Diaz
38ac9cecdc MCP: bloquear escritura de records por accessList del usuario
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 21:52:13 +00:00
Jordan Diaz
5bfcee6918 get_web_url: forzar HTTP en forge + documentar ?pruebas=1 obligatorio
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:37:27 +00:00
Jordan Diaz
30a62d9a1d Tool get_web_url: devuelve URL correcta del proyecto para fetch/playwright
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:33:39 +00:00
Jordan Diaz
50ccc0e2a1 Docs: prohibir navegación a dominio de producción, solo usar ACAI_WEB_URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:30:49 +00:00
Jordan Diaz
fea9d2bd92 Fix docs: eliminar localhost:8080, usar URL real del proyecto
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:26:48 +00:00
Jordan Diaz
5b87676ef4 Fix permisos: appuser con UID 1001 (mismo que acai en container app)
El MCP server creaba archivos con UID 1000 que el server Python
(UID 1001) no podía modificar ni borrar. Ahora ambos containers
usan UID 1001, eliminando conflictos de permisos en volúmenes compartidos.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 12:22:12 +00:00
Jordan Diaz
72da3b7659 Soporte base_url custom en Claude adapter (MiniMax Anthropic-compatible)
MiniMax tiene endpoint compatible con Anthropic API en
https://api.minimax.io/anthropic/v1. Nueva variable
AGENTIC_ANTHROPIC_BASE_URL para usarlo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:42:40 +00:00
Jordan Diaz
00c41fedb2 Soporte base_url custom en OpenAI adapter (MiniMax, DeepInfra, etc.)
Nueva variable AGENTIC_OPENAI_BASE_URL para proveedores compatibles
con OpenAI API (MiniMax, DeepInfra, Together, etc.).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:38:11 +00:00
Jordan Diaz
a86445f91a Fix historial: marcar como contexto pasado, no como nueva petición
El modelo repetía tareas anteriores porque el historial se
reconstruía como mensajes user/assistant que parecían peticiones
nuevas. Ahora el historial va como un bloque de contexto marcado
explícitamente con [HISTORIAL — NO ejecutar de nuevo].

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:30:13 +00:00
Jordan Diaz
a9fbd01b5d Fix Claude adapter: convertir mensajes OpenAI→Claude format
- role=tool → role=user con tool_result blocks
- assistant con tool_calls → assistant con tool_use blocks
- Merge mensajes consecutivos del mismo role (Claude requiere alternancia)
- Capturar input_tokens del evento message_start

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:22:35 +00:00
Jordan Diaz
184486b62b Context debug: guardar system_prompt + messages completos del último build
El endpoint /context-debug ahora devuelve full_context con el
system_prompt y messages exactos enviados al modelo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 09:19:16 +00:00
Jordan Diaz
bc6ad3bcec Auto-load knowledge base al arrancar el servicio
Extraída lógica de carga a _load_knowledge_from_dir() reutilizable.
Se llama automáticamente en el lifespan después de set_dependencies().
Si falla, solo loguea warning — no bloquea el arranque.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 09:10:49 +00:00
Jordan Diaz
f17be543ee fix: update coder agent 2026-04-04 09:02:43 +00:00
Jordan Diaz
967d5bf25d Simplificar a agente único: eliminar planner/reviewer/steps
El sistema multi-agente (planner → coder → reviewer) añadía
complejidad y causaba problemas (sobreplanificaci��n, repetición
de tareas, pérdida de contexto entre steps).

Ahora: mensaje → coder → respuesta. Como Claude Code.
- El coder decide si responder directamente o usar tools
- Sin plan intermedio, sin reviewer, sin steps
- Un solo execute() con conversación real completa
- Historial compactado con key_data al finalizar
- System prompt actualizado: asistente de desarrollo, no agente

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:57:08 +00:00
Jordan Diaz
1c3d67847a Reforzar reglas críticas de JS/CSS en system prompt del coder
GPT-5.4 ignora las convenciones del knowledge base (42K tokens).
Las reglas más críticas se duplican en el system prompt del coder:
- script.js y style.css son ESTÁTICOS (sin Twig)
- Valores dinámicos via data-* attributes
- CmsApi.hook() en vez de fetch
- querySelectorAll con clase raíz en vez de getElementById

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:49:59 +00:00
Jordan Diaz
301cef4d69 Forzar máximo 2 steps en plan: 1 coder + 1 reviewer opcional
El planner generaba 3+ steps para tareas simples causando que el
coder repitiera acciones en cada step (creaba el módulo varias veces).
Ahora el engine fusiona los steps en 1 coder con descripción combinada.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:47:05 +00:00
Jordan Diaz
ded0e997ed Emitir plan como bloque tool_use visible en el frontend
El plan del planner se emite como tool_use(name="plan") + tool_result
con los steps formateados. El frontend lo renderiza como un bloque
colapsable de herramienta con el plan de ejecución.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:32:45 +00:00
Jordan Diaz
2d5cc4e10a Knowledge completo en contexto: 50K token budget
Budget de 15K dejaba fuera docs críticos (css-js-conventions,
hooks-and-api). Con 42K tokens totales y 128K de contexto,
incluir todo es la mejor estrategia.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:58 +00:00
Jordan Diaz
0bfc8e2b97 Planner: limitar plans a 2-3 steps, evitar sobreplanificación
El planner generaba 6+ steps para tareas simples como crear un módulo,
causando que el coder repitiera acciones o creara el módulo dos veces.

- Reglas explícitas: máximo 2-3 steps
- Crear módulo = 1 step coder (archivos + add + config)
- Explorar = 1 step coder
- Reviewer solo para tareas complejas

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:08:58 +00:00
Jordan Diaz
bcfaeb7e39 Conversación continua: historial como mensajes user/assistant reales
El agenticSystem ahora es conversacional — recuerda lo dicho en
mensajes anteriores de la misma sesión.

- engine.py: direct_response guarda en task_history con formato
  "User: X → Agent: Y"
- context/engine.py: _build_messages() reconstruye el task_history
  como pares user/assistant reales en el array de messages, antes
  del mensaje actual. El modelo ve una conversación completa.
- base.py: planner/reviewer no emiten AGENT_DELTA al frontend
  (su output es interno, no para el usuario)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 22:56:23 +00:00
Jordan Diaz
151596a52d Fix: no emitir deltas del planner/reviewer al frontend
El planner genera JSON interno que no debe mostrarse al usuario.
Solo coder y collector emiten AGENT_DELTA al stream.

Para direct_response, el engine emite como agent=coder para que
el ClaudeFormatEmitter lo procese correctamente.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:53:00 +00:00
Jordan Diaz
56c8a9c066 Planner: respuesta directa para saludos y preguntas simples
El planner ahora puede devolver direct_response en vez de un plan
cuando el mensaje no requiere herramientas (saludos, preguntas
generales, conversación casual).

- planner.py: prompt actualizado con formato direct_response
- engine.py: si planner devuelve string, emitir como texto y
  completar sin ejecutar steps

"hola" → "¡Hola! ¿En qué puedo ayudarte hoy?" (0 steps, 0 tools)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:48:28 +00:00
Jordan Diaz
df7dfbc280 SSE en formato Claude Code CLI via ?format=claude
Nuevo ClaudeFormatEmitter traduce eventos nativos al formato exacto
que produce Claude Code CLI: content_block_start/delta/stop, tool_result,
assistant snapshots, result con usage/cost, done.

- streaming/claude_format.py: ClaudeFormatEmitter + DualEmitter
- base.py: enriquecer eventos con tool_call_id, raw_output, tool_arguments
- engine.py: usage/cost en EXECUTION_COMPLETED
- routes.py: ?format=claude en /sessions/{id}/stream
- main.py: DualEmitter wiring (emite a ambos formatos)

El frontend puede consumir el stream sin cambios — mismos event types
que Claude Code CLI. El formato nativo sigue disponible para el dashboard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:48:07 +00:00
Jordan Diaz
6978764540 Tests unitarios: 51 tests para compactor, key_data, fingerprint y costes
- tests/test_compactor.py: 24 tests (estimate_tokens, extract_facts,
  build_summary, summarize_tool_output, compact_sections)
- tests/test_key_data_extraction.py: 11 tests (extracción de tables,
  records, sections, modules, pages desde tool executions)
- tests/test_fingerprint.py: 8 tests (deduplicación MD5, sort_keys,
  nested args)
- tests/test_cost_calculation.py: 8 tests (pricing formula, custom
  pricing, rounding)
- README.md: sección Tests con instrucciones de ejecución

Todos offline, sin Docker/Redis/LLM. Ejecutar: python3 -m pytest tests/ -v

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:28:32 +00:00
Jordan Diaz
7c891cf023 Token tracking y cálculo de costes por mensaje
- Config: COST_PER_1M_INPUT y COST_PER_1M_OUTPUT configurables via .env
- OpenAI adapter: stream_options include_usage para capturar tokens reales
- base.py: acumula input/output tokens de cada iteración del agente
- planner.py: devuelve usage junto con el plan
- engine.py: suma tokens de planner + steps + review, calcula coste USD
- Response incluye usage{input_tokens, output_tokens} y total_cost_usd

Formato compatible con el bridge de Claude Code CLI para integración
con el frontend y reporting a Acai webservice.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:18:23 +00:00
Jordan Diaz
2712c2fd49 Docs: create_module es legacy, acai_write es el flujo estándar
El server compila automáticamente al guardar index-base.tpl via
acai_write — no necesita create_module ni compile_module manual.

- mcp-tools-reference.md: flujo actualizado, create_module marcado legacy
- module-creation-guide.md: paso 2 usa acai_write
- ACAI-CLAUDE.md: key workflows actualizados
- coder.py: system prompt alineado

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:40:47 +00:00
Jordan Diaz
7bdb943e7f Fix problemas detectados en evaluación: historial, prompting, artifacts
1. Task history preserva key_data estructurado (recordNums, sectionIds,
   moduleIds, pages) extraído de las tool executions reales — el modelo
   retiene contexto entre tasks sin re-consultar.

2. Coder system prompt mejorado: instrucciones explícitas sobre qué tool
   usar para cada operación (create_module vs create_or_update_record),
   consultar knowledge base antes de actuar, y reutilizar key_data del
   historial.

3. Eliminado artifact_memory y working_context del coder context_sections
   — ya no son necesarios con conversación real. Reduce acumulación de
   artifacts en el context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:29:09 +00:00
Jordan Diaz
3aa7a463d0 Fix LOCAL_SERVER_URL para escritura de archivos en Docker
El MCP acai-code usa HTTP al server Python para operaciones de
ficheros (write, view, delete). En Docker, el server Python está
en el container app:9091, no en localhost:29871 (legacy local).

- mcp.json: env LOCAL_SERVER_URL=http://app:9091 para acai-code

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:19:20 +00:00
Jordan Diaz
414210bceb Playwright con Chromium + fetch con uvx + executable-path fix
- Dockerfile: instalar deps sistema Playwright (root) + Chromium (appuser)
- Dockerfile: instalar uv/uvx para mcp-server-fetch
- mcp.json: --executable-path apunta al Chromium instalado por appuser
- Eliminar entrypoint (dnsmasq resuelve DNS dinámicamente)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:39:16 +00:00
Jordan Diaz
b88917c18d Rediseño tool results + compactación por step + integración Docker
- Tool results completos en conversación (como Claude Code/Cursor)
  en vez de resúmenes en system prompt
- Parser multi-tool: trackea tool calls por tool_call_id para
  OpenAI streaming interleaved
- Deduplicación por fingerprint + detección de loop cuando todos
  los calls de un step son duplicados
- Compactación inteligente por step: el orquestador decide cuándo
  comprimir steps anteriores (cambio de agente o >3 steps)
- stdio.js lee URLs del .acai como fallback (local_web_url, local_forge_host)
- Buffer MCP aumentado a 1MB para respuestas grandes
- Dockerfile adaptado para build context desde raíz del proyecto

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:09:08 +00:00
Jordan Diaz
0dd3adbebd Update Dockerfile 2026-04-03 11:15:20 +00:00
Jordan
a1f28cc8a0 Update README.md 2026-04-03 10:31:58 +01:00
Jordan
2997622b4d resumen de artifacts 2026-04-02 00:34:06 +01:00
Jordan
bfccb02373 ultimos ajustes 2026-04-02 00:28:57 +01:00
Jordan
0795b28b54 ajustes de mcp 2026-04-02 00:14:11 +01:00
Jordan
264acc90b4 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>
2026-04-01 23:47:26 +01:00
Jordan
91cfdaee72 Initial commit 2026-04-01 23:16:45 +01:00