/** * El nodo de Excel 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-excel.md` §5) * * - **Las diecisiete**, una herramienta por operación. Todas llevan `excel` * en el nombre: ninguna choca con las de Google Sheets (`append_row`, * `get_rows`, `read_range`…). * - **Nacen bloqueadas cinco**: borrar filas, borrar una hoja, quitar una * tabla, escribir un rango y limpiar un rango. Los borrados, porque quitan * datos sin papelera por la API (el criterio de Outlook, Bucket y * Airtable). `write_excel_range`, porque pisa A CIEGAS cualquier rango * —cabeceras y fórmulas incluidas— y no hay deshacer por la API: es el * caso de `create_or_update_file` de GitHub; para escribir filas el modelo * ya tiene las herramientas por columna. `update_excel_rows` y * `append_or_update_excel_row` son destructivas (el gate del AI Node lo * sabe) pero no nacen bloqueadas, como `update_outlook_event`: tocan sólo * las columnas nombradas de las filas que casan, con tope. El dueño las * desbloquea en el nodo. * - **El modelo no decide si una celda es fórmula** (`valuesAsText` fuera): * ver {@link EXCEL_TOOLKIT_FUERA}. * - **Alcance del dueño** ({@link EXCEL_TOOLKIT_ALCANCES}): el libro del nodo * (de fábrica) o cualquiera de la cuenta. Lo aplica hw-nodes; aquí sólo se * declara. * - **Topes FIJOS** ({@link EXCEL_TOOLKIT_TOPES}): decide el LLM dentro de * ellos (la regla del 2026-09-27); no los pone el dueño. * * ## El esquema * * Sólo `string`, `number` y `boolean` (lo que admite MCP): los valores de una * fila van como JSON en texto, y las cabeceras separadas por comas. Los * argumentos son LITERALES: un `{{payload…}}` del modelo no se resuelve. */ import type { CampoDeToolkit } from './argumentos-de-toolkit.js'; import type { ExcelOperation } from './excel-operations.js'; export type ExcelToolkitOperation = ExcelOperation; export interface ExcelToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface ExcelToolkitSpec { operation: ExcelToolkitOperation; label: string; toolName: string; description: string; parameters: ExcelToolkitParameter[]; destructive?: boolean; /** Nace bloqueada en el nodo; el dueño la desbloquea. Ver `toolkits.ts`. */ bloqueadaPorDefecto?: boolean; } /** * Los parámetros que el nodo puede traer configurados: con defecto (los * ajustes del toolkit, o la single operation si es LITERAL), MCP los saca de * `required` y le cuenta el valor al modelo. */ export declare const EXCEL_TOOLKIT_DEFAULTABLE: readonly ["workbook_id", "worksheet", "table"]; /** Hasta dónde llega el modelo. `node` (el de fábrica; `null` = node): el * libro del nodo. `any`: cualquier libro de la cuenta. */ export declare const EXCEL_TOOLKIT_ALCANCES: readonly ["node", "any"]; export type ExcelToolkitAlcance = (typeof EXCEL_TOOLKIT_ALCANCES)[number]; /** * Lo más que puede pedir el modelo, fijo: filas por lectura (`limit`), celdas * por rango (`celdas`) y filas por escritura (`filas`) — que en `update_all` / * `delete_all` cuenta las filas QUE CASAN, comprobadas antes de escribir. * Pasarse: las lecturas se recortan con `notes`; las escrituras se niegan * (400) sin escribir nada. */ export declare const EXCEL_TOOLKIT_TOPES: Readonly<{ readonly limit: 200; readonly celdas: 2000; readonly filas: 100; }>; export declare const EXCEL_TOOLKIT_SPECS: ExcelToolkitSpec[]; export declare const EXCEL_TOOLKIT_SPECS_BY_TOOL_NAME: Readonly>; /** El campo de `operationConfig` que recibe la fila del modelo (ver arriba). */ export declare const EXCEL_CAMPO_DE_VALORES_DEL_MODELO = "rowValues"; export declare const EXCEL_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 EXCEL_TOOLKIT_FUERA: Readonly>;