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>
38 lines
1.8 KiB
JavaScript
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: [...] }
|
|
}
|