Goal
Deliver HITL requests to a Discord channel via webhook + interactive buttons, mirroring the Slack/Telegram flows.
Background
Channel adapter interface: src/server/services/channels/types.ts. Reference impl: telegram.ts. Discord's webhook API is the simplest send path; for interactive buttons you need a bot user and interaction endpoints with ed25519 signature verification.
Scope
src/server/services/channels/discord.ts — send via webhook, format proposal as an embed with two button components.
src/server/routes/channels.ts — POST /api/v1/channels/discord/interactions with ed25519 verification (Discord sends X-Signature-Ed25519 + X-Signature-Timestamp). Route the button press to resolveHitlRequest.
- Credential storage: encrypted JSON with
{webhookUrl, publicKey, botToken?} in notification_channels.credential_ciphertext.
- UI:
SlackChannelPanel.tsx equivalent for Discord (paste webhook, paste public key, enroll + test).
Acceptance criteria
Goal
Deliver HITL requests to a Discord channel via webhook + interactive buttons, mirroring the Slack/Telegram flows.
Background
Channel adapter interface:
src/server/services/channels/types.ts. Reference impl:telegram.ts. Discord's webhook API is the simplest send path; for interactive buttons you need a bot user and interaction endpoints with ed25519 signature verification.Scope
src/server/services/channels/discord.ts— send via webhook, format proposal as an embed with two button components.src/server/routes/channels.ts— POST/api/v1/channels/discord/interactionswith ed25519 verification (Discord sendsX-Signature-Ed25519+X-Signature-Timestamp). Route the button press toresolveHitlRequest.{webhookUrl, publicKey, botToken?}innotification_channels.credential_ciphertext.SlackChannelPanel.tsxequivalent for Discord (paste webhook, paste public key, enroll + test).Acceptance criteria