agent-orchestrator/backend/internal/notify/enrich.go

91 lines
2.6 KiB
Go

package notify
import (
"fmt"
"strings"
"github.com/aoagents/agent-orchestrator/backend/internal/domain"
)
func enrich(intent Intent) (domain.NotificationRecord, error) {
rec := domain.NotificationRecord{
SessionID: intent.SessionID,
ProjectID: intent.ProjectID,
PRURL: strings.TrimSpace(intent.PRURL),
Type: intent.Type,
Status: domain.NotificationUnread,
CreatedAt: intent.CreatedAt,
}
if !intent.Type.Valid() {
return domain.NotificationRecord{}, domain.ErrInvalidNotificationType
}
if intent.Type != domain.NotificationNeedsInput && rec.PRURL == "" {
return domain.NotificationRecord{}, domain.ErrInvalidNotificationRecord
}
rec.Title = titleForIntent(intent)
rec.Body = bodyForIntent(intent)
if err := rec.Validate(); err != nil {
return domain.NotificationRecord{}, err
}
return rec, nil
}
func titleForIntent(intent Intent) string {
switch intent.Type {
case domain.NotificationNeedsInput:
return fmt.Sprintf("%s needs input", sessionLabel(intent))
case domain.NotificationReadyToMerge:
return fmt.Sprintf("%s is ready to merge", prLabel(intent))
case domain.NotificationPRMerged:
return fmt.Sprintf("%s was merged", prLabel(intent))
case domain.NotificationPRClosedUnmerged:
return fmt.Sprintf("%s was closed without merging", prLabel(intent))
default:
return "Notification"
}
}
func bodyForIntent(intent Intent) string {
switch intent.Type {
case domain.NotificationNeedsInput:
return "The agent is waiting for your response."
case domain.NotificationReadyToMerge:
if s := sessionLabel(intent); s != "session" {
return fmt.Sprintf("%s has no known blocking CI or review feedback.", s)
}
return "The pull request has no known blocking CI or review feedback."
case domain.NotificationPRMerged:
if title := strings.TrimSpace(intent.PRTitle); title != "" {
return fmt.Sprintf("%s was merged.", title)
}
return "The pull request was merged."
case domain.NotificationPRClosedUnmerged:
if title := strings.TrimSpace(intent.PRTitle); title != "" {
return fmt.Sprintf("%s was closed without merging.", title)
}
return "The pull request was closed without merging."
default:
return ""
}
}
func sessionLabel(intent Intent) string {
if v := strings.TrimSpace(intent.SessionDisplayName); v != "" {
return v
}
if intent.SessionID != "" {
return string(intent.SessionID)
}
return "session"
}
func prLabel(intent Intent) string {
if intent.PRNumber > 0 {
return fmt.Sprintf("PR #%d", intent.PRNumber)
}
if title := strings.TrimSpace(intent.PRTitle); title != "" {
return "PR " + title
}
return "PR"
}