/** * Webhook Configuration Types */ import type { EventType } from "../events/event-types.js"; export interface WebhookConfig { id: string; name: string; url: string; enabled: boolean; events: (EventType | "*")[]; format: "generic" | "slack" | "discord" | "teams"; secret?: string; headers?: Record; retryCount?: number; retryDelayMs?: number; timeoutMs?: number; createdAt: string; updatedAt: string; } export interface WebhookDelivery { id: string; /** Monotonic sequence number for ordering/replay across restarts */ sequence: number; webhookId: string; eventType: EventType; timestamp: string; success: boolean; statusCode?: number; error?: string; /** Classifies network-level failures: timeout = AbortController fired; dns_or_connect = permanent unreachable; network = other */ errorKind?: "timeout" | "dns_or_connect" | "network"; attempts: number; durationMs: number; } export interface WebhookStats { totalDeliveries: number; successCount: number; failureCount: number; lastDelivery?: string; lastSuccess?: string; lastFailure?: string; } export interface AddWebhookInput { name: string; url: string; events?: (EventType | "*")[]; format?: "generic" | "slack" | "discord" | "teams"; secret?: string; headers?: Record; } export interface UpdateWebhookInput { id: string; name?: string; url?: string; enabled?: boolean; events?: (EventType | "*")[]; format?: "generic" | "slack" | "discord" | "teams"; secret?: string; headers?: Record; }