.agents/features/triggers.md
Manages the full lifecycle of flow triggers — registration, event capture, testing, and deduplication. A trigger defines how and when a flow starts: via polling, inbound webhooks, app-native webhooks routed through a shared event bus, or manual invocation. The module tracks each enabled trigger as a TriggerSource record, maintains deduplication state in Redis, and drives enable/disable side effects such as BullMQ job scheduling and external webhook registration.
packages/server/api/src/app/trigger/trigger-source/flow-trigger-side-effect.ts — enable/disable side effects per strategypackages/server/api/src/app/trigger/trigger-source/trigger-source-service.ts — TriggerSource CRUDpackages/server/api/src/app/trigger/trigger-source/trigger-source-entity.ts — TriggerSource entitypackages/server/api/src/app/trigger/trigger-source/trigger-utils.ts — helper utilitiespackages/server/api/src/app/trigger/trigger-events/trigger-event.service.ts — TriggerEvent storage and retrievalpackages/server/api/src/app/trigger/trigger-events/trigger-event-controller.ts — TriggerEvent endpointspackages/server/api/src/app/trigger/trigger-events/trigger-event.entity.ts — TriggerEvent entitypackages/server/api/src/app/trigger/test-trigger/test-trigger-service.ts — simulation and test-function modespackages/server/api/src/app/trigger/test-trigger/test-trigger-controller.ts — test trigger endpointspackages/server/api/src/app/trigger/dedupe-service.ts — Redis-based deduplication for pollingpackages/server/api/src/app/trigger/app-event-routing/app-event-routing.service.ts — APP_WEBHOOK routing tablepackages/server/api/src/app/trigger/app-event-routing/app-event-routing.entity.ts — AppEventRouting entitypackages/server/api/src/app/trigger/trigger-run/trigger-run-stats.ts — per-platform trigger health trackingpackages/server/api/src/app/trigger/trigger-run/trigger-run.controller.ts — trigger run stats endpointspackages/server/api/src/app/trigger/trigger.module.ts — module registrationpackages/shared/src/lib/automation/trigger/index.ts — TriggerSource schema, TriggerStrategy enum, WebhookHandshakeConfiguration, ScheduleOptionspackages/web/src/app/builder/test-step/test-trigger-section/index.tsx — test panel in the builder sidebarpackages/web/src/app/builder/test-step/test-trigger-section/first-time-testing-section.tsx — initial test prompt before any event is capturedpackages/web/src/app/builder/test-step/test-trigger-section/simulation-section.tsx — simulation status UIpackages/web/src/app/builder/test-step/test-trigger-section/trigger-event-select.tsx — event selector from previously captured eventspackages/web/src/app/builder/test-step/test-trigger-section/manual-webhook-test-button.tsx — button to send a test HTTP request to the webhook endpointpackages/web/src/app/builder/test-step/custom-test-step/test-webhook-dialog.tsx — dialog for manually testing webhook triggerspackages/web/src/app/builder/flow-canvas/nodes/step-node/trigger-widget.tsx — trigger node widget on the flow canvaspackages/web/src/app/builder/flow-canvas/widgets/above-trigger-button.tsx — "+ Add trigger" button above the trigger nodePOLLING, WEBHOOK, APP_WEBHOOK, MANUALsimulate=true is a test-mode source; production and test sources coexist independently__DEDUPE_KEY_PROPERTY prevents duplicate payloads from polling triggerspieceName@version:triggerName; used as a stable identifier for TriggerEventsTriggerSource: id, flowId, flowVersionId, projectId, type (TriggerStrategy), pieceName, pieceVersion, triggerName, simulate (boolean — true for test triggers), schedule (JSONB for polling cron). Unique on (projectId, flowId, simulate) with soft delete filter.
TriggerEvent: id, flowId, projectId, sourceName (format: pieceName@version:triggerName), fileId (FK to File storing serialized payload).
AppEventRouting: id, appName, event, identifierValue (org/account ID), flowId, projectId. Unique on (appName, projectId, flowId, identifierValue, event).
On enable (flowTriggerSideEffect.enable()):
AP_TRIGGER_DEFAULT_POLL_INTERVAL)On disable (flowTriggerSideEffect.disable()):
dedupeService)For polling triggers — prevents duplicate payloads:
__DEDUPE_KEY_PROPERTY from each payloadTwo modes via testTriggerService:
triggerRunStats tracks per-platform success/failure rates:
trigger_run:{platformId}:{pieceName}:{date}:{status}