/** La operación nueva. */ export declare const OPERACION_DEL_POST = "post"; /** Las tres de antes, que siguen valiendo (alias de `post`). */ export declare const OPERACIONES_VIEJAS_DEL_POST: readonly string[]; /** `post` y sus tres alias: lo que bloquea o desbloquea junto. */ export declare const OPERACIONES_DE_LA_FAMILIA_DEL_POST: readonly string[]; /** 🔒 Lo único universal que `post` lee. Lo demás son los extras que cada * proveedor ya ponía a `postText` / `postWithMedia` (`visibility`, * `language`, `longTextStrategy`…), y nada más. */ export declare const CAMPOS_PROPIOS_DEL_POST: readonly string[]; /** 🔒 Campos de otras operaciones de publicar que `post` NO admite jamás: con * ellos `post` haría de `replyToPost` (`inReplyTo`), de `quoteTweet` * (`quoteOf`) o de `postWithLabels` (`labels`). */ export declare const CAMPOS_QUE_POST_NO_ADMITE: readonly string[]; /** Lo que una red pide a un `post`. */ export interface ReglasDelPost { /** La red NO publica sin media (Instagram): sin ella, no hay post. */ mediaObligatoria: boolean; /** La red tiene aviso de contenido de texto libre (Mastodon: `spoiler_text`). * Las etiquetas de Bluesky NO lo son —es un vocabulario fijo— y siguen * siendo su operación propia, `postWithLabels`. */ avisoDeContenido: boolean; } /** * Qué admite cada red en un `post`, las mismas que `SOCIAL_OPERACIONES_POR_RED`. * * ⚠️ Es una COPIA de lo que declaran los proveedores, atada por * `el-post-es-una-sola-operacion.spec.ts` (gemelo en la api y hw-nodes): * `mediaObligatoria` es `mediaLimits.requiresMedia` y `avisoDeContenido` es * tener la operación propia `postWithCW`. Cuánta media cabe NO está aquí: viaja * en el catálogo (`mediaLimits`), que es de donde la lee la pantalla. */ export declare const SOCIAL_REGLAS_DEL_POST: Readonly>; /** Las reglas de una red, o `null` si no se conoce (también un nombre del * prototipo de Object: lo escribe el modelo). */ export declare function reglasDelPost(red: string): ReglasDelPost | null; /** Cómo sale el post: lo que dice la línea «Will post as…» del panel. */ export type FormaDelPost = 'solo-texto' | 'texto-con-media' | 'solo-media'; /** Por qué no se puede publicar, en una clave estable. */ export type ProblemaDelPost = 'red-sin-post' | 'sin-texto-ni-media' | 'la-red-pide-media' | 'falta-el-texto-del-aviso'; export interface DecisionDelPost { /** La operación que el proveedor corre, o `null` si el post no se puede hacer. */ operacion: 'postText' | 'postWithMedia' | 'postWithCW' | null; forma: FormaDelPost | null; /** Qué falta, o `null` si se puede publicar. */ problema: ProblemaDelPost | null; /** El texto del problema, para quien lo muestra o lo lanza. */ mensaje: string | null; /** Se pidió el aviso de contenido y esta red no lo admite: se publica SIN él. * En un crosspost es lo esperado (aplica sólo a las redes que lo tienen); en * un nodo de una sola red, quien llama decide si le basta con avisar. */ avisoIgnorado: boolean; } export interface OpcionesDelPost { /** El nombre que lleva el mensaje (`Instagram`); por defecto, el id de la red. */ nombreDeLaRed?: string; /** El panel mira la configuración SIN renderizar: una plantilla de texto en * `media` (`{{payload.imagen}}`) cuenta como media. El motor mira lo ya * renderizado, donde sólo una lista no vacía lo es, igual que antes. */ plantillas?: boolean; } /** * Qué operación corre un `post` en esta red, o por qué no se puede. * * - con aviso de contenido pedido, una red que lo admite y SIN media → * `postWithCW`; CON media → `postWithMedia` (que lleva el `spoilerText`); * - con media → `postWithMedia`; si no → `postText`; * - sin texto ni media → «Add a text or a media file»; la red que exige media * y no la tiene → « needs a media file»; el aviso pedido sin su texto * → «Add the content warning text». * * El aviso se pide con `contentWarning: true` y su texto en `spoilerText`; sin * la casilla encendida, `spoilerText` no se mira. * * Pura: no lee el prototipo, no toca lo que recibe y no lanza. */ export declare function decidirElPost(red: string, configuracion: unknown, opciones?: OpcionesDelPost): DecisionDelPost; /** * Los nombres de herramienta de la familia de «Post» en una red: * `_post` y los alias que esa red tiene (Instagram: `post` y * `postWithMedia`; Mastodon: los cuatro). Vacío si la red no se conoce. */ export declare function familiaDelPost(red: string): readonly string[]; /** * 🔒 ¿Esta herramienta queda bloqueada por OTRO nombre de su familia? * Sólo la mitad que {@link herramientaBloqueadaEn} no ve por sí misma: que el * propio nombre esté en la lista ya lo mira ella. * * La familia es UNA puerta: si CUALQUIER nombre de ella está bloqueado, quedan * cerrados TODOS — `post` y las tres viejas—. Es lo que dice el panel, que * enseña «Post» bloqueado con cualquiera de ellos, y lo único que no deja a * una herramienta guardada con `operationOverride: "postWithMedia"` publicar * cuando el dueño ve «Post» cerrado. Antes (1.160.0) una vieja sólo cerraba a * `post`, no a sus hermanas: bloquear `postText` dejaba abiertas * `postWithMedia` y `postWithCW`. * * `replyToPost`, `quoteTweet` y `postWithLabels` no son de la familia. */ export declare function bloqueaLaFamiliaDelPost(bloqueadas: readonly string[], nombre: string): boolean; /** ¿Enseña el panel «Post» como bloqueado en esta red? Sí si CUALQUIER nombre * de la familia lo está: una lista guardada con `bluesky_postText` es un Post * bloqueado, aunque el panel no tenga ese chip. */ export declare function elPostEstaBloqueado(bloqueadas: readonly string[], red: string): boolean; /** La lista sin ningún nombre de la familia de «Post» de esa red: lo que guarda * el panel al DESBLOQUEAR «Post». Quitar sólo `_post` dejaría las viejas * y el Post seguiría bloqueado. No toca el resto de la lista. */ export declare function sinLaFamiliaDelPost(bloqueadas: readonly string[], red: string): string[];