Activadores
Un activador inicia una sesión según una programación, mediante un webhook, a partir de un evento de una app o desde un monitor.
Un activador inicia una sesión sin que haya ninguna persona presente. Usa un activador para automatizar tareas recurrentes o basadas en eventos.
Para retomar más adelante la tarea de una sesión —«comprueba mañana si respondieron»—, usa un recordatorio. Un recordatorio es un activador asociado a esa sesión. Se almacena en la base de datos, no en beeuni.yaml.
Tipos de activadores
Beeuni admite cuatro tipos de activadores.
- cron: se ejecuta según la programación que configures.
- webhook: se ejecuta cuando un servicio externo envía una solicitud firmada a la URL de webhook del proyecto.
- event: se ejecuta cuando ocurre algo en una aplicación conectada, como una nueva solicitud de incorporación de cambios o un nuevo correo electrónico. Consulta Activadores de eventos de aplicaciones.
- monitor: ejecuta un comando de tu repositorio las 24 horas del día, los 7 días de la semana. Cada línea que el comando imprime en stdout activa el disparador. Experimental: consulta Monitores.
Defines los activadores en el manifiesto del proyecto, beeuni.yaml. Cada activador contiene una instrucción que se muestra como primer mensaje de la sesión activada. El estado de ejecución —como la última hora de activación y el estado— se almacena fuera del manifiesto, en la base de datos. La activación de un disparador no crea una confirmación.
Crear, actualizar o eliminar un activador desde el panel escribe directamente en la rama predeterminada. No pasa por una solicitud de cambio (CR). Editar beeuni.yaml dentro de una sesión y ejecutar beeuni ship sigue el flujo habitual de ramas y CR.
Configurar un activador cron
Añadir el activador
beeuni triggers add daily-digest --type cron \
--cron "0 0 9 * * 1-5" --timezone America/Los_Angeles \
--prompt "Summarize yesterday's activity and save it as a daily note."cron es una expresión de 6 campos: segundo, minuto, hora, día, mes y día de la semana. Un activador se ejecuta como máximo una vez por minuto: 0 */30 * * * * es cada 30 minutos, y se rechaza */30 * * * * * (cada 30 segundos). Este comando solo modifica tu beeuni.yaml local.
Publicarlo
beeuni shipbeeuni ship confirma beeuni.yaml y lo envía. La programación se activa cuando llega a la rama predeterminada del proyecto.
Confirmar que se ejecuta
beeuni triggers lsLa lista muestra el slug y el estado de cada activador, así como la última vez que se ejecutó. Para ejecutarlo ahora en lugar de esperar a la programación, ejecuta beeuni triggers fire daily-digest. El comando espera el resultado de la ejecución y, si falla, termina con un código distinto de cero y muestra el texto del error; --wait <dur> limita el tiempo de espera (valor predeterminado: 90s).
Configurar un activador webhook
Un activador webhook necesita un secreto. Beeuni lo usa para verificar la firma de cada solicitud entrante.
Añadir el secreto
beeuni secrets set WEBHOOK_SECRET=<a-random-value>Consulta Secretos para obtener más información sobre los secretos.
Añadir el activador
beeuni triggers add new-lead --type webhook \
--secret-env WEBHOOK_SECRET \
--prompt "A new lead arrived: {{ body.name }} ({{ body.email }}). Add it to the CRM."--secret-env indica qué secreto firma las solicitudes dirigidas a este activador.
Publicarlo
beeuni shipEnviar una solicitud
Beeuni crea la URL del webhook a partir del ID del proyecto y el slug del activador:
POST /v1/webhooks/projects/<project-id>/<slug>Envía a esta URL una solicitud POST firmada desde el servicio externo. Beeuni verifica la firma con WEBHOOK_SECRET y luego inicia una sesión con el cuerpo de la solicitud disponible en la instrucción. Consulta Firma del webhook más abajo para ver el encabezado y el formato exactos.
De forma predeterminada, cada activación inicia una sesión nueva en una rama nueva. Un activador puede reutilizar una sesión o fijarla, y un activador webhook puede filtrar qué cargas útiles inician una sesión. Consulta Estrategia de sesión y Plantillas de carga útil más abajo.
Activadores de eventos de aplicaciones
Un activador de eventos ejecuta un agente cuando ocurre un evento en una aplicación: se abre una solicitud de incorporación de cambios, llega un correo electrónico o cambia el estado de una incidencia. No tienes que configurar un webhook, un secreto ni una firma. Beeuni se suscribe al evento por ti y no tienes que firmar nada manualmente.
Un evento procede de un origen de eventos: un adaptador que entrega los eventos de una aplicación. Los ID como GITHUB_PULL_REQUEST_CREATED identifican los eventos que admite ese origen. Usa el catálogo de eventos para seleccionar un evento para tu conector.
Configurarlo en la aplicación web
- Abre el proyecto y, luego, Triggers y New trigger.
- Elige App event.
- Elige una aplicación. Debajo, selecciona un conector y una de sus cuentas compartidas, o conecta otra cuenta. Se usa la cuenta marcada como Default, a menos que elijas otra.
- Elige un evento. Debajo aparecerá el formulario de configuración del evento, por ejemplo, para seleccionar el repositorio.
- Escribe la instrucción y guarda.
El activador se pone en marcha en cuanto su distintivo indica Live. Los otros distintivos son Activating, Needs connection y Error. Corresponden a los estados pending, needs_connection y error que se describen más abajo.
Ver todos los activadores de eventos de aplicaciones
En la aplicación web, abre Triggers y selecciona App events. La fila de filtros muestra All, Schedules, App events y Webhooks, cada uno con un recuento. La selección se guarda en la dirección como ?type=event, para que puedas compartir el enlace. Las filas están agrupadas por aplicación. Debajo, Apps with events muestra todas las aplicaciones que pueden iniciar un agente, primero las que ya usa tu proyecto. Elige una para abrir el formulario de creación de activadores con esa aplicación seleccionada.
La ventana de un conector tiene una pestaña Triggers con los eventos de la aplicación de ese conector. La pestaña solo aparece para las aplicaciones que tienen eventos.
Con la CLI:
beeuni triggers ls --type event # every app event trigger, grouped by app
beeuni triggers ls --connector github-work # the app events on one connector
beeuni triggers ls --type event --json # the same list as JSON
--type también admite cron, webhook y monitor. --connector y --type se pueden combinar.
Configurarlo con la CLI
Un agente o una persona sigue estos pasos en orden. Cada paso muestra lo que necesita el siguiente.
beeuni triggers events --apps
beeuni triggers events --app github
beeuni connectors add github --provider composio --app github --apply
beeuni connectors connect github --owner project
beeuni triggers events --connector github
beeuni triggers events --connector github --event GITHUB_PULL_REQUEST_CREATED
beeuni triggers add pr-review --type event \
--connector github --event GITHUB_PULL_REQUEST_CREATED \
--config repo=hekmat/api \
--prompt "Review {{ event.data.html_url }}" --apply
beeuni triggers info pr-review
triggers events --appsmuestra las aplicaciones que pueden activar eventos. Las aplicaciones se agrupan según su origen de eventos (source: composio). Cada aplicación muestra sus conectores (perfiles) y sus cuentas compartidas. La columnaSTATEindicaconnectedoneeds account; las aplicaciones sin conector aparecen enNo connector yet.connectors addañade el conector si la aplicación no tiene ninguno. Omítelo si se ha definidoCONNECTOR.connectors connect <slug> --owner projectmuestra un enlace. Una persona lo abre para conectar la cuenta compartida. Una cuenta privada de un miembro no cuenta. Vuelve a ejecutarlo para añadir una segunda cuenta compartida y luego asígnale una etiqueta conconnectors rename <id> <label>.triggers events --connector <slug>muestra los eventos. Añade--event <TYPE>para ver la configuración de un evento y sus variables{{ event.data.* }}. Lee la descripción de cada ajuste: algunos eventos esperan el nombre completo en un solo ajuste, comorepo: hekmat/api, y rechazan el mismo valor si se divide entreowneryrepo.triggers add --applycrea el activador de inmediato y muestra su estado y el siguiente paso. Si falta un ajuste o no es válido, el comando termina con el código 2 y enumera todos los problemas. Si no se especifica--apply, la CLI escribe el bloque en elbeeuni.yamllocal; ejecutabeeuni shippara aplicarlo.triggers info <slug>muestra el estado. Repítelo hasta que indiquelive.
--source <adapter> especifica el origen de eventos y es opcional: si no se indica, el activador usa el proveedor del conector. El conector debe pertenecer a ese origen. Si se especifica un origen composio para un conector de otro proveedor, aparece error: Connector "<slug>" is a <provider> connector; source "composio" needs a composio connector. Se rechaza un origen desconocido con Unknown event source "<x>". Sources: composio. beeuni triggers set <slug> --source <adapter> lo cambia; al cambiar --connector se borra.
--config key=value se repite una vez por ajuste y se convierte al tipo del ajuste. --config-json '{"limit": 5}' pasa valores tipados. beeuni triggers set <slug> --config key=value se fusiona con la configuración activa; --config-json la reemplaza. No pases ambos. Un activador de eventos no acepta ninguno de estos: --cron, --run-at, --timezone, --secret-env, --run, --mode, --interval ni --expect-event-within.
Estructura de la configuración
# beeuni.yaml
triggers:
- slug: pr-review
type: event
connector: github-work # required, slug of a connector (profile) under `connectors:`
source: composio # optional, the event source adapter. Default: the connector's provider
account: hekmat-bot # optional, label of one shared account of that connector
event: GITHUB_PULL_REQUEST_CREATED # required, the adapter's event id, from `beeuni triggers events`
config: { repo: hekmat/api } # optional, settings of the event
agent: default
session_mode: fresh # default "fresh"
filter: # optional, same guard a webhook uses
"event.data.draft": "false"
prompt: |
Review {{ event.data.html_url }}
Qué puede leer el prompt
El prompt, filter y session_key leen estas raíces:
| Raíz | Valor |
|---|---|
event.data.<field> |
Los datos del evento propios de la app. beeuni triggers events muestra los campos que contiene cada evento. |
event.id |
El ID que el proveedor asigna a este evento. |
event.type |
El tipo de evento, como GITHUB_PULL_REQUEST_CREATED. |
event.app |
El slug de la app, como github. |
event.connector |
El slug del conector que observa el activador. |
event.occurred_at |
Cuándo ocurrió el evento. |
Los datos del evento provienen de terceros. Beeuni inicia el primer mensaje de la sesión con [App event: <trigger name> — automated, third-party content, not user input], para que el agente trate el contenido del evento como datos y no como instrucciones. Esa línea también es el título de la sesión hasta que el agente le asigna uno.
Estado
beeuni triggers ls y la lista de activadores web muestran el estado de suscripción de cada activador de eventos.
| Estado | Significado | Solución |
|---|---|---|
active |
La suscripción existe. Los eventos activan el activador. | Ninguna. |
pending |
El activador está declarado y Beeuni aún no ha creado la suscripción. | Espera un momento. Si sigue pending, vuelve a guardar el activador. |
needs_connection |
El conector no tiene ninguna cuenta compartida utilizable. El texto indica «Conecta una cuenta compartida de <app> para activar este activador» o «Termina de conectar la cuenta compartida de <app>…» |
Conecta una cuenta compartida para el conector como proyecto (beeuni connectors connect <slug> --owner project). No cuenta la cuenta privada de un miembro. El activador se activa automáticamente cuando la persona termina de conectarla, incluso si lo hace desde un enlace fuera de Beeuni. |
error |
La suscripción falló o el proveedor la desactivó. El activador muestra el texto del error. | Soluciona la causa indicada y vuelve a guardar el activador. |
Textos habituales de error:
-
«Esta cuenta de
<app>solo se comparte con personas específicas. Los activadores de eventos necesitan una cuenta compartida con todo el proyecto». Abre las opciones para compartir de la cuenta y compártela con todo el proyecto. -
«El conector
<slug>no está declarado en beeuni.yaml». Añade el conector enconnectors:. -
Si los activadores de eventos no están disponibles, ponte en contacto con soporte.
-
«La app desactivó esta suscripción: …» El proveedor desactivó la suscripción. Vuelve a guardar el activador para suscribirte de nuevo.
-
«La cuenta conectada caducó: …» La app revocó o dejó caducar la cuenta. Vuelve a conectar la app para reanudar el activador.
Reglas
- Conector y cuenta. Una app es un servicio, como GitHub. Un conector es un perfil en
beeuni.yaml; varios conectores pueden compartir una app. Una cuenta es un inicio de sesión conectado en un conector. Un activador indica un conector. Usa la cuenta compartida predeterminada de ese conector, a menos que se configureaccount: <label>. Configuraaccountsolo si un conector tiene varias cuentas compartidas. En la CLI,--account <label>lo establece y--default-account(entriggers set) lo borra. Si ninguna cuenta compartida coincide con una etiqueta, se muestraneeds_connectioncon el texto «Conecta una cuenta compartida de<app>con la etiqueta «<label>» en<connector>». - Una sola cuenta fuente. Solo una cuenta compartida con el proyecto y accesible para todo el proyecto puede alimentar un activador. Un activador se ejecuta sin nadie presente y los datos del evento llegan al prompt de una sesión. Una cuenta compartida solo con personas concretas, o una cuenta privada, nunca puede alimentarlo.
- Cada evento se activa una vez. Un activador se activa una vez por evento del proveedor. Si se vuelve a entregar un evento, no se inicia una segunda sesión. Dos activadores para el mismo evento se activan una vez cada uno.
- La pausa lo detiene. Un activador o proyecto en pausa omite los eventos. Los eventos omitidos no se ponen en cola.
- Los cambios vuelven a suscribir. Al cambiar
connector,source,account,eventoconfig, se reemplaza la suscripción. Al eliminar el activador, se elimina la suscripción.
Monitores
Experimental. Los monitores solo se ejecutan cuando está activada la marca de funcionalidad monitors. De forma predeterminada, está desactivada. Mientras esté desactivada, la plataforma no aprovisiona ninguna máquina para monitores ni activa eventos de monitor.
Un monitor observa algo que no envía webhooks ni se ajusta a un horario: un registro en tiempo real, la profundidad de una cola, una página que cambia, un precio. Beeuni ejecuta tu comando las 24 horas del día, los 7 días de la semana, en la máquina de monitor del proyecto: una microVM persistente por proyecto, con el mismo límite de aislamiento y los mismos secretos del proyecto que recibe un entorno aislado de sesión. El código determinista observa; el agente se activa solo cuando el comando emite una línea.
Cuatro reglas definen el funcionamiento:
- Las líneas de stdout son eventos. Nada más lo es. stderr contiene diagnósticos: visibles en los registros del monitor, nunca activa eventos.
- Cada línea activa el activador exactamente una vez, a través del mismo flujo que ya usa un webhook:
filter→ plantilla del prompt →session_mode. - Un monitor no puede fallar en silencio. La salida del proceso, el agotamiento del límite de reinicios y un período de silencio superior a
expect_event_withinactivan cada uno un evento del ciclo de vida escrito por la plataforma en el mismo flujo. - De forma predeterminada,
session_modeesreuseen un monitor, nofresh. Un monitor se activa repetidamente por diseño, así quefreshcrearía una sesión por evento.
Añade el monitor
beeuni triggers add checkout-errors --type monitor \
--run "./monitors/checkout-errors.ts" \
--mode poll --interval 60s --expect-event-within 24h \
--prompt "Checkout monitor emitted: {{ line }}"--mode poll vuelve a ejecutar el comando cada --interval y espera que termine. --mode stream lo ejecuta una vez y lo mantiene en ejecución; un flujo no acepta --interval. Ambas modalidades producen líneas y ningún componente posterior puede distinguirlas. En un monitor se rechazan cron, run_at, timezone y secret_env.
Publícalo
beeuni shipLa plataforma inicia la máquina de monitor cuando esto llega a la rama predeterminada.
Confirma que se ejecuta
beeuni triggers ls
beeuni triggers info checkout-errorsls muestra el modo y el intervalo de un monitor, mientras que un cron muestra su programación. info muestra run, mode, interval y expect_event_within.
Límites de los monitores
La plataforma aplica todos los límites que aparecen a continuación.
| Límite | Valor |
|---|---|
| Monitores por proyecto | 10 activados |
| Intervalo de sondeo | al menos 30 s |
expect_event_within |
al menos 5 min |
| Frecuencia de eventos por monitor | 60 por hora de forma sostenida, ráfaga de 30. Si se supera el límite, el monitor se suprime durante 10 minutos; 3 supresiones en 24 horas lo desactivan. |
| Longitud de línea | 8 KiB; se trunca con un marcador truncated: true |
| Límite de reinicios | 5 reinicios / 10 minutos; después, un evento de ciclo de vida restart_budget_exhausted y una espera de 15 minutos |
| Retención de eventos | 30 días |
| Presupuesto mensual de la máquina | $75 de forma predeterminada. Al superarlo, la máquina se detiene y se activa un evento de ciclo de vida budget_exceeded. |
La máquina de monitor necesita un proveedor compatible con un entorno aislado persistente. Si el proveedor del proyecto no puede mantenerlo, la marca monitors se indica como no disponible.
Estructura de la configuración
# beeuni.yaml
triggers:
- slug: daily-digest # required, lowercase + dashes, unique per project
name: Daily digest # optional, defaults to slug
type: cron # "cron" | "webhook" | "event" | "monitor", required
agent: beeuni # optional, defaults to "default"
model: anthropic/claude-sonnet-4-5 # optional, resolves at fire time if unset
enabled: true # optional, default true
cron: "0 0 9 * * 1-5" # 6-field expression, mutually exclusive with run_at
timezone: America/Los_Angeles # IANA name, default UTC
session_mode: reuse # "fresh" | "reuse" | "pinned" | "keyed", default "fresh"
filter: # optional, webhook payload guard
"body.data.direction": "inbound"
prompt: "Summarize {{ body.text }}" # required, template string
Un monitor sustituye los campos de programación por su comando y modalidad:
# beeuni.yaml
triggers:
- slug: checkout-errors
type: monitor
run: ./monitors/checkout-errors.ts # required, repo-relative command
mode: poll # "poll" | "stream", required
interval: 60s # required on poll, invalid on stream
expect_event_within: 24h # optional silence watchdog
agent: oncall
session_mode: reuse # the monitor default
filter: # optional, same guard a webhook uses
"line.severity": "error"
prompt: "Checkout monitor emitted: {{ line }}"
Un activador de eventos sustituye los campos de programación por la app y el evento que observa. Consulta Activadores de eventos de apps.
La configuración heredada beeuni.toml usa los mismos campos en un contenedor distinto; consulta TOML heredado.
Campos
| Campo | Obligatorio | Valor predeterminado | Notas |
|---|---|---|---|
slug |
sí | — | [a-z0-9][a-z0-9_-]{0,127}, único por proyecto. |
type |
sí | — | cron, webhook o monitor. |
prompt |
sí | — | Cadena de plantilla. Se muestra como el primer mensaje de la sesión. |
name |
no | slug |
Etiqueta descriptiva. |
agent |
no | default_agent |
Debe ser el nombre de una clave de agents:. Omítelo para usar default_agent; no escribas el literal default. |
model |
no | se resuelve al activarse | Formato de cable provider/model, por ejemplo anthropic/claude-sonnet-4-5. |
enabled |
no | true |
Si false, el programador y el receptor del webhook omiten la entrada. |
session_mode |
no | fresh o reuse en un monitor |
Consulta Estrategia de sesión. |
session_id |
obligatorio para pinned |
— | Sesión exacta a la que se volverá a enviar el mensaje. |
session_key |
obligatorio para keyed |
— | Cadena de plantilla. Si se configura por sí sola, implica session_mode: keyed. |
filter |
no | — | Ruta con puntos → cadena esperada. Si una entrega del webhook no coincide, devuelve 200 y no activa ninguna sesión. |
cron |
uno de cron/run_at, en type: cron |
— | Expresión de 6 campos: segundo, minuto, hora, día, mes y día de la semana. Se activa como máximo una vez cada 60 segundos; una expresión más frecuente produce un error en beeuni validate y en la API. |
run_at |
uno de cron/run_at, en type: cron |
— | Marca de tiempo ISO-8601. Se activa una vez y luego queda inactivo. |
timezone |
no, solo cron | UTC |
Nombre de IANA. |
secret_env |
obligatorio, solo webhook | — | Nombre de un secreto del proyecto que contiene la clave de firma. El secreto debe usar la entrega broker con el consumidor connector. |
run |
obligatorio, solo monitor | — | Comando relativo al repositorio cuyas líneas de salida estándar son los eventos. Una línea, de 1024 caracteres como máximo. |
mode |
obligatorio, solo monitor | — | poll vuelve a ejecutar run cada interval; stream lo ejecuta una vez y lo mantiene activo. |
interval |
obligatorio para mode: poll |
— | Literal de duración (30s, 5m, 24h, 7d), mínimo 30s. No válido en mode: stream. |
expect_event_within |
no, solo monitor | — | Literal de duración, mínimo 5m. Un silencio superior a este valor activa un evento del ciclo de vida. |
Un activador cron necesita cron o run_at, nunca ambos. Se rechaza un activador de webhook sin secret_env: no hay webhooks sin autenticación. Un monitor necesita run y mode, y rechaza directamente cron, run_at, timezone y secret_env: un manifiesto que declara una programación que el ejecutor del monitor nunca lee es una mentira.
Configura el secreto de firma antes de crear o actualizar un activador de webhook:
beeuni secrets set WEBHOOK_SECRET=-
beeuni secrets delivery WEBHOOK_SECRET broker --consumer connector
Pasa el valor al primer comando mediante la entrada estándar. Si el secreto se usó anteriormente para la entrega en sandbox, rótalo después de cambiar el método de entrega, ya que un sandbox existente puede conservar el valor anterior.
Estrategia de sesión
session_mode controla a qué sesión se vuelve a enviar el mensaje al activarse. Beeuni prueba los modos siguientes en orden y pasa al siguiente si falla cada paso.
pinned— volver a enviar el mensaje a lasession_idexacta. Si esa sesión ya no existe o falló, pasar al siguiente modo.keyed— procesarsession_keycon la carga útil y, luego, buscar la sesión más reciente que no haya fallado y que tenga esa clave exacta. Si la clave se procesa como vacía o no hay ninguna sesión coincidente, pasar a una sesión nueva. Nunca pasa a la sesión de otra clave.reuse— volver a enviar el mensaje a la sesión más reciente que no haya fallado y que este activador haya creado anteriormente. Un activador con sesión fijada también recurre a este modo antes de pasar al siguiente.fresh— crear un sandbox y una rama nuevos. Es el valor predeterminado y el recurso final para todos los modos. La sesión nueva pasa a ser la sesión del activador para futuras activacionesreuseykeyed.
Una sesión reuse o keyed cuyo historial ya no cabe en el modelo, ni siquiera después de la compactación automática, se retira. La siguiente activación inicia una sesión nueva. Cualquier otro error conserva la sesión para la siguiente activación.
Un activador cron frecuente que no deba volver a enviar un historial que crece sin parar puede renovar la sesión al cambiar el período del calendario: session_key: "merge-{{ cron.scheduled_date }}" mantiene una sesión serializada por día UTC y {{ cron.scheduled_hour }}, una por hora UTC.
Ejecuciones fallidas
Cuando una ejecución iniciada por un activador termina con un error, Beeuni lo registra en el activador:
last_statuspasa a serfailedylast_errorcontiene el motivo, por ejemploOut of credits: Payment Required: Insufficient credits.- La página Programación marca el activador como «La última ejecución no terminó» y muestra el motivo en su panel.
- El propietario de la cuenta recibe una notificación push móvil cuando falla la primera ejecución. Si falla una ejecución posterior, se actualiza el motivo sin enviar otra notificación push.
- El activador sigue
failedmientras continúa activándose. Una nueva activación no demuestra que la ejecución funcione.
El siguiente intento que finalice borra el error. Una ejecución que detienes tú, un subagente y una llamada al modelo reintentada no cuentan como resultados de ejecución. Un error que se produce antes de que empiece una ejecución, por ejemplo, cuando no se puede crear una sesión, se borra con la siguiente activación que tenga éxito.
Acceso a las sesiones
Las sesiones que crea un activador usan la política privada de forma predeterminada. Pertenecen a la cuenta de servicio del agente del activador: la identidad de un agente es un principal service_account, por lo que puede ser propietaria de una sesión y tener asignaciones como cualquier otro principal. Un administrador del proyecto siempre puede abrirlas. El propietario y el administrador de una cuenta tienen acceso equivalente al de un administrador en todos los proyectos, así que lo mismo se aplica a ellos. La persona que configuró o activó manualmente el activador no obtiene acceso por esa acción, a menos que tenga uno de esos roles.
La configuración de los activadores ofrece tres políticas:
- Agente del activador y administradores del proyecto — ningún miembro ordinario del proyecto puede abrir la sesión.
- Compañeros seleccionados — el agente del activador, los administradores del proyecto y los miembros del proyecto o grupos de cuentas seleccionados.
- Todo el proyecto — todos los miembros del proyecto.
Esta política es una opción de visibilidad por recurso que se superpone al modelo de roles; no es un rol. Decide quién puede abrir las sesiones de un activador. No concede ningún permiso que deniegue el resultado de los roles. Consulta Cuentas y acceso.
La política de acceso es un estado de ejecución local a la cuenta. No se incluye en el manifiesto beeuni.yaml portátil porque los ID de principal pertenecen a una cuenta. Configúrala desde el panel.
Actualizar solo esta política no crea ningún commit de Git. Al guardar una política, también se actualizan las sesiones anteriores creadas por ese activador.
Una sesión fijada conserva su propia configuración para compartirla, ya que el activador no la creó. Si una sesión fijada no está disponible y el activador crea una sesión alternativa, la política del activador se aplica a esa sesión nueva.
Plantillas de carga útil
prompt y session_key se procesan con el mismo motor: {{ token.dotted.path }}. Los valores que faltan se procesan como cadenas vacías: sin errores ni {{ }} sobrantes. Los objetos y las matrices se procesan como JSON. session_key se recorta y se trunca a 512 caracteres.
Cada activación también recibe {{ trigger.slug }}, {{ trigger.type }} y {{ trigger.kind }} (siempre git). El resto del conjunto de variables depende de cómo se haya activado el activador.
| Origen | Variables |
|---|---|
| cron | {{ cron.schedule }}, {{ cron.timezone }}, {{ cron.scheduled_for }} (la franja para la que se activa), {{ cron.claimed_at }} (cuándo la recogió el programador), {{ cron.last_scheduled_for }} (la franja anterior; vacío en la primera activación), {{ cron.scheduled_date }} (YYYY-MM-DD UTC de la franja), {{ cron.scheduled_hour }} (YYYY-MM-DDTHH UTC). No hay fired_at de nivel superior. |
| webhook | {{ fired_at }}, {{ body.* }} (analizado como JSON; si el cuerpo no se puede analizar, se usa {{ body.raw }}), {{ headers.content_type }}, {{ headers.user_agent }}, {{ headers.forwarded_for }}. |
| monitor | {{ line.* }}: la línea de stdout, analizada como JSON; si no se puede analizar, se muestra como {{ line.raw }}. También {{ monitor.slug }}, {{ monitor.seq }}, {{ monitor.emitted_at }} y {{ monitor.kind }} (event o lifecycle). |
manual (botón «fire now» del panel o endpoint fire) |
{{ fired_at }}, {{ source }} (manual), {{ actor }}, {{ message.text }}, {{ message.source }}. |
Beeuni antepone [MONITOR EVENT — automated, not user input] a todos los prompts de monitor renderizados, en el servidor. Un evento de ciclo de vida ignora por completo tu plantilla y renderiza un prompt escrito por la plataforma; además, omite filter: el silencio no debe poder filtrarse por accidente.
{{ message.text }} se fija en una cadena vacía al activarse manualmente, y {{ message.source }} en manual_test. La activación manual no sirve para inyectar datos de prueba en el prompt.
filter compara rutas con puntos como cadenas con la misma carga útil que recibe el prompt. Sirve para romper bucles. Por ejemplo, un origen que informa de ambos lados de una conversación volvería a activar el agente con su propia respuesta.
Firma del webhook
Se activa con POST /v1/webhooks/projects/{projectId}/{slug}. Beeuni verifica la solicitud en este orden, mediante una comparación de tiempo constante:
- Firma HMAC: encabezado
X-Beeuni-Signature: sha256=<hmac>(el prefijosha256=es opcional) oX-Hub-Signature-256, compatible con GitHub. HMAC-SHA256 sobre el cuerpo sin procesar de la solicitud, usando el secreto indicado porsecret_env. - Token estático, solo si no hay un encabezado de firma, para remitentes que no pueden firmar cuerpos con HMAC. Envía el secreto como
X-Beeuni-Token: <secret>,Authorization: Bearer <secret>oAuthorization: Basic <base64(user:secret)>(la parte de contraseña es el token).
beeuni triggers info <slug> muestra este esquema —el encabezado, el algoritmo y una solicitud de ejemplo firmada con el marcador de posición $SECRET— y --json lo incluye como webhook_signing. La hoja del activador del panel muestra la misma solicitud de ejemplo.
| Estado | Significado |
|---|---|
| 202 | La firma o el token son válidos. El cuerpo es { status: "fired" | "queued" | "deduped", session_id, ... }. |
| 200 | Válida, pero omitida: el proyecto está pausado o la entrega no coincide con filter. |
| 400 | El ID o el slug del proyecto en la URL tienen un formato incorrecto. |
| 401 | Faltan tanto la firma como el token, o son incorrectos. |
| 404 | No se encuentra el activador, está deshabilitado, no es un webhook o el proyecto no está activo. |
| 409 | Falta el secreto de firma, está inactivo o no disponible, o no autoriza al consumidor connector. La respuesta incluye un código webhook_secret_* y cómo resolverlo. |
| 500 | La autenticación se completó, pero no se pudo activar la sesión. |
Endpoints
| Método + ruta | Requisitos | Notas |
|---|---|---|
GET /v1/projects/{projectId}/triggers |
project.trigger.read |
Enumera los activadores, el estado de ejecución (last_fired_at, last_status, last_error, last_attempt_at) y los errores de análisis del manifiesto. Una entrada incorrecta aparece en errors[]; no afecta a los demás activadores. |
POST /v1/projects/{projectId}/triggers |
project.trigger.create |
Crea un activador. Lo confirma directamente en el manifiesto. |
PATCH /v1/projects/{projectId}/triggers/{slug} |
project.trigger.update |
Actualización parcial que se combina con la entrada actual. |
DELETE /v1/projects/{projectId}/triggers/{slug} |
project.trigger.delete |
También borra el estado de ejecución del activador. |
PATCH /v1/projects/{projectId}/triggers/activation |
project.trigger.update |
Cuerpo { paused: boolean }. Consulta Pausar y reanudar. |
POST /v1/projects/{projectId}/triggers/{slug}/fire |
project.trigger.fire |
Activación manual. El rol integrado member del proyecto tiene project.trigger.fire, por lo que un miembro normal puede activar un disparador. |
POST /v1/webhooks/projects/{projectId}/{slug} |
firma o token | URL pública protegida por el secreto del webhook. |
Pausar y reanudar
Un interruptor a nivel de proyecto detiene todos sus activadores a la vez, independientemente del campo enabled de cada uno. Mientras el proyecto está pausado, el programador lo omite y los webhooks entrantes devuelven 200 con { status: "skipped" }: no se activa ninguna sesión. La activación manual sigue funcionando. Úsalo cuando el mismo repositorio se ejecute en dos planos de control (por ejemplo, desarrollo y producción) para evitar que cron se active dos veces. CLI: beeuni triggers pause y beeuni triggers resume. Consulta CLI para ver el grupo completo de comandos beeuni triggers.
Límites y fiabilidad
- El programador consulta aproximadamente cada segundo (1.000 ms de forma predeterminada; configurable mediante
BEEUNI_TRIGGER_SCHEDULER_INTERVAL_MS). Una ejecución de cron no empieza exactamente en su franja: cada activador recibe un desfase fijo de hasta una cuarta parte de su período, con un máximo de 30 minutos, para que muchos activadores programados para el mismo minuto no empiecen a la vez. El detalle del activador yGET /triggers(next_fire_at) muestran cuándo empieza la siguiente ejecución. - Si una activación falla, el último estado del activador pasa a ser fallido y se muestra el error. Esto se aplica a todos los orígenes: cron, manual, webhook, evento de aplicación y monitor. La siguiente activación que se complete correctamente borra el estado de fallo. Una ejecución fallida se borra según se describe en Ejecuciones fallidas.
- Cada proyecto permite aprovisionar 3 sesiones activadas a la vez de forma predeterminada. Si se supera ese límite, la activación devuelve
queued(202) en lugar de fallar y se ejecuta cuando termine el aprovisionamiento de una de ellas. No hay límite en el número de sesiones que pueden ejecutarse a la vez. - Las activaciones manuales y de webhook tienen un tiempo de espera de 45 segundos. La carga del manifiesto tiene un tiempo de espera de 30 segundos.
- Las activaciones de cron se identifican por la franja programada correspondiente; así, si una activación agota el tiempo de espera pero se ejecuta, no se duplica al reintentarse.
- Cada entrega de webhook se ejecuta una vez por evento. Beeuni lee el ID del evento de
X-Beeuni-Delivery-Id,X-GitHub-Delivery,X-Gitlab-Event-UUID,Linear-Delivery,webhook-idosvix-id, en ese orden. Un reintento con el mismo ID devuelve202 { status: "deduped" }y no ejecuta nada.X-Request-Idno es un ID de evento. Si no hay ID de evento, un cuerpo y una firma idénticos en un intervalo de 10 minutos se consideran el mismo evento; pasado ese plazo, se vuelve a ejecutar. Por tanto, un trabajo que envía el mismo cuerpo estático en cada implementación se ejecuta en cada una. EnvíaX-Beeuni-Delivery-Idcon un valor nuevo por evento (la solicitud de ejemplo usa$(uuidgen)). - Una entrega cuyo intento anterior falló definitivamente (por ejemplo, porque la cuenta se quedó sin créditos) o cuya sesión se eliminó vuelve a ejecutarse si se reenvía con el mismo ID. Un duplicado no modifica
last_fired_at.