import { z } from "zod"; import { withAuth, getSessionCredentials, getApiClient, getCommonParams } from "../../auth/index.js"; import { handleToolError, validateRequired, handleApiResponse } from "../helpers/errorHandler.js"; import { withAuthParams } from "../helpers/authSchema.js"; export function registerSetModuleExampleDataTool(server) { server.tool( "set_module_example_data", `Set example data for a module's editor preview. MANDATORY: call get_module first to get the schema, then fill EVERY variable. Critical: uploads ALWAYS as [{urlPath: "..."}] (NEVER strings), multiv2 as array with 2+ items, var names from data-field-label (no spaces, lowercase). Use generate_image or placehold.co for image URLs. See resource 'acai-cheat-sheet' → "Example Data Formatting" for type-specific value formats.`, withAuthParams({ moduleId: z.string().describe("Module ID"), moduleSchema: z.object({}).passthrough().describe("Complete module schema (obtained from get_module)"), exampleData: z.object({}).passthrough().describe("Example data for EVERY variable in the module schema. Structure must match the schema exactly. Fill ALL variables without exception."), }), { readOnlyHint: false, destructiveHint: false }, withAuth(async ({ moduleId, moduleSchema, exampleData }, extra) => { try { // Validate required parameters const validationError = validateRequired({ moduleId, exampleData }, ['moduleId', 'exampleData'], 'set_module_example_data'); if (validationError) return validationError; // Validate that all schema variables are present in exampleData if (moduleSchema && moduleSchema.codeVars) { const schemaVars = Object.keys(moduleSchema.codeVars); const dataVars = Object.keys(exampleData); const missingVars = schemaVars.filter(v => !dataVars.includes(v)); if (missingVars.length > 0) { console.warn(`[set_module_example_data] WARNING: Missing variables in exampleData: ${missingVars.join(', ')}`); } // Check for upload fields that are not arrays for (const [varName, varInfo] of Object.entries(moduleSchema.codeVars)) { if (varInfo.type === 'upload' && exampleData[varName]) { if (!Array.isArray(exampleData[varName])) { console.error(`[set_module_example_data] ERROR: Upload field '${varName}' is not an array! Current value: ${JSON.stringify(exampleData[varName])}`); console.error(`[set_module_example_data] Upload fields MUST be arrays with urlPath objects: [{"urlPath": "..."}]`); } else if (exampleData[varName].length > 0 && !exampleData[varName][0].urlPath) { console.error(`[set_module_example_data] ERROR: Upload field '${varName}' items missing 'urlPath' property!`); } } } } const credentials = await getSessionCredentials(extra.sessionId); const client = await getApiClient(extra.sessionId); // Log data for debugging console.error(`[set_module_example_data] Module ID: ${moduleId}`); console.error(`[set_module_example_data] Module Schema:`, JSON.stringify(moduleSchema, null, 2)); console.error(`[set_module_example_data] Example Data:`, JSON.stringify(exampleData, null, 2)); // Prepare payload for setStaticVars action const payload = await getCommonParams(extra.sessionId, { action_ws: "setStaticVars", moduleId: moduleId, staticVars: exampleData, schema: moduleSchema }); console.error(`[set_module_example_data] Full Payload:`, JSON.stringify(payload, null, 2)); // Send to viewer_functions const response = await client.post("/cms/lib/viewer_functions.php", payload); console.error(`[set_module_example_data] Response:`, JSON.stringify(response.data, null, 2)); // Check for API errors in response const apiError = handleApiResponse(response.data, 'set_module_example_data'); if (apiError) return apiError; return { content: [{ type: "text", text: JSON.stringify({ success: true, message: `Example data set successfully for module '${moduleId}'`, moduleId: moduleId, dataCount: Object.keys(exampleData).length, schemaVarsCount: moduleSchema?.codeVars ? Object.keys(moduleSchema.codeVars).length : 0, response: response.data }, null, 2) }], }; } catch (error) { return handleToolError(error, 'set_module_example_data', { moduleId }); } }) ); }