From 3ed9034ff82f5e5feb23c2ee41509735091aba5e Mon Sep 17 00:00:00 2001 From: "Babak K. Shandiz" Date: Thu, 18 Sep 2025 15:04:06 +0100 Subject: [PATCH] fix(agent-task/capi): add `Error` field to `Session` Signed-off-by: Babak K. Shandiz --- pkg/cmd/agent-task/capi/sessions.go | 19 +++- pkg/cmd/agent-task/capi/sessions_test.go | 112 +++++++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/pkg/cmd/agent-task/capi/sessions.go b/pkg/cmd/agent-task/capi/sessions.go index b379f6543..f0af72985 100644 --- a/pkg/cmd/agent-task/capi/sessions.go +++ b/pkg/cmd/agent-task/capi/sessions.go @@ -43,6 +43,10 @@ type session struct { EventURL string `json:"event_url"` EventType string `json:"event_type"` PremiumRequests float64 `json:"premium_requests"` + Error *struct { + Code string `json:"code"` + Message string `json:"message"` + } `json:"error,omitempty"` } // A shim of a full pull request because looking up by node ID @@ -83,11 +87,17 @@ type Session struct { EventURL string EventType string PremiumRequests float64 + Error *SessionError PullRequest *api.PullRequest User *api.GitHubUser } +type SessionError struct { + Code string + Message string +} + // ListLatestSessionsForViewer lists all agent sessions for the // authenticated user up to limit. func (c *CAPIClient) ListLatestSessionsForViewer(ctx context.Context, limit int) ([]*Session, error) { @@ -442,7 +452,7 @@ func generateUserNodeID(userID int64) string { } func fromAPISession(s session) *Session { - return &Session{ + result := Session{ ID: s.ID, Name: s.Name, UserID: s.UserID, @@ -460,4 +470,11 @@ func fromAPISession(s session) *Session { EventType: s.EventType, PremiumRequests: s.PremiumRequests, } + if s.Error != nil { + result.Error = &SessionError{ + Code: s.Error.Code, + Message: s.Error.Message, + } + } + return &result } diff --git a/pkg/cmd/agent-task/capi/sessions_test.go b/pkg/cmd/agent-task/capi/sessions_test.go index b91a8b401..8040cb413 100644 --- a/pkg/cmd/agent-task/capi/sessions_test.go +++ b/pkg/cmd/agent-task/capi/sessions_test.go @@ -875,6 +875,118 @@ func TestListLatestSessionsForViewer(t *testing.T) { }, }, }, + { + name: "session error is included", + limit: 10, + httpStubs: func(t *testing.T, reg *httpmock.Registry) { + reg.Register( + httpmock.WithHost( + httpmock.QueryMatcher("GET", "agents/sessions", url.Values{ + "page_number": {"1"}, + "page_size": {"50"}, + "sort": {"last_updated_at,desc"}, + }), + "api.githubcopilot.com", + ), + httpmock.StringResponse(heredoc.Docf(` + { + "sessions": [ + { + "id": "sessA", + "name": "Build artifacts", + "user_id": 1, + "agent_id": 2, + "logs": "", + "state": "failed", + "owner_id": 10, + "repo_id": 1000, + "resource_type": "pull", + "resource_id": 3000, + "created_at": "%[1]s", + "error": { + "code": "some-error-code", + "message": "some-error-message" + } + } + ] + }`, + sampleDateString, + )), + ) + + // GraphQL hydration + reg.Register( + httpmock.GraphQL(`query FetchPRsAndUsersForAgentTaskSessions\b`), + httpmock.GraphQLQuery(heredoc.Docf(` + { + "data": { + "nodes": [ + { + "__typename": "PullRequest", + "id": "PR_node3000", + "fullDatabaseId": "3000", + "number": 100, + "title": "Improve docs", + "state": "OPEN", + "isDraft": true, + "url": "https://github.com/OWNER/REPO/pull/100", + "body": "", + "createdAt": "%[1]s", + "updatedAt": "%[1]s", + "repository": {"nameWithOwner": "OWNER/REPO"} + }, + { + "__typename": "User", + "login": "octocat", + "name": "Octocat", + "databaseId": 1 + } + ] + } + }`, + sampleDateString, + ), func(q string, vars map[string]interface{}) { + // Expected encoded node IDs for resource IDs 3000 and user octocat + assert.Equal(t, []interface{}{"PR_kwDNA-jNC7g", "U_kgAB"}, vars["ids"]) + }), + ) + }, + wantOut: []*Session{ + { + ID: "sessA", + Name: "Build artifacts", + UserID: 1, + AgentID: 2, + Logs: "", + State: "failed", + OwnerID: 10, + RepoID: 1000, + ResourceType: "pull", + ResourceID: 3000, + CreatedAt: sampleDate, + Error: &SessionError{ + Code: "some-error-code", + Message: "some-error-message", + }, + PullRequest: &api.PullRequest{ + ID: "PR_node3000", + FullDatabaseID: "3000", + Number: 100, + Title: "Improve docs", + State: "OPEN", + IsDraft: true, + URL: "https://github.com/OWNER/REPO/pull/100", + Body: "", + CreatedAt: sampleDate, + UpdatedAt: sampleDate, + Repository: &api.PRRepository{ + NameWithOwner: "OWNER/REPO", + }, + }, + User: &api.GitHubUser{Login: "octocat", Name: "Octocat", DatabaseID: 1}, + }, + }, + }, { name: "API error", limit: 10,