Para una imagen local/pegada desde vscode: guardarla en una carpeta
sincronizada NO truncada (cms/uploads/chat/ o cms/uploads/generated/),
dejar que el sync la suba a test y pasar su RUTA RELATIVA como imageUrl.
El server lee los bytes de disco vía resolve_image_source — cero base64
por el contexto del modelo, cero URLs localhost inalcanzables.
- Validación relajada: además de http(s) y ruta absoluta, se acepta ruta
relativa del proyecto (sin esquema, sin "..", <=512 chars, charset de
ruta) → sigue rechazando data-URI/base64 crudo.
- Descripciones de upload_record_image / replace_record_image actualizadas
con el flujo correcto.
- resolve_image_source y el aislamiento de entorno: sin cambios (la ruta
relativa la resuelve por modo+stub, igual para chat y vscode).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Imágenes:
- analyze_image y upload resuelven los bytes por el endpoint Python
/api/image-bytes (pythonGetBinary). analyze_image enruta los dominios
forge (env ACAI_FORGE_DOMAIN) al endpoint en vez de fetch directo (que
daba ECONNREFUSED 127.0.0.1 dentro del container).
Aislamiento de entorno (vscode = solo test):
- resolveCurrentModeOverride(): sesión MCP HTTP (mcpSessionId presente) →
"local"; stdio (chat/cron) → ACAI_MODE_OVERRIDE de entorno. Lo usan los
builders de headers (pythonServerClient, files/helpers) → toda tool del
MCP HTTP manda X-Acai-Mode: local.
- httpServer.resolveProjectCredentials fuerza forceMode:"local" al resolver
project-info → la sesión obtiene web_url/api_web_url forge-local y opera
siempre contra test, nunca producción.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- saveFileBuilder (fileBuilder.js) hacía POST directo a viewer_functions.php
sin header Host -> en Forge (api_web_url interno http://web:80) Apache
servía el vhost por defecto -> 404. Ahora delega en
AcaiHttpClient.postViewerAction, que resuelve api_web_url + Host:
forge_host (igual que el resto de tools). Pasa credentials completo.
- upload_record_image: rechaza data-URI/base64 con error claro (antes
derivaba el nombre del base64 -> "File name too long" en mcp_respond.php).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>