/** * El nodo de Word como AI toolkit: sus operaciones como herramientas que un AI * Node, un servidor MCP o un agente de voz pueden llamar. * * ## Lo decidido (2026-10-01, `plans/microsoft-word.md` §5) * * - **Diez herramientas** para diez operaciones: todas menos «Download * document», que guarda un fichero para el nodo SIGUIENTE del flujo y a * un modelo no le sirve — `read_word_document` le da el texto. Va con su * motivo en {@link WORD_OPERACIONES_SIN_HERRAMIENTA}. * - **Nacen bloqueadas dos**: reemplazar texto (pisa contenido que ya * existía; el criterio de los borrados de Outlook, Bucket y Airtable) y * compartir (expone el documento; el criterio de `share_drive_file`). El * dueño las desbloquea en el nodo. * - **Los nombres eligen su clase** (`clase-de-herramienta.ts`): el de la * plantilla se llama `create_word_document_from_template` y el del PDF * `create_pdf_from_word_document` porque `fill_` y `convert_` no son * verbos conocidos y se tratarían como lo peor. `share_word_document` es * destructiva por excepción. * - **El conflicto de nombre es SIEMPRE `rename`** en el toolkit (un agente * no pisa ficheros) y el fichero adjunto (`attachFile`) es del flujo: los * dos FUERA, con nombre ({@link WORD_TOOLKIT_FUERA}). * - **Alcance del dueño**: una carpeta opcional en los ajustes del toolkit * (`toolkitFolderId` de la entidad; vacía = todo el OneDrive) y los * enlaces de edición sólo si el dueño los permite * (`toolkitAllowEditLinks`). Los aplica hw-nodes en cada llamada; aquí * sólo se declaran las herramientas. * * ## El esquema * * Sólo `string`, `number` y `boolean` (lo que admite MCP): `fields` va como * JSON en texto (y se acepta el objeto ya hecho). Los argumentos son * LITERALES: un `{{payload…}}` del modelo no se resuelve — por eso una * plantilla de Word con `{{campos}}` SÍ se puede crear con * `create_word_document`. */ import type { CampoDeToolkit } from './argumentos-de-toolkit.js'; import type { WordOperation } from './word-operations.js'; /** Las operaciones que NO son herramienta, cada una con su motivo. */ export declare const WORD_OPERACIONES_SIN_HERRAMIENTA: Readonly<{ readonly downloadDocument: "Guarda un fichero para el nodo siguiente del flujo; a un modelo no le sirve — read_word_document le da el texto."; }>; export type WordToolkitOperation = Exclude; export interface WordToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface WordToolkitSpec { operation: WordToolkitOperation; label: string; toolName: string; description: string; parameters: WordToolkitParameter[]; destructive?: boolean; /** Nace bloqueada en el nodo; el dueño la desbloquea. Ver `toolkits.ts`. */ bloqueadaPorDefecto?: boolean; } export declare const WORD_TOOLKIT_SPECS: WordToolkitSpec[]; export declare const WORD_TOOLKIT_SPECS_BY_TOOL_NAME: Readonly>; export declare const WORD_TOOLKIT_CAMPOS: Readonly>>>; /** Los campos de single operation que el toolkit NO expone, y por qué. El * test de paridad los salta con nombre, no en silencio. */ export declare const WORD_TOOLKIT_FUERA: Readonly>;