import { z } from "zod"; import { handleToolError, validateRequired } from "../helpers/errorHandler.js"; import { readDoc } from "./_docsReader.js"; export function registerReadDocTool(server) { server.tool( "read_doc", `Lee un documento del knowledge base de Acai bajo demanda. Cuándo usarlo: - El doc no se cargó completo en el contexto (aparece en "Other Available Docs" del knowledge_base). - Necesitas una sección concreta con detalle sin cargar todo el doc. - Vas a hacer una operación delicada y quieres releer las reglas exactas (e.g. crear una tabla, escribir un hook, editar el header). Parámetros: - name: id del doc (sin extensión). Ejemplos: '01-builder-fields', '05-tables-and-fields', '09-mcp-tools-reference'. Usa 'list_docs' si dudas del id. - section: opcional. Match case-insensitive y parcial sobre headings H2 ('## ...'). Devuelve desde el heading hasta el siguiente H2. Si la sección no existe, la respuesta incluye 'available_sections' para que reintentes con un nombre válido. Docs disponibles (resumen): - 01-builder-fields — Campos editables (data-field-type), atributos Acai (c-if, c-for, c-class), c-form, componentes built-in. - 02-twig — Filtros Twig (get, queryDB, hook, module, imagec, translate, raw). - 03-modules-and-sections — Módulos vs secciones generales, thisrecord, multiv2, custom-{tableName}. - 04-pages-and-records — Builder vs Standard, menuType, apartados, reglas sobre enlace/controlador. - 05-tables-and-fields — Schema, create_table, create_field, tipos de campo, casos destructivos. - 06-hooks-and-cmsapi — Hooks PHP, CmsApi/CocoDB, hook middleware. - 07-css-js-conventions — Tailwind+BEM, scoping, Vue 3, componentes nativos. - 08-layout-and-libraries — get/set_layout_field, librerías globales, regla de no editar layout.json. - 09-mcp-tools-reference — Inventario completo + workflows canónicos. - 10-production-patterns — Patrones reales (cabecera, zigzag, FAQ, formulario, detalle). - 11-quick-reference — Cheat sheet con todas las reglas y formatos.`, { name: z.string().describe("ID del doc sin extensión (e.g. '05-tables-and-fields')"), section: z.string().optional().describe("Heading H2 a extraer (case-insensitive, parcial). Omitir para leer el doc completo."), }, { readOnlyHint: true, destructiveHint: false }, async ({ name, section }) => { try { const validationError = validateRequired({ name }, ["name"], "read_doc"); if (validationError) return validationError; const data = await readDoc(name, section); return { content: [{ type: "text", text: JSON.stringify(data, null, 2), }], }; } catch (error) { if (error?.code === "DOC_NOT_FOUND") { return { content: [{ type: "text", text: JSON.stringify({ success: false, error: error.message, hint: "Usa 'list_docs' para ver los ids disponibles. Los ids tienen prefijo numérico (e.g. '05-tables-and-fields').", }, null, 2), }], isError: true, }; } return handleToolError(error, "read_doc", { name, section }); } } ); }