/** * Postgres operation enum + metadatos por operación — una sola copia para la * api, el Dashboard y el broker. * * ── Por qué esto no trae un esquema de formulario ── * A diferencia de Slack, Discord, Sheets, Telegram, Contacts y Drive, * `postgresAction` **no tiene campos por operación**: el mismo formulario —SQL, * Parameters, Statement timeout— se pinta para las cinco. Su eje real es `mode` * (`single` / `transaction`). Así que aquí no hay `*_OPERATION_SPECS` de params, * porque saldrían idénticos cinco veces; lo que sí había era la lista escrita a * mano **nueve veces**, y eso es lo que esto quita: * * api dto: @ApiProperty enum, @IsIn, la unión TS (3) * api entity: @Prop enum, la unión TS (2) * dash lib/api.ts: la unión TS (1) * dash PostgresTablePicker: la unión en un prop (1) * dash PostgresActionDetail: OPERATIONS (1) * dash PostgresNode + FlowPanel: opLabels idénticos (2) * * Las **clases de color no están aquí**: son presentación (Tailwind), y se * quedan en el dashboard, igual que los `ICONOS` de Telegram y de Drive. */ export declare const POSTGRES_OPERATIONS: readonly ["query", "insertOne", "update", "delete", "execute"]; export type PostgresOperation = (typeof POSTGRES_OPERATIONS)[number]; /** Type guard — útil al validar entrada que no controlas (DTOs, tool calls). */ export declare function isPostgresOperation(value: unknown): value is PostgresOperation; /** * Cómo se ejecuta el nodo. `single` es una sentencia; `transaction` es una lista * ordenada dentro de BEGIN / COMMIT con rollback condicional. */ export declare const POSTGRES_MODES: readonly ["single", "transaction"]; export type PostgresMode = (typeof POSTGRES_MODES)[number]; export interface PostgresOperationSpec { /** * Etiqueta corta, para la píldora estrecha del lienzo y del panel. Estaba * escrita **idéntica** en `PostgresNode.tsx` y en `FlowPanel.tsx`. */ label: string; /** * La etiqueta larga del título del editor de SQL en la página de detalle, * donde hay sitio para el paréntesis aclaratorio. **No es la misma que * `label` y no debe unificarse**: son dos anchos distintos y las dos se ven. */ labelLong: string; /** Una línea de cuándo usar esta operación. */ description: string; /** SQL de ejemplo, el `placeholder` del editor. */ sqlPlaceholder: string; /** * Si la operación devuelve filas **siempre**. Sólo `execute` no: ahí depende * de `returnRows` en la entidad, porque puede ser DDL. * * Este invariante vivía en dos sitios y en uno era un comentario: la api lo * calculaba con `entity.operation !== 'execute' || entity.returnRows`, y el * dashboard lo expresaba como `localOperation === "execute"` para decidir si * enseñaba el interruptor. Es el mismo hecho, dicho aquí una vez. */ returnsRowsAlways: boolean; } export declare const POSTGRES_OPERATION_SPECS: Record;