/** * El nodo de Microsoft Teams 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-05, diseño `plans/microsoft-teams.md` §5) * * - **Las dieciséis**, una herramienta por operación, como Outlook y * Outlook Calendar: sin `list_teams`, `list_teams_channels` y * `list_teams_chats` el modelo no sabe qué ids usar, y sin * `find_teams_users` no sabe a qué correo mencionar. * - **Nacen bloqueadas** `delete_teams_message` —borra para todos, el * criterio de los borrados de Outlook, Bucket y Airtable— y * `create_teams_channel` —crea algo visible para todo el equipo y es de * permiso de admin: un agente no debería hacerlo sin que el dueño lo abra, * el criterio de `crawl_site`—. El dueño las desbloquea en el nodo. * - `update_teams_message` y `remove_teams_reaction` son destructivas (el * gate del AI Node lo sabe, por su verbo) pero NO nacen bloqueadas: como * `update_outlook_event`, y quitar la reacción propia no borra nada de * nadie (Slack y Discord tampoco la bloquean). * - **`where` es opcional aquí**: vacío → `chat` si viene `chat_id`, si no * `channel` (lo infiere hw-nodes). En single operation es obligatorio. * - **Las imágenes no entran** («Save inline images» guarda ficheros del * flujo que el modelo no puede abrir — el motivo de los adjuntos de * Outlook): van con nombre en {@link TEAMS_TOOLKIT_FUERA}. * - **Alcance del dueño** (opcional, `toolkitTeamIds` de la entidad): los * equipos que puede usar el agente; vacío = todos los de la cuenta. Con * alguno elegido, hw-nodes niega toda herramienta de canal con otro * `team_id` y `list_teams` sólo devuelve los permitidos. Los chats no * tienen alcance: se cierran bloqueando sus herramientas. Aquí sólo se * declara. * - **Topes fijos** de los listados (50; 25 para personas), como el resto de * toolkits: decide el LLM dentro de ellos. * * ## El esquema * * Sólo `string`, `number` y `boolean` (lo que admite MCP; un `array` tumba * OpenAI y Gemini): las menciones van separadas por comas. Los argumentos son * LITERALES: un `{{payload…}}` del modelo no se resuelve. */ import type { CampoDeToolkit } from './argumentos-de-toolkit.js'; import type { TeamsOperation } from './teams-operations.js'; export type TeamsToolkitOperation = TeamsOperation; export interface TeamsToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface TeamsToolkitSpec { operation: TeamsToolkitOperation; label: string; toolName: string; description: string; parameters: TeamsToolkitParameter[]; destructive?: boolean; /** Nace bloqueada en el nodo; el dueño la desbloquea. Ver `toolkits.ts`. */ bloqueadaPorDefecto?: boolean; } export declare const TEAMS_TOOLKIT_SPECS: TeamsToolkitSpec[]; export declare const TEAMS_TOOLKIT_SPECS_BY_TOOL_NAME: Readonly>; export declare const TEAMS_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 TEAMS_TOOLKIT_FUERA: Readonly>;