diff --git a/pkg/cmd/agent-task/capi/sessions.go b/pkg/cmd/agent-task/capi/sessions.go index 50ce36a1e..a3e1ded1e 100644 --- a/pkg/cmd/agent-task/capi/sessions.go +++ b/pkg/cmd/agent-task/capi/sessions.go @@ -16,7 +16,7 @@ import ( "github.com/vmihailenco/msgpack/v5" ) -const defaultSessionsPerPage = 50 +var defaultSessionsPerPage = 50 // session is an in-flight agent task type session struct { @@ -65,20 +65,23 @@ type Session struct { // ListSessionsForViewer lists all agent sessions for the // authenticated user up to limit. func (c *CAPIClient) ListSessionsForViewer(ctx context.Context, limit int) ([]*Session, error) { + if limit == 0 { + return nil, nil + } + url := baseCAPIURL + "/agents/sessions" + pageSize := defaultSessionsPerPage - var sessions []session - page := 1 - perPage := defaultSessionsPerPage + sessions := make([]session, 0, limit+pageSize) - for { + for page := 1; ; page++ { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) if err != nil { return nil, err } q := req.URL.Query() - q.Set("page_size", strconv.Itoa(perPage)) + q.Set("page_size", strconv.Itoa(pageSize)) q.Set("page_number", strconv.Itoa(page)) req.URL.RawQuery = q.Encode() @@ -96,11 +99,11 @@ func (c *CAPIClient) ListSessionsForViewer(ctx context.Context, limit int) ([]*S if err := json.NewDecoder(res.Body).Decode(&response); err != nil { return nil, fmt.Errorf("failed to decode sessions response: %w", err) } - if len(response.Sessions) == 0 || len(sessions) >= limit { + + sessions = append(sessions, response.Sessions...) + if len(response.Sessions) < pageSize || len(sessions) >= limit { break } - sessions = append(sessions, response.Sessions...) - page++ } // Drop any above the limit @@ -123,20 +126,23 @@ func (c *CAPIClient) ListSessionsForRepo(ctx context.Context, owner string, repo return nil, fmt.Errorf("owner and repo are required") } + if limit == 0 { + return nil, nil + } + url := fmt.Sprintf("%s/agents/sessions/nwo/%s/%s", baseCAPIURL, url.PathEscape(owner), url.PathEscape(repo)) + pageSize := defaultSessionsPerPage - var sessions []session - page := 1 - perPage := defaultSessionsPerPage + sessions := make([]session, 0, limit+pageSize) - for { + for page := 1; ; page++ { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody) if err != nil { return nil, err } q := req.URL.Query() - q.Set("page_size", strconv.Itoa(perPage)) + q.Set("page_size", strconv.Itoa(pageSize)) q.Set("page_number", strconv.Itoa(page)) req.URL.RawQuery = q.Encode() @@ -154,11 +160,11 @@ func (c *CAPIClient) ListSessionsForRepo(ctx context.Context, owner string, repo if err := json.NewDecoder(res.Body).Decode(&response); err != nil { return nil, fmt.Errorf("failed to decode sessions response: %w", err) } - if len(response.Sessions) == 0 || len(sessions) >= limit { + + sessions = append(sessions, response.Sessions...) + if len(response.Sessions) < pageSize || len(sessions) >= limit { break } - sessions = append(sessions, response.Sessions...) - page++ } // Drop any above the limit @@ -194,10 +200,12 @@ func (c *CAPIClient) hydrateSessionPullRequests(sessions []session) ([]*Session, var resp struct { Nodes []struct { + TypeName string `graphql:"__typename"` PullRequest sessionPullRequest `graphql:"... on PullRequest"` } `graphql:"nodes(ids: $ids)"` } + // TODO handle pagination host, _ := c.authCfg.DefaultHost() err := apiClient.Query(host, "FetchPRsForAgentTaskSessions", &resp, map[string]any{ "ids": prNodeIds,