Files
agenticSystem/mcp-server/tools/helpers/sessionHelpers.js
Jordan 5dc2dbcf4a analyze/upload vía /api/image-bytes + MCP HTTP (vscode) forzado a test
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>
2026-06-19 19:11:50 +01:00

48 lines
1.9 KiB
JavaScript

/**
* Helpers reutilizables para resolver datos derivados de la sesion MCP en curso.
*
* Usan AsyncLocalStorage (`utils/sessionContext.js`) para recuperar el
* `mcpSessionId` activo y leer informacion asociada desde
* `auth/credentials.js`. En modo stdio (sin HTTP) devuelven `null` y el caller
* decide como actuar.
*/
import { getCurrentSessionId } from "../../utils/sessionContext.js";
import { getMcpSessionCredentials } from "../../auth/credentials.js";
/**
* Recupera el `acai_user` de la sesion HTTP activa (si existe).
*
* Se usa para inyectar el header `X-Acai-User` en llamadas al server Python,
* evitando asi depender de Authorization Basic y permitiendo que los endpoints
* autenticados (p.ej. `/api/generate-image`, `/api/files/write`) identifiquen
* al usuario propietario del proyecto.
*
* @returns {string|null}
*/
export function resolveCurrentAcaiUser() {
const sessionId = getCurrentSessionId();
if (!sessionId) return null;
const creds = getMcpSessionCredentials(sessionId);
return creds?.acai_user || null;
}
/**
* Modo efectivo (X-Acai-Mode) para las llamadas al server Python.
*
* Regla de seguridad: una sesion MCP HTTP (mcpSessionId presente) es SIEMPRE un
* cliente externo — en la practica el plugin VS Code Acai Forge — y solo puede
* operar sobre TEST. Por eso forzamos "local" pase lo que pase el .acai del
* proyecto. El server Python honra este header para decidir el destino real
* (BD y ficheros), de modo que vscode nunca toca produccion.
*
* Las sesiones stdio (chat del dashboard / cronjobs) NO tienen mcpSessionId:
* mantienen el override de entorno (ACAI_MODE_OVERRIDE), que puede ser
* "production" cuando corresponde (chat en modo produccion, cron de prod).
*
* @returns {string} "local" | "production" | "" (vacio = usar .acai)
*/
export function resolveCurrentModeOverride() {
if (getCurrentSessionId()) return "local";
return process.env.ACAI_MODE_OVERRIDE || process.env.ACAI_MODE || "";
}