/** * El nodo de Calendly: lo que pasa alrededor de una reserva. * * ## Por qué existe * * [2026-09-15] Calendly expone una API v2 con OAuth 2.0 (PKCE + secret, * refresh de un solo uso) y webhooks firmados. La reserva en sí la hace el * invitado en Calendly; lo que HostWebhook necesita es leerla (el trigger la * trae; este nodo la consulta), cancelarla, marcar el no-show, y las dos * que cierran el círculo: un link de reserva que caduca al usarse y los * huecos libres de un tipo de evento, para que un agente los ofrezca. * * ## Cómo se nombra todo * * Calendly identifica cada cosa por su URI completa * (`https://api.calendly.com/scheduled_events/ABC…`), no por un id corto. * Los parámetros que piden una la aceptan entera o sólo el uuid final; el * servicio completa el prefijo. Los que piden «Mine / Whole organization» * resuelven al `owner` y `organization` que la credencial guardó al * conectar, así que el usuario no escribe URIs nunca. * * ## Por qué nueve * * Eventos (listar, uno, invitados, cancelar), no-show (poner y quitar), * tipos de evento (listar), huecos libres y link de un solo uso. Fuera a * propósito: crear tipos de evento, contactos, routing forms, recaps y toda * la gestión de organización —nada de eso es «lo que pasa alrededor de una * reserva». Los webhooks van en el trigger, no aquí. * * ⚠️ El orden de este array es el orden del desplegable. */ export declare const CALENDLY_OPERATIONS: readonly ["listEvents", "getEvent", "listInvitees", "cancelEvent", "markNoShow", "undoNoShow", "listEventTypes", "getAvailableTimes", "createSchedulingLink"]; export type CalendlyOperation = (typeof CALENDLY_OPERATIONS)[number]; export declare function isCalendlyOperation(value: unknown): value is CalendlyOperation; /** * Las que devuelven una COLECCIÓN sobre la que el nodo de abajo repite. Cada * una itera SU campo (`iterateField` en la spec): `events`, `invitees`, * `eventTypes`, `slots`. La salida lleva `_meta.iterable: true`. */ export declare const CALENDLY_ITERABLE_OPERATIONS: ReadonlyArray; /** * Tipos de parámetro. Los seis primeros son los de Apify. Los tres nuevos: * * - `datetime`: una fecha con hora de PARED (`2026-09-20T10:00:00`, sin * desfase), que el nodo sitúa en la zona del parámetro `timezone` de esa * operación —o en la del workspace si no se eligió—, igual que hace el * nodo de Google Calendar. Con desfase (`Z`, `+02:00`) manda el desfase. * El dashboard la pinta con el mismo calendario que Calendar y admite * plantilla (`{{payload.from}}`). * - `timezone`: la zona en la que se leen las fechas de pared de la * operación. Sin elegir, la del workspace. * - `eventType`: un desplegable que lista los tipos de evento de la * credencial (`GET /calendly-actions/event-types`); el valor es la URI del * tipo. Admite plantilla para cuando viene del payload. */ export type CalendlyParamType = "template" | "textarea" | "json" | "select" | "number" | "booleanSelect" | "datetime" | "timezone" | "eventType"; export interface CalendlyParamSpec { name: string; label: string; type: CalendlyParamType; required?: boolean; description?: string; placeholder?: string; default?: string | number; options?: ReadonlyArray<{ value: string; label: string; }>; min?: number; max?: number; advanced?: boolean; } export interface CalendlyOperationSpec { label: string; /** * Para la tarjeta del lienzo, donde caben 260px [2026-09-30]: sólo cuando * `label` no cabe. Vive aquí, junto a la etiqueta, para que no se desvíen. */ labelShort?: string; description: string; apiRoute: string; params: CalendlyParamSpec[]; /** El campo de la salida que se itera; sólo en las iterables. */ iterateField?: string; } export declare const CALENDLY_OPERATION_SPECS: Record;