40 lines
1.7 KiB
JavaScript
40 lines
1.7 KiB
JavaScript
// Shared guard for generated layout artifacts. The global layout.json and the
|
|
// custom-header/custom-footer module folders are regenerated from the layout
|
|
// pipeline (see set_layout_field). Editing them directly leaves the JSON source
|
|
// out of sync and the visual builder overwrites the agent changes on next save.
|
|
|
|
const PROTECTED_LAYOUT_PATHS = [
|
|
"cms/lib/plugins/builder_saas/layout.json",
|
|
"template/estandar/modulos/custom-header-twig/",
|
|
"template/estandar/modulos/custom-footer-twig/",
|
|
"template/estandar/modulos/custom-header/",
|
|
"template/estandar/modulos/custom-footer/",
|
|
];
|
|
|
|
// Returns true when `relPath` points at the layout.json or any of the
|
|
// generated custom-{header,footer}[-twig] module folders.
|
|
export function isProtectedLayoutPath(relPath) {
|
|
if (!relPath) return false;
|
|
const norm = String(relPath).replace(/^\/+/, "");
|
|
return PROTECTED_LAYOUT_PATHS.some(p => {
|
|
// Folder entries end with "/" -> prefix match on the normalized path.
|
|
// File entries (no trailing slash) -> exact match only.
|
|
if (p.endsWith("/")) return norm === p.slice(0, -1) || norm.startsWith(p);
|
|
return norm === p;
|
|
});
|
|
}
|
|
|
|
// Builds a consistent MCP error response pointing the agent to set_layout_field.
|
|
export function buildProtectedLayoutPathError(relPath) {
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify({
|
|
success: false,
|
|
error: `Forbidden path: ${relPath} is a generated artifact of the global layout. Use set_layout_field instead with field='header' (for custom-header-twig) or field='footer' (for custom-footer-twig).`,
|
|
}, null, 2),
|
|
}],
|
|
isError: true,
|
|
};
|
|
}
|