Files
agenticSystem/mcp-server/auth/localClient.js
2026-07-18 10:03:12 +00:00

40 lines
1.9 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;
if (opts.forceTokenRefresh) params.force_token_refresh = "1";
if (opts.mcpSecret) headers["X-MCP-Secret"] = opts.mcpSecret;
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: [...] }
}