97 lines
4.6 KiB
JavaScript
97 lines
4.6 KiB
JavaScript
import { z } from "zod";
|
|
import { withAuth } from "../../auth/index.js";
|
|
import { withAuthParams } from "../helpers/authSchema.js";
|
|
import { handleToolError, validateRequired } from "../helpers/errorHandler.js";
|
|
import { pythonGet } from "../helpers/pythonServerClient.js";
|
|
import { getCurrentProjectInfo } from "../files/helpers.js";
|
|
|
|
// get_module_config_vars
|
|
//
|
|
// Pasa por el server Python (/api/creator/get-module-vars) en lugar de ir
|
|
// directamente al PHP. Asi obtenemos `varsMeta`: para cada variable del
|
|
// modulo, su ubicacion fisica en `builder_custom` (recordNum + columna real).
|
|
// Sin esto el agente solo conoce el nombre humano de la variable (ej.
|
|
// `titulo`) y al hacer create_or_update_record adivina el campo y suele
|
|
// fallar silenciosamente porque la columna real es algo como `title2`.
|
|
|
|
export function registerGetModuleConfigVarsTool(server) {
|
|
server.tool(
|
|
"get_module_config_vars",
|
|
`Get the current configuration variable values for a module instance on a page record. Returns:
|
|
|
|
- vars: resolved values (text, HTML, etc.) for simple vars and arrays for multi/repeater vars
|
|
- varsMeta: per-var physical location { tableName: 'builder_custom', recordNum, fieldName, type }. USE THIS to know exactly which row + column to update with create_or_update_record. The variable's display name (e.g. 'titulo') is NOT the same as the physical column name (e.g. 'title2').
|
|
- uploadFields: per-var upload location for upload_record_image / replace_record_image
|
|
- moduleId, sectionId
|
|
|
|
Required params:
|
|
- tableName (string) without 'cms_' prefix (parent page table, e.g. 'apartados')
|
|
- recordNum (number) parent record primary key ('num', never 'id')
|
|
- sectionId (string) section ID of the module instance`,
|
|
withAuthParams({
|
|
tableName: z.string().describe("Parent table name (e.g. 'apartados')"),
|
|
recordNum: z.number().describe("Parent record number"),
|
|
sectionId: z.string().describe("Section ID of the module instance"),
|
|
}),
|
|
{ readOnlyHint: true, destructiveHint: false },
|
|
withAuth(async ({ tableName, recordNum, sectionId }, _extra) => {
|
|
try {
|
|
const validationError = validateRequired(
|
|
{ tableName, recordNum, sectionId },
|
|
["tableName", "recordNum", "sectionId"],
|
|
"get_module_config_vars"
|
|
);
|
|
if (validationError) return validationError;
|
|
|
|
const { projectSlug } = getCurrentProjectInfo();
|
|
const result = await pythonGet("/api/creator/get-module-vars", {
|
|
project: projectSlug,
|
|
table: tableName,
|
|
num: recordNum,
|
|
sectionId,
|
|
});
|
|
|
|
// El endpoint Python devuelve la respuesta del PHP envuelta:
|
|
// { success, data: { moduleId, vars, configVars, uploadFields, varsMeta, ... } }
|
|
// o directamente las claves en raiz. Normalizamos.
|
|
const inner = result?.data && typeof result.data === "object" ? result.data : result;
|
|
if (!inner || inner.success === false) {
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify({
|
|
success: false,
|
|
error: inner?.error || "Could not read module config vars",
|
|
}),
|
|
}],
|
|
isError: true,
|
|
};
|
|
}
|
|
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify({
|
|
success: true,
|
|
action: "get_module_config_vars",
|
|
tableName,
|
|
recordNum,
|
|
sectionId,
|
|
data: {
|
|
moduleId: inner.moduleId,
|
|
sectionId: inner.sectionId,
|
|
vars: inner.vars || {},
|
|
varsMeta: inner.varsMeta || {},
|
|
uploadFields: inner.uploadFields || {},
|
|
configVars: inner.configVars || {},
|
|
},
|
|
}, null, 2),
|
|
}],
|
|
};
|
|
} catch (error) {
|
|
return handleToolError(error, "get_module_config_vars", { tableName, recordNum, sectionId });
|
|
}
|
|
})
|
|
);
|
|
}
|