Files
agenticSystem/mcp-server/auth/localClient.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

38 lines
1.8 KiB
JavaScript

import axios from "axios";
import { LOCAL_SERVER_URL, getLocalServerHeaders } from "../config/index.js";
/**
* Resuelve info de un proyecto contra el server Python local.
*
* @param {string|Object} projectName - nombre del proyecto o query object (ej. { project_dir })
* @param {string|null} acaiUser - usuario Acai propietario del proyecto. Si se pasa,
* se reenvia como header `X-Acai-User` para aislar la busqueda a
* `/opt/acai/webs/<user>/`. Nginx valida el secret y añade este header
* automaticamente; en modo stdio no se propaga y la logica original se
* mantiene.
*/
export async function fetchProjectInfo(projectName, acaiUser = null, opts = {}) {
const params = typeof projectName === "string" ? { project: projectName } : (projectName || {});
const headers = getLocalServerHeaders();
if (acaiUser) headers["X-Acai-User"] = acaiUser;
// forceMode: fuerza el modo efectivo con el que el server Python resuelve el
// web_url/api_web_url del proyecto. Lo usa el transporte MCP HTTP (plugin VS
// Code) para fijar "local" → la sesion entera apunta al web forge-local
// (test), nunca a produccion, sea cual sea el mode del .acai.
if (opts.forceMode) headers["X-Acai-Mode"] = opts.forceMode;
const response = await axios.get(`${LOCAL_SERVER_URL}/api/project-info`, {
params,
headers,
});
return response.data; // { success, web_url, token, tokenHash, domain, project_dir }
}
export async function fetchProjectsList(acaiUser = null) {
const headers = getLocalServerHeaders();
if (acaiUser) headers["X-Acai-User"] = acaiUser;
const response = await axios.get(`${LOCAL_SERVER_URL}/api/mcp/projects`, {
headers,
});
return response.data; // { success, projects: [...] }
}