Goal
Ship HITL (human-in-the-loop) requests to a Slack channel or DM the same way we ship them to Telegram today. Inline approve/decline buttons via Slack Block Kit.
Background
Notification channels are abstracted behind NotificationChannelAdapter (src/server/services/channels/types.ts). Telegram is the only implementation today. Each channel has:
- An adapter (send, isConfigured, optional webhook handler)
- Credential storage in
notification_channels.credential_ciphertext (encrypted per-channel)
- A UI panel in Settings that enrolls + tests the channel
Where to start
- Read
src/server/services/channels/telegram.ts and telegram-credentials.ts as your reference.
- Create
src/server/services/channels/slack.ts with:
slackAdapter implementing NotificationChannelAdapter — formats the HITL proposal into Slack Block Kit with Approve / Decline buttons
- Uses Slack's Incoming Webhooks for sending, or the Web API if a bot token is configured
- Webhook handler for interactive components (button presses) — POST to
/api/v1/channels/slack/webhook with Slack signing-secret verification.
- Register
"slack" in NotificationChannelKind (src/server/services/channels/types.ts) and the adapter registry (registry.ts).
- UI: build
src/web/components/settings/SlackChannelPanel.tsx modeled on TelegramChannelPanel.tsx.
Acceptance criteria
Goal
Ship HITL (human-in-the-loop) requests to a Slack channel or DM the same way we ship them to Telegram today. Inline approve/decline buttons via Slack Block Kit.
Background
Notification channels are abstracted behind
NotificationChannelAdapter(src/server/services/channels/types.ts). Telegram is the only implementation today. Each channel has:notification_channels.credential_ciphertext(encrypted per-channel)Where to start
src/server/services/channels/telegram.tsandtelegram-credentials.tsas your reference.src/server/services/channels/slack.tswith:slackAdapterimplementingNotificationChannelAdapter— formats the HITL proposal into Slack Block Kit with Approve / Decline buttons/api/v1/channels/slack/webhookwith Slack signing-secret verification."slack"inNotificationChannelKind(src/server/services/channels/types.ts) and the adapter registry (registry.ts).src/web/components/settings/SlackChannelPanel.tsxmodeled onTelegramChannelPanel.tsx.Acceptance criteria