/** * GitHub operation enum — única fuente de verdad para la api, el dashboard y * el Message Broker. Lo usan: * - la entidad y el DTO de `githubAction` (api): campo `operation` + validación * - la página de detalle del dashboard, que pinta el formulario desde los specs * - specs de toolkit MCP, si algún día el nodo gana modo herramienta * * Mismo patrón que `notion-operations.ts` y `shopify-operations.ts`. * * ── Qué credencial hay debajo ── * * Dos tipos, y la diferencia se nota en UNA cosa que no es una operación: * de dónde sale la lista de repositorios. * * - `github_app` — la instalación de la GitHub App. El camino principal. * Los repos son los que abarca esa instalación. * - `github_pat` — un fine-grained token pegado por el usuario. La salida * de emergencia, detrás de "Use a personal access token instead". * Los repos son los del usuario. * * Las 14 operaciones de abajo se ejecutan IGUAL con las dos. Lo que cambia es * el listado que rellena el formulario, y eso vive en el controlador, no aquí. * * ── Por qué 14 y no la API entera ── * * Paridad con lo que la gente encadena en un flujo, no con los docs de GitHub. * Abrir un issue, comentarlo, mover un PR, leer o escribir un archivo, disparar * un workflow. Lo demás —releases, gists, administración de la organización, * búsqueda de código— lo cubre el MCP oficial de GitHub dentro del AI Node, que * ya existe y no hay que construir. * * Y la regla que dejó escrita Notion se respeta al pie: **ninguna operación * declarada sin implementar**. El enum ES el contrato de la pantalla — una op * declarada se pinta en el desplegable y luego revienta al ejecutarse. Entran * cuando entre su código. * * ── Lo que NO es un parámetro, a propósito ── * * El `sha`. Actualizar un archivo y crear una rama lo necesitan, y GitHub no * perdona uno equivocado. Pedírselo al usuario es pedirle que se equivoque: lo * resuelve el nodo, desde la ruta del archivo o el nombre de la rama base. Es * el mismo criterio por el que un id de Notion se elige de una lista en vez de * teclearse. * * Tampoco son operaciones listar repos, ramas, etiquetas, asignables o * workflows. Una operación existe para producir payload en una corrida; eso * otro es para rellenar el formulario, y son endpoints del controlador — como * Drive alimenta su `DriveFilePicker`. * * ── Límites de GitHub que condicionan el diseño ── * * - 5.000 peticiones/hora autenticadas. Suficiente salvo en bucles largos. * - `searchIssues` NO comparte ese cubo: la API de búsqueda va por su cuenta, * del orden de 30 por minuto. Por eso está marcada aparte más abajo. * - Las escrituras tienen además un límite secundario por ráfaga, y GitHub * responde con `Retry-After`. Se respeta con `common/rate-limiter.ts` y * `common/retry-transient.ts`, que ya existen. No escribir otro backoff. */ export declare const GITHUB_OPERATIONS: readonly ["createIssue", "updateIssue", "getIssue", "commentIssue", "listIssues", "createPullRequest", "getPullRequest", "mergePullRequest", "listPullRequests", "getFile", "createOrUpdateFile", "createBranch", "dispatchWorkflow", "searchIssues"]; export type GithubOperation = (typeof GITHUB_OPERATIONS)[number]; /** Type guard — para validar entrada no fiable (DTOs, tool calls). */ export declare function isGithubOperation(value: unknown): value is GithubOperation; /** * Las operaciones que devuelven un ARRAY y por tanto obligan a marcar * `_meta.iterable` en `getOutputPayload`. * * Está aquí y no sólo en la api porque el error de olvidarlo no falla al * compilar: falla en producción, callado, con el nodo de abajo recibiendo el * sobre entero en vez de un elemento, y el PayloadViewer pintando rutas con * corchetes que nadie puede usar. Que la lista viva en el paquete permite que * el test de la api la recorra en vez de repetirla a mano. */ export declare const GITHUB_ITERABLE_OPERATIONS: readonly GithubOperation[]; export type GithubParamType = /** Selector vivo de repositorios que alcanza la credencial. Guarda * `owner/repo`, que es como lo consumen todas las rutas. */ 'githubRepo' /** Selector vivo de ramas del repo elegido. Admite escribir una que aún no * existe: `createBranch` la crea, y una plantilla puede resolverla. */ | 'githubBranch' /** Etiquetas del repo elegido, selección múltiple. */ | 'githubLabels' /** Usuarios asignables en el repo elegido, selección múltiple. */ | 'githubAssignees' /** Workflows del repo que declaran `workflow_dispatch`. Los demás no se * pueden disparar, así que no se ofrecen. */ | 'githubWorkflow' /** Texto con autocompletado de `{{payload.*}}`. */ | 'template' /** Área de texto larga, también con autocompletado. */ | 'textarea' /** `` de `''` / `'true'` / `'false'` que se guarda como BOOLEANO, o * no se guarda si es `''`. "— sin tocar —" tiene que significar que la clave * no viaja, no que viaja en `false`. */ | 'booleanSelect' /** Área de texto para JSON crudo. */ | 'json'; export interface GithubParamSpec { /** La clave de `operationConfig`. Es lo que lee la api, no un nombre de UI. */ name: string; label: string; type: GithubParamType; 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; }; } export interface GithubOperationSpec { /** Etiqueta de la fila en el desplegable de operación. */ label: string; /** Sub-línea bajo la etiqueta. */ description: string; /** Ruta a la que mapea, tal cual, para poder cotejarla con los docs. */ apiRoute: string; /** Esquema de parámetros. El orden ES el orden en pantalla. */ params: GithubParamSpec[]; } export declare const GITHUB_OPERATION_SPECS: Record; /** * Lo que se ofrece en el desplegable de operación. * * Hoy son todas. Existe como constante aparte —y no como alias de * `GITHUB_OPERATIONS`— porque es exactamente el punto donde otros nodos han * necesitado esconder una op sin sacarla del enum: retirarla del enum rompe * las que ya estaban guardadas en la base de datos. */ export declare const GITHUB_DROPDOWN_OPERATIONS: readonly GithubOperation[];