Portal Community

Channel Architecture

All messaging nodes share the IMessagingChannelAdapter pattern. Each channel (Slack, Email, SMS, Push) is a separate adapter implementation registered in DI. This makes adding new channels a first-class operation:


WorkflowNode (SendSlack / SendEmail / SendSMS / SendPush)
    │
    ▼
IMessagingChannelAdapter.SendAsync(message, config)
    │
    ├── SlackChannelAdapter    → Slack API (block kit)
    ├── EmailChannelAdapter    → SMTP / SendGrid
    ├── SMSChannelAdapter      → Twilio / Vonage
    └── PushChannelAdapter     → FCM / APNs
  

Available Messaging Nodes

Node TypeChannelAuth Pattern
SendSlackMessageSlack APIBot token via ICredentialResolver
SendEmailSMTP or SendGridSMTP password / API key via ICredentialResolver
SendSMSTwilioAccount SID + auth token via ICredentialResolver
SendPushNotificationFCM / APNsService account key via ICredentialResolver

Universal Credential Rule

Mandatory: All messaging credentials (API keys, SMTP passwords, bot tokens, account SIDs) are always stored via ICredentialResolver using a credentialId integer. Raw secrets are never stored in node configuration. Violation of this rule is a critical security defect.

Output Shape (All Messaging Nodes)

{
  "messageId": "msg-xyz123",
  "channel": "slack",
  "sentAt": "2026-05-25T10:00:00Z",
  "status": "delivered",
  "recipient": "#engineering-alerts"
}