/** * Google Analytics 4 operation enum — single source of truth across the API, * Dashboard, and Message Broker. Used by: * - googleAnalyticsAction entity / DTO (api): operation field + validation * - dashboard GoogleAnalyticsAction operation type * - MCP toolkit specs, si algún día el nodo gana modo toolkit * * Mismo patrón que `drive-operations.ts` y `sheets-operations.ts`. * * ── Por qué sólo dos operaciones ── * * GA4 tiene más superficie (`runPivotReport`, `batchRunReports`, * `checkCompatibility`), pero declarar una op que el servicio todavía no * implementa la pinta en el desplegable y la deja fallar al ejecutarse: el * enum ES el contrato de la pantalla. Entran cuando entre su código. * * ── Lo que NO es una operación ── * * Listar propiedades y listar las dimensiones/métricas disponibles NO son * ops del nodo: son endpoints del controlador, que es como Drive alimenta su * `DriveFilePicker` (`@Get('files/:credentialId')`). Una op existe para * producir payload en una corrida; esto otro es para rellenar el formulario. * * ── Decisiones propias de GA (anti-n8n) ── * * - La propiedad se ELIGE de una lista, no se teclea. `properties/123456789` * y `G-XXXXXXX` se confunden todo el rato y el error de GA no lo aclara. * - Las fechas admiten `NdaysAgo` / `yesterday` / `today` además de * `YYYY-MM-DD`, que es lo que acepta la API, y son el sitio donde avisar * de que el dato no está cerrado hasta pasadas ~48 h. * - El filtro común (una dimensión, un valor) son tres campos; la * `FilterExpression` cruda queda de escape en Advanced y gana si está. */ export declare const GOOGLE_ANALYTICS_OPERATIONS: readonly ["runReport", "runRealtimeReport"]; export type GoogleAnalyticsOperation = (typeof GOOGLE_ANALYTICS_OPERATIONS)[number]; /** Type guard — para validar entrada no fiable (DTOs, tool calls). */ export declare function isGoogleAnalyticsOperation(value: unknown): value is GoogleAnalyticsOperation; export type GoogleAnalyticsParamType = /** Selector vivo de propiedades GA4 (necesita credencial). */ 'analyticsProperty' /** Multi-selección de métricas, con las opciones vivas del metadata. */ | 'analyticsMetrics' /** Multi-selección de dimensiones, igual que las métricas. */ | 'analyticsDimensions' /** * UNA dimensión del esquema de la propiedad. Es la del filtro simple, que * la API sólo sabe aplicar a un campo: pintarla con el multi-select dejaba * elegir dos y mandaba `fieldName: "country,city"`, que Google rechaza. */ | 'analyticsDimension' /** * Una de las métricas o dimensiones YA ELEGIDAS en esta operación. Es el * orden: la API sólo ordena por lo que el informe pide, y el texto libre de * antes aceptaba cualquier cosa —una métrica sin elegir salía como * dimensión y Google contestaba «sessions is not a valid dimension», que no * dice que el problema es el orden—. */ | 'analyticsSortField' /** Texto con autocompletado de `{{payload.*}}`. */ | 'template' /** `` de `''` / `'true'` / `'false'` que se guarda como BOOLEANO, o * no se guarda si es `''`. Mismo motivo que el `starred` de Drive: "— sin * tocar —" tiene que significar que la clave no viaja. */ | 'booleanSelect' /** Área de texto para JSON crudo (la FilterExpression de escape). */ | 'json'; export interface GoogleAnalyticsParamSpec { /** La clave de `operationConfig`. Es lo que lee la api, no un nombre de UI. */ name: string; label: string; type: GoogleAnalyticsParamType; required?: boolean; /** Ayuda bajo el campo. Texto plano: el paquete no lleva React. */ description?: string; placeholder?: string; /** Prerrellenado cuando la config guardada no trae valor para esta clave. */ default?: string | number; /** Obligatorio en `select` y `booleanSelect` — etiqueta y valor difieren. */ options?: ReadonlyArray<{ value: string; label: string; }>; min?: number; max?: number; /** Se pinta en la pestaña "Advanced" en vez de en "Config". */ advanced?: boolean; /** Sólo visible cuando un campo hermano vale uno de estos. */ showWhen?: { field: string; in: ReadonlyArray; }; /** * Los únicos valores que la API acepta aquí EN ESTA OPERACIÓN, cuando son * menos que los que el metadata de la propiedad ofrece. * * Existe por el tiempo real: `getMetadata` devuelve el esquema del informe * estándar —cientos de campos— y la Realtime API sólo acepta 4 métricas y * 15 dimensiones. Sin esto la pantalla ofrecía `sessions` o `date` y el * informe fallaba al ejecutarse. `prefixes` cubre las personalizadas que sí * admite (`customUser:*`). Ver {@link isAllowedAnalyticsValue}. */ onlyValues?: { names: ReadonlyArray; prefixes?: ReadonlyArray; /** Por qué, dicho para quien usa la pantalla. */ reason: string; }; } export declare const GA4_REALTIME_METRICS: readonly ["activeUsers", "eventCount", "keyEvents", "screenPageViews"]; export declare const GA4_REALTIME_DIMENSIONS: readonly ["appVersion", "audienceId", "audienceName", "audienceResourceName", "city", "cityId", "country", "countryId", "deviceCategory", "eventName", "minutesAgo", "platform", "streamId", "streamName", "unifiedScreenName"]; /** * ¿Acepta la API este valor en este campo? Sin `onlyValues`, todo vale: la * lista la pone el metadata de la propiedad. Una plantilla (`{{…}}`) también * vale — se resuelve al ejecutar y no se puede juzgar antes. */ export declare function isAllowedAnalyticsValue(param: Pick, value: string): boolean; export interface GoogleAnalyticsOperationSpec { /** Etiqueta de la fila en el desplegable de operación. */ label: string; /** Sub-línea bajo la etiqueta. */ description: string; /** Método de la API al que mapea (developers.google.com/analytics/devguides/reporting/data/v1). */ apiMethod: string; /** Esquema de parámetros. El orden ES el orden en pantalla. */ params: GoogleAnalyticsParamSpec[]; } export declare const GOOGLE_ANALYTICS_OPERATION_SPECS: Record; /** * Las operaciones tal y como se listan en el desplegable. Hoy es el enum * entero; existe para que añadir una op interna (sin fila propia) no obligue * a que la página vuelva a decidir por su cuenta qué enseñar. */ export declare const GOOGLE_ANALYTICS_DROPDOWN_OPERATIONS: readonly GoogleAnalyticsOperation[];