/** * Slack AI Toolkit — las herramientas que un slackAction expone cuando * `aiEnabled` está encendido. * * **Se escribe una sola vez.** Antes vivía dos veces: una copia en * `dashboard/components/slack-actions/slack-operations-schemas.ts` y otra en * `api/src/mcp-servers/toolkit-specs.ts`, las dos a mano y en repos distintos, * así que ningún test podía compararlas. Es la octava y novena mudanza de esta * serie; de las siete anteriores, la de Contacts salió de que una copia * anunciara 15 herramientas y expusiera una. * * La deriva aquí era gorda: **14 de las 16 descripciones** diferían. Gana la de * la api en todas —es sistemáticamente la más completa y es la que sirve el MCP * hoy—, y una no era cosmética: en `deleteMessage` la api nombra el permiso que * hace falta (`chat:write.public` + admin) y el dashboard sólo decía «admin * perms». Operaciones, nombres de herramienta y parámetros sí coincidían. * * Los nombres llevan `_slack_` para no chocar con los de Telegram y Discord * cuando un mismo AI Node tiene varios toolkits encendidos. * * La forma es la que ya consume `toolkitSpecToMcpTool` en la api, para que * pueda usarse sin adaptador. Los textos van en inglés porque los lee el modelo * y quien mire la lista de herramientas del servidor MCP. */ import type { SlackOperation } from './slack-operations.js'; export interface SlackToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface SlackToolkitSpec { operation: SlackOperation; /** Etiqueta corta de la fila en la lista de herramientas. */ label: string; /** Nombre con el que el LLM llama a la herramienta. */ toolName: string; /** Descripción (más reglas de uso) que ve el LLM. */ description: string; parameters: SlackToolkitParameter[]; /** Pisa o borra. Lo pone `marcarDestructivas` leyendo el verbo del * nombre (ver `clase-de-herramienta.ts`), no se escribe a mano. */ destructive?: boolean; /** Nace bloqueada en el nodo; el dueño la desbloquea. Ver `toolkits.ts`. */ bloqueadaPorDefecto?: boolean; } export declare const SLACK_TOOLKIT_SPECS: SlackToolkitSpec[]; export declare const SLACK_TOOLKIT_BY_TOOL_NAME: Record; /** * Las herramientas que ofrecerle al modelo con ESTA credencial. * * Gemelo de `herramientasDeDiscordPara`, y por la misma razón: los dos * consumidores —la expansión MCP de la api y el selector del AI Node del * dashboard— filtrarían por su cuenta y acabarían discrepando. * * En Slack el recorte es brutal y conviene verlo escrito: con un webhook el * modelo pasa de **16 herramientas a una**, y esa una pierde el `channel`, * porque el destino lo fijó quien instaló la credencial. Dejarle el campo sería * invitarle a elegir un canal que Slack va a ignorar sin decir nada. */ export declare function herramientasDeSlackPara(tipoDeCredencial: string | null | undefined): SlackToolkitSpec[];