/** * OneDrive (los ficheros de Microsoft 365) por Microsoft Graph — la fuente * única de sus operaciones para el api, hw-nodes, el dashboard y el servidor * MCP. * * ## Por qué un nodo aparte (2026-10-01) * * Ariel pidió las integraciones de Microsoft 365 SEPARADAS, un nodo por * producto, cada uno con su action, su trigger y su AI toolkit, y una app de * Entra por servicio («HostWebhook OneDrive»): Microsoft sólo deja revocar la * app ENTERA, así que quitarle el correo a HostWebhook no le quita los * ficheros, ni al revés. Éste es el tercero, después de Outlook y Outlook * Calendar. * * ## Catorce operaciones en cuatro familias * * - **Files** — subir (un fichero del flujo o texto escrito), bajar a un * fichero de HostWebhook (`_file`) y leer como texto. * - **Find** — listar una carpeta, buscar y leer un elemento. * - **Organize** — crear carpeta («asegurar» que existe), copiar, mover o * renombrar y mandar a la papelera. * - **Sharing** — enlace, invitar a personas, ver quién tiene acceso y * quitarlo. * * ## La base de Excel y Word * * Los tipos de parámetro `onedriveFolder`, `onedriveFile` y `onedriveItem` (un * selector de la cuenta con «escribir a mano» en el pie) y los topes de subida * (`ONEDRIVE_SUBIDA_SIMPLE_MAX_BYTES`, `ONEDRIVE_TROZO_DE_SUBIDA`) son los que * reutilizan los nodos de Excel y Word: un libro o un docx se eligen y se * nombran igual que un fichero de OneDrive. * * ## Personal y trabajo * * Todo funciona con cuentas personales (Hotmail, Outlook.com) y de trabajo con * `Files.ReadWrite` (+ `Files.Read.All`, sólo para el trigger en trabajo). * Graph distingue en cuatro sitios, y el nodo lo dice antes de llamar: * - el enlace `embed` sólo existe en personal; `scope: organization`, sólo * en trabajo; * - la caducidad de un enlace o invitación, sólo en trabajo o personal * premium; * - `conflictBehavior` al copiar NO lo admite personal (se emula: nombre * libre, o 400 con `replace`). */ export declare const ONEDRIVE_OPERATIONS: readonly ["uploadFile", "downloadFile", "readFile", "listFolder", "searchFiles", "getItem", "createFolder", "copyItem", "moveItem", "deleteItem", "createShareLink", "inviteToItem", "listPermissions", "removePermission"]; export type OnedriveOperation = (typeof ONEDRIVE_OPERATIONS)[number]; /** Type guard — for DTOs and AI tool calls, where the input is untrusted. */ export declare function isOnedriveOperation(value: unknown): value is OnedriveOperation; /** * El tipo de credencial: el OAuth de la app «HostWebhook OneDrive» de Entra. * Un tipo por servicio de Microsoft, porque cada uno es su propia app. */ export declare const ONEDRIVE_CREDENTIAL_TYPE = "microsoft_onedrive_oauth2"; /** «List folder»: lo que se puede pedir, y lo que se pide si no se dice. */ export declare const ONEDRIVE_LISTADO_MAXIMO = 200; export declare const ONEDRIVE_LISTADO_POR_DEFECTO = 50; /** «Search»: lo mismo. La búsqueda de Graph pagina más corto. */ export declare const ONEDRIVE_BUSQUEDA_MAXIMO = 50; export declare const ONEDRIVE_BUSQUEDA_POR_DEFECTO = 25; /** * Hasta aquí, un `PUT …/content` simple; por encima, la sesión de subida de * Graph (`createUploadSession`) en trozos. Graph admite el PUT simple hasta * 250 MB, pero un cuerpo grande en UNA petición no se puede retomar si se corta. */ export declare const ONEDRIVE_SUBIDA_SIMPLE_MAX_BYTES: number; /** Lo más que sube el nodo desde un `_file` del flujo (en streaming, por trozos). */ export declare const ONEDRIVE_SUBIDA_MAX_BYTES: number; /** «Upload file» con «Text I write»: el contenido escrito, como mucho. */ export declare const ONEDRIVE_TEXTO_MAX_BYTES: number; /** * Lo más que se baja a un fichero de HostWebhook (`_file`): 16 MiB. * * Es una COPIA del techo del escáner (`MAX_SCAN_BYTES` de * `api/src/files/tope-de-subida.ts`). Un fichero de HostWebhook no pasa nunca * de ahí: en hw-nodes, `registerDirectFile` sube y confirma, y la confirmación * (`rechazarSiNoCabe`) BORRA lo que pase de `min(maxFileSize del plan, 16 MiB)` * con un 400; en el api, lo que pasa de 16 MiB sale `scan_failed` y no se sirve * nunca. Por eso esto es el máximo, y el tope REAL es el efectivo: * `min(ONEDRIVE_DESCARGA_MAX_BYTES, maxFileSize del plan)`, comparado con el * `size` del elemento ANTES de bajar nada. */ export declare const ONEDRIVE_DESCARGA_MAX_BYTES: number; /** «Read file as text»: lo más que se baja a memoria para leerlo (no se guarda). */ export declare const ONEDRIVE_LECTURA_MAX_BYTES: number; /** «Read file as text»: los caracteres que devuelve si no se dice, y el máximo. */ export declare const ONEDRIVE_LECTURA_CARACTERES_POR_DEFECTO = 50000; export declare const ONEDRIVE_LECTURA_CARACTERES_MAXIMO = 200000; /** * «List folder» con «Download the files too»: cuántos ficheros, cuánto cada * uno y cuánto en total por corrida. El de por fichero es el mismo techo de * 16 MiB de arriba (y nunca más que el tope efectivo del plan); lo que no cabe * sale sin `_file` y con `_fileSkipped` diciendo por qué. */ export declare const ONEDRIVE_LISTA_DESCARGA_MAX_FICHEROS = 10; export declare const ONEDRIVE_LISTA_DESCARGA_POR_FICHERO: number; export declare const ONEDRIVE_LISTA_DESCARGA_TOTAL: number; /** «Copy» con «Wait for it»: lo más que se sigue al monitor de la copia. */ export declare const ONEDRIVE_COPIA_ESPERA_MAX_MS = 60000; /** «Share with people»: destinatarios por llamada. */ export declare const ONEDRIVE_INVITADOS_MAX = 20; /** * El trozo de la sesión de subida: 32 × 320 KiB = 10 MiB. Graph exige * múltiplos de 320 KiB y menos de 60 MiB, y recomienda 5–10 MiB. */ export declare const ONEDRIVE_TROZO_DE_SUBIDA: number; /** Si el nombre ya está: `@microsoft.graph.conflictBehavior` al subir y copiar. */ export declare const ONEDRIVE_CONFLICTOS: readonly ["rename", "replace", "fail"]; /** * Si la carpeta ya está: `useExisting` (la de por defecto) devuelve la que hay * — así un flujo «se asegura» de que existe en un paso. No es un valor de * Graph: el nodo pide `fail` y, con el 409, lee la existente. */ export declare const ONEDRIVE_CONFLICTOS_DE_CARPETA: readonly ["useExisting", "rename", "fail"]; /** `type` de `createLink`. `embed` sólo existe en cuentas personales. */ export declare const ONEDRIVE_TIPOS_DE_ENLACE: readonly ["view", "edit", "embed"]; /** * `scope` de `createLink`. `organization` sólo en cuentas de trabajo. SIN * `users`: en v1.0 `createLink` no admite `recipients`, así que un enlace «sólo * para quien elijas» se crearía para nadie — eso es «Share with people». */ export declare const ONEDRIVE_ALCANCES_DE_ENLACE: readonly ["anonymous", "organization"]; /** `roles` de una invitación. */ export declare const ONEDRIVE_ROLES: readonly ["read", "write"]; /** «List folder» y «Search»: qué se enseña. */ export declare const ONEDRIVE_FILTROS: readonly ["all", "files", "folders"]; /** «List folder»: el orden (`newest` = `lastModifiedDateTime desc`, `largest` = `size desc`). */ export declare const ONEDRIVE_ORDENES: readonly ["name", "newest", "largest"]; /** «Download file»: tal cual, o convertido a PDF por Graph (`?format=pdf`). */ export declare const ONEDRIVE_FORMATOS: readonly ["original", "pdf"]; /** «Upload file»: de dónde sale lo que se sube. */ export declare const ONEDRIVE_FUENTES: readonly ["file", "text"]; export interface OnedriveParamSpec { /** Field key — also the property name on operationConfig. */ name: string; label: string; /** * Param type, so the dashboard renders the right control. Los cuatro * `onedrive*` son un selector de la cuenta con «escribir a mano» en el pie * (un ID, una ruta que empieza por `/`, o una plantilla): * - `onedriveFolder` — una carpeta (`""` guardado = la raíz, «My files»); * - `onedriveFile` — un fichero; * - `onedriveItem` — un fichero o una carpeta; * - `onedrivePermission` — un acceso (enlace o persona) del elemento que * está en `itemId` de la misma operación. El spec no declara esa * dependencia, como `jiraTransition` con la incidencia: la página lee * `operationConfig.itemId` y se lo pasa al selector. * Excel y Word reutilizan los tres primeros. */ type: 'text' | 'string' | 'number' | 'boolean' | 'select' | 'datetime' | 'onedriveFolder' | 'onedriveFile' | 'onedriveItem' | 'onedrivePermission'; required?: boolean; description: string; /** * El hueco vacío. En un `select` opcional dice lo que pasará si se deja sin * elegir («Keep both — rename the new one (default)»): lo enseña, no lo * marca — ningún campo nace elegido. */ placeholder?: string; /** For `select`. */ options?: readonly string[]; /** For `number`. */ min?: number; max?: number; /** Sólo se enseña cuando otro campo de la operación tiene uno de estos valores. */ showWhen?: { field: string; in: readonly string[]; }; } export interface OnedriveOperationSpec { label: string; description: string; /** The Graph route this maps to, so the mapping is checkable. */ apiRoute: string; /** Changes something in OneDrive (as opposed to only reading it). */ writes?: boolean; params: OnedriveParamSpec[]; } export declare const ONEDRIVE_OPERATION_SPECS: Record;