feat(coderd): notify on task completion/failure (#20327)

Adds notifications on task transitions to completed or failure state.

Authored by Claude, I reviewed it and it appears to be legit.
This commit is contained in:
Cian Johnston
2025-10-16 10:21:08 +01:00
committed by GitHub
parent 3fa438f80e
commit 0faee8e913
10 changed files with 397 additions and 2 deletions
+58
View File
@@ -1061,6 +1061,64 @@ func TestTasksNotification(t *testing.T) {
notificationTemplate: notifications.TemplateTaskIdle,
taskPrompt: "This is a very long task prompt that should be truncated to 160 characters. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
},
// Should send TemplateTaskCompleted when the AI task transitions to 'Complete'.
{
name: "TemplateTaskCompleted",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateWorking},
newAppStatus: codersdk.WorkspaceAppStatusStateComplete,
isAITask: true,
isNotificationSent: true,
notificationTemplate: notifications.TemplateTaskCompleted,
taskPrompt: "TemplateTaskCompleted",
},
// Should send TemplateTaskFailed when the AI task transitions to 'Failure'.
{
name: "TemplateTaskFailed",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateWorking},
newAppStatus: codersdk.WorkspaceAppStatusStateFailure,
isAITask: true,
isNotificationSent: true,
notificationTemplate: notifications.TemplateTaskFailed,
taskPrompt: "TemplateTaskFailed",
},
// Should send TemplateTaskCompleted when the AI task transitions from 'Idle' to 'Complete'.
{
name: "TemplateTaskCompletedFromIdle",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateIdle},
newAppStatus: codersdk.WorkspaceAppStatusStateComplete,
isAITask: true,
isNotificationSent: true,
notificationTemplate: notifications.TemplateTaskCompleted,
taskPrompt: "TemplateTaskCompletedFromIdle",
},
// Should send TemplateTaskFailed when the AI task transitions from 'Idle' to 'Failure'.
{
name: "TemplateTaskFailedFromIdle",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateIdle},
newAppStatus: codersdk.WorkspaceAppStatusStateFailure,
isAITask: true,
isNotificationSent: true,
notificationTemplate: notifications.TemplateTaskFailed,
taskPrompt: "TemplateTaskFailedFromIdle",
},
// Should NOT send notification when transitioning from 'Complete' to 'Complete' (no change).
{
name: "NoNotificationCompleteToComplete",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateComplete},
newAppStatus: codersdk.WorkspaceAppStatusStateComplete,
isAITask: true,
isNotificationSent: false,
taskPrompt: "NoNotificationCompleteToComplete",
},
// Should NOT send notification when transitioning from 'Failure' to 'Failure' (no change).
{
name: "NoNotificationFailureToFailure",
latestAppStatuses: []codersdk.WorkspaceAppStatusState{codersdk.WorkspaceAppStatusStateFailure},
newAppStatus: codersdk.WorkspaceAppStatusStateFailure,
isAITask: true,
isNotificationSent: false,
taskPrompt: "NoNotificationFailureToFailure",
},
} {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()