feat: include latest build id in task responses (#20181)

Adding the latest build ID is necessary to locate the logs associated
with the tasks in the UI.
This commit is contained in:
Bruno Quaresma
2025-10-06 13:12:56 -03:00
committed by GitHub
parent 1783ee13ab
commit 23a44d10ac
6 changed files with 7 additions and 0 deletions
+1
View File
@@ -193,6 +193,7 @@ STATE CHANGED STATUS HEALTHY STATE MESSAGE
"workspace_agent_id": null,
"workspace_agent_lifecycle": null,
"workspace_agent_health": null,
"latest_build_id": null,
"initial_prompt": "",
"status": "running",
"current_state": {
+1
View File
@@ -272,6 +272,7 @@ func taskFromWorkspace(ws codersdk.Workspace, initialPrompt string) codersdk.Tas
WorkspaceAgentID: taskAgentID,
WorkspaceAgentLifecycle: taskAgentLifecycle,
WorkspaceAgentHealth: taskAgentHealth,
LatestBuildID: uuid.NullUUID{Valid: true, UUID: ws.LatestBuild.ID},
CreatedAt: ws.CreatedAt,
UpdatedAt: ws.UpdatedAt,
InitialPrompt: initialPrompt,
+2
View File
@@ -270,6 +270,7 @@ func TestTasks(t *testing.T) {
assert.Equal(t, wantPrompt, got.InitialPrompt, "task prompt should match the AI Prompt parameter")
assert.Equal(t, workspace.Name, got.Name, "task name should map from workspace name")
assert.Equal(t, workspace.ID, got.WorkspaceID.UUID, "workspace id should match")
assert.Equal(t, workspace.LatestBuild.ID, got.LatestBuildID.UUID, "latest build id should match")
// Status should be populated via app status or workspace status mapping.
assert.NotEmpty(t, got.Status, "task status should not be empty")
})
@@ -320,6 +321,7 @@ func TestTasks(t *testing.T) {
assert.Equal(t, workspace.Name, task.Name, "task name should map from workspace name")
assert.Equal(t, wantPrompt, task.InitialPrompt, "task prompt should match the AI Prompt parameter")
assert.Equal(t, workspace.ID, task.WorkspaceID.UUID, "workspace id should match")
assert.Equal(t, workspace.LatestBuild.ID, task.LatestBuildID.UUID, "latest build id should match")
assert.NotEmpty(t, task.Status, "task status should not be empty")
// Stop the workspace
+1
View File
@@ -119,6 +119,7 @@ type Task struct {
WorkspaceAgentID uuid.NullUUID `json:"workspace_agent_id" format:"uuid" table:"workspace agent id"`
WorkspaceAgentLifecycle *WorkspaceAgentLifecycle `json:"workspace_agent_lifecycle" table:"workspace agent lifecycle"`
WorkspaceAgentHealth *WorkspaceAgentHealth `json:"workspace_agent_health" table:"workspace agent health"`
LatestBuildID uuid.NullUUID `json:"latest_build_id" format:"uuid" table:"latest build id"`
InitialPrompt string `json:"initial_prompt" table:"initial prompt"`
Status WorkspaceStatus `json:"status" enums:"pending,starting,running,stopping,stopped,failed,canceling,canceled,deleting,deleted" table:"status"`
CurrentState *TaskStateEntry `json:"current_state" table:"cs,recursive_inline"`
+1
View File
@@ -3330,6 +3330,7 @@ export interface Task {
readonly workspace_agent_id: string | null;
readonly workspace_agent_lifecycle: WorkspaceAgentLifecycle | null;
readonly workspace_agent_health: WorkspaceAgentHealth | null;
readonly latest_build_id: string | null;
readonly initial_prompt: string;
readonly status: WorkspaceStatus;
readonly current_state: TaskStateEntry | null;
+1
View File
@@ -5031,6 +5031,7 @@ export const MockTask: TypesGen.Task = {
workspace_agent_id: MockWorkspaceAgent.id,
workspace_agent_lifecycle: MockWorkspaceAgent.lifecycle_state,
workspace_agent_health: MockWorkspaceAgent.health,
latest_build_id: MockWorkspace.latest_build.id,
initial_prompt: "Perform some task",
status: "running",
current_state: {