88 lines
2.9 KiB
JavaScript
88 lines
2.9 KiB
JavaScript
import axios from "axios";
|
|
import path from "path";
|
|
import { LOCAL_SERVER_URL, getLocalServerHeaders } from "../../config/index.js";
|
|
import { getCurrentSessionId } from "../../utils/sessionContext.js";
|
|
import { getMcpSessionCredentials } from "../../auth/credentials.js";
|
|
import { resolveCurrentAcaiUser } from "../helpers/sessionHelpers.js";
|
|
|
|
/**
|
|
* Resuelve `project_dir` para la tool en curso.
|
|
*
|
|
* Orden de precedencia:
|
|
* 1. AsyncLocalStorage (mcpSessionId) -> credenciales de la sesion HTTP
|
|
* 2. process.env.ACAI_PROJECT_DIR (modo stdio / fallback legacy)
|
|
*
|
|
* Devuelve string vacio si no hay forma de resolverlo — el caller decide
|
|
* como manejar el error.
|
|
*/
|
|
export function resolveCurrentProjectDir() {
|
|
const sessionId = getCurrentSessionId();
|
|
if (sessionId) {
|
|
const creds = getMcpSessionCredentials(sessionId);
|
|
if (creds?.project_dir) return creds.project_dir;
|
|
}
|
|
return process.env.ACAI_PROJECT_DIR || "";
|
|
}
|
|
|
|
export function getCurrentProjectInfo() {
|
|
const projectDir = resolveCurrentProjectDir();
|
|
if (!projectDir) {
|
|
throw new Error("ACAI_PROJECT_DIR not set");
|
|
}
|
|
return {
|
|
projectDir,
|
|
projectSlug: path.basename(path.resolve(projectDir)),
|
|
};
|
|
}
|
|
|
|
export async function callLocalFileEndpoint(method, endpoint, payload = null, query = null) {
|
|
const headers = getLocalServerHeaders();
|
|
// Inyectar X-Acai-User cuando hay sesion HTTP activa: permite que los
|
|
// endpoints autenticados del server Python identifiquen al usuario sin
|
|
// depender de Authorization Basic.
|
|
const acaiUser = resolveCurrentAcaiUser();
|
|
if (acaiUser) headers["X-Acai-User"] = acaiUser;
|
|
if (method === "GET") {
|
|
const response = await axios.get(`${LOCAL_SERVER_URL}${endpoint}`, {
|
|
params: query || undefined,
|
|
headers,
|
|
timeout: 30000,
|
|
validateStatus: (status) => status < 600,
|
|
});
|
|
return { status: response.status, data: response.data };
|
|
}
|
|
|
|
const response = await axios.post(`${LOCAL_SERVER_URL}${endpoint}`, payload || {}, {
|
|
headers,
|
|
timeout: 30000,
|
|
validateStatus: (status) => status < 600,
|
|
});
|
|
return { status: response.status, data: response.data };
|
|
}
|
|
|
|
export function buildLocalFileErrorResponse(toolName, result, extra = {}) {
|
|
const payload = result?.data || {};
|
|
const message =
|
|
payload.message ||
|
|
payload.error ||
|
|
payload.compileError ||
|
|
`HTTP ${result?.status || 500}`;
|
|
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify({
|
|
success: false,
|
|
error: {
|
|
code: `HTTP_${result.status}`,
|
|
message,
|
|
context: toolName,
|
|
...extra,
|
|
...payload,
|
|
},
|
|
}, null, 2),
|
|
}],
|
|
isError: true,
|
|
};
|
|
}
|