import type { NotifyBackend, NotifyUrgency } from "./backends.js"; export type { NotifyUrgency } from "./backends.js"; export { createBackends } from "./backends.js"; export interface NotificationService { notify(title: string, body: string, urgency: NotifyUrgency): Promise; agentIdle(branchName: string): Promise; agentError(branchName: string, error: string): Promise; ciPassed(branchName: string, prNumber: number): Promise; ciFailed(branchName: string, prNumber: number): Promise; prApproved(branchName: string, prNumber: number, reviewer: string): Promise; changesRequested(branchName: string, prNumber: number, reviewer: string): Promise; prMerged(branchName: string, prNumber: number): Promise; handoffCreated(branchName: string): Promise; } export function createNotificationService(backends: NotifyBackend[]): NotificationService { async function notify(title: string, body: string, urgency: NotifyUrgency): Promise { for (const backend of backends) { const sent = await backend.send(title, body, urgency); if (sent) { return; } } } return { notify, async agentIdle(branchName: string): Promise { await notify("Agent Idle", `Agent finished on ${branchName}`, "normal"); }, async agentError(branchName: string, error: string): Promise { await notify("Agent Error", `Agent error on ${branchName}: ${error}`, "high"); }, async ciPassed(branchName: string, prNumber: number): Promise { await notify("CI Passed", `CI passed on ${branchName} (PR #${prNumber})`, "low"); }, async ciFailed(branchName: string, prNumber: number): Promise { await notify("CI Failed", `CI failed on ${branchName} (PR #${prNumber})`, "high"); }, async prApproved(branchName: string, prNumber: number, reviewer: string): Promise { await notify("PR Approved", `PR #${prNumber} on ${branchName} approved by ${reviewer}`, "normal"); }, async changesRequested(branchName: string, prNumber: number, reviewer: string): Promise { await notify( "Changes Requested", `Changes requested on PR #${prNumber} (${branchName}) by ${reviewer}`, "high", ); }, async prMerged(branchName: string, prNumber: number): Promise { await notify("PR Merged", `PR #${prNumber} on ${branchName} merged`, "normal"); }, async handoffCreated(branchName: string): Promise { await notify("Handoff Created", `New handoff on ${branchName}`, "low"); }, }; }