Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8d3c4df
github: add agent tasks API support
danyalahmed1995 May 14, 2026
efa12d7
Merge remote-tracking branch 'upstream/master' into add-agent-tasks-api
danyalahmed1995 May 14, 2026
4263d58
test: cover agent tasks list options error
danyalahmed1995 May 14, 2026
43387ee
Update github/agent_tasks.go
danyalahmed1995 May 14, 2026
3c4d321
fix: address agent tasks review comments
danyalahmed1995 May 15, 2026
93e009c
fix: remove openapi operations diff
danyalahmed1995 May 15, 2026
738801b
fix: restore agent tasks creator id type
danyalahmed1995 May 15, 2026
ceabbf4
Update github/agent_tasks.go
danyalahmed1995 May 15, 2026
f8042ad
fix: address latest agent tasks review comments
danyalahmed1995 May 15, 2026
a2f45a2
fix: preserve agent tasks docs api version
danyalahmed1995 May 15, 2026
5160bbf
Update github/agent_tasks.go
danyalahmed1995 May 16, 2026
ab0cc87
Update github/agent_tasks.go
danyalahmed1995 May 16, 2026
d10a780
Update github/agent_tasks.go
danyalahmed1995 May 16, 2026
a982cae
Update github/agent_tasks.go
danyalahmed1995 May 16, 2026
41b1ac1
Update github/agent_tasks.go
danyalahmed1995 May 17, 2026
dc0817a
fix: address agent tasks schema review
danyalahmed1995 May 17, 2026
8e1ed64
fix: use shared agent tasks api version constant
danyalahmed1995 May 18, 2026
96ff69b
Merge remote-tracking branch 'upstream/master' into add-agent-tasks-api
danyalahmed1995 May 19, 2026
d40f10b
Update github/agent_tasks.go
danyalahmed1995 May 27, 2026
526dbeb
Update github/agent_tasks.go
danyalahmed1995 May 27, 2026
ca7b94c
Update agent_tasks.go
danyalahmed1995 May 27, 2026
f60454c
Update agent_tasks.go
danyalahmed1995 May 27, 2026
38fdd45
Update agent_tasks.go
danyalahmed1995 May 27, 2026
127e602
Update agent_tasks_test.go
danyalahmed1995 May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
254 changes: 254 additions & 0 deletions github/agent_tasks.go
Comment thread
danyalahmed1995 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
// Copyright 2026 The go-github AUTHORS. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package github

import (
"context"
"encoding/json"
"fmt"
"time"
)

// AgentTasksService handles communication with the agent tasks
// methods of the GitHub API.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10
type AgentTasksService service

// AgentTask represents a Copilot cloud agent task.
type AgentTask struct {
Comment thread
danyalahmed1995 marked this conversation as resolved.
ID string `json:"id"`
URL *string `json:"url,omitempty"`
HTMLURL *string `json:"html_url,omitempty"`
Name *string `json:"name,omitempty"`
Creator *User `json:"creator,omitempty"`
CreatorType *string `json:"creator_type,omitempty"`
Comment thread
danyalahmed1995 marked this conversation as resolved.
Owner *AgentTaskOwner `json:"owner,omitempty"`
Repository *AgentTaskRepository `json:"repository,omitempty"`
State string `json:"state"`
SessionCount *int `json:"session_count,omitempty"`
Artifacts []*AgentTaskArtifact `json:"artifacts,omitempty"`
ArchivedAt *Timestamp `json:"archived_at,omitempty"`
CreatedAt Timestamp `json:"created_at"`
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
Sessions []*AgentTaskSession `json:"sessions,omitempty"`

// Deprecated: UserCollaborators is deprecated by GitHub.
UserCollaborators []*User `json:"user_collaborators,omitempty"`
Comment on lines +39 to +40
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I propose not adding the deprecated field. Or should we?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This field is still present in the response schema, exposing it would keep the client complete and let callers read it if GitHub still returns it. I marked it deprecated so users are discouraged from relying on it.

GitHub’s official OpenAPI description still includes user_collaborators in the Agent Tasks response schema, marked deprecated. Since go-github models API response fields, exposing it keeps the SDK schema-complete and allows callers to read the field if GitHub still returns it.

}

// AgentTaskOwner represents an agent task owner.
type AgentTaskOwner struct {
ID *int64 `json:"id,omitempty"`
}

// AgentTaskRepository represents an agent task repository.
type AgentTaskRepository struct {
ID *int64 `json:"id,omitempty"`
}

// AgentTaskArtifact represents an artifact produced by an agent task.
type AgentTaskArtifact struct {
Provider string `json:"provider"`
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}

// AgentTaskSession represents a session associated with an agent task.
type AgentTaskSession struct {
ID string `json:"id"`
Name *string `json:"name,omitempty"`
User *User `json:"user,omitempty"`
Owner *AgentTaskOwner `json:"owner,omitempty"`
Repository *AgentTaskRepository `json:"repository,omitempty"`
TaskID *string `json:"task_id,omitempty"`
State string `json:"state"`
CreatedAt Timestamp `json:"created_at"`
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
CompletedAt *Timestamp `json:"completed_at,omitempty"`
Prompt *string `json:"prompt,omitempty"`
HeadRef *string `json:"head_ref,omitempty"`
BaseRef *string `json:"base_ref,omitempty"`
Model *string `json:"model,omitempty"`
}

// AgentTaskList represents a list of agent tasks.
type AgentTaskList struct {
Tasks []*AgentTask `json:"tasks"`
TotalActiveCount *int `json:"total_active_count,omitempty"`
TotalArchivedCount *int `json:"total_archived_count,omitempty"`
}
Comment thread
danyalahmed1995 marked this conversation as resolved.

// AgentTaskListOptions specifies optional parameters to AgentTasksService.List.
type AgentTaskListOptions struct {
// Sort specifies the field to sort results by. Possible values are: updated_at, created_at.
Sort string `url:"sort,omitempty"`

// Direction specifies the direction to sort results by. Possible values are: asc, desc.
Direction string `url:"direction,omitempty"`

// State is a comma-separated list of task states to filter by.
State string `url:"state,omitempty"`

// IsArchived filters tasks by archived status.
IsArchived bool `url:"is_archived,omitempty"`

// Since filters tasks updated at or after this time.
Since *time.Time `url:"since,omitempty"`

ListOptions
}

// AgentTaskListByRepoOptions specifies optional parameters to AgentTasksService.ListByRepo.
type AgentTaskListByRepoOptions struct {
AgentTaskListOptions

// CreatorID filters tasks by creator user ID.
CreatorID int64 `url:"creator_id,omitempty"`
}

// CreateAgentTaskRequest represents the parameters for creating an agent task.
type CreateAgentTaskRequest struct {
// Prompt is the user's prompt for the agent.
Prompt string `json:"prompt"`

// Model is the model to use for this task.
Model *string `json:"model,omitempty"`

// CreatePullRequest indicates whether to create a pull request.
CreatePullRequest *bool `json:"create_pull_request,omitempty"`

// BaseRef is the base ref for the new branch or pull request.
BaseRef *string `json:"base_ref,omitempty"`
}

// ListByRepo lists tasks for a repository.
//
// Note: This endpoint is in public preview and is subject to change.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10#list-tasks-for-repository
//
//meta:operation GET /agents/repos/{owner}/{repo}/tasks
func (s *AgentTasksService) ListByRepo(ctx context.Context, owner, repo string, opts *AgentTaskListByRepoOptions) (*AgentTaskList, *Response, error) {
u := fmt.Sprintf("agents/repos/%v/%v/tasks", owner, repo)
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest(ctx, "GET", u, nil, WithVersion(api20260310))
if err != nil {
return nil, nil, err
}

var tasks *AgentTaskList
resp, err := s.client.Do(req, &tasks)
if err != nil {
return nil, resp, err
}

return tasks, resp, nil
}

// Create starts a new Copilot cloud agent task for a repository.
//
// Note: This endpoint is in public preview and is subject to change.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10#start-a-task
//
//meta:operation POST /agents/repos/{owner}/{repo}/tasks
func (s *AgentTasksService) Create(ctx context.Context, owner, repo string, opts *CreateAgentTaskRequest) (*AgentTask, *Response, error) {
u := fmt.Sprintf("agents/repos/%v/%v/tasks", owner, repo)

req, err := s.client.NewRequest(ctx, "POST", u, opts, WithVersion(api20260310))
if err != nil {
return nil, nil, err
}

var task *AgentTask
resp, err := s.client.Do(req, &task)
if err != nil {
return nil, resp, err
}

return task, resp, nil
}

// GetByRepoAndID gets a repository task by ID.
//
// Note: This endpoint is in public preview and is subject to change.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10#get-a-task-by-repo
//
//meta:operation GET /agents/repos/{owner}/{repo}/tasks/{task_id}
func (s *AgentTasksService) GetByRepoAndID(ctx context.Context, owner, repo, taskID string) (*AgentTask, *Response, error) {
u := fmt.Sprintf("agents/repos/%v/%v/tasks/%v", owner, repo, taskID)

req, err := s.client.NewRequest(ctx, "GET", u, nil, WithVersion(api20260310))
if err != nil {
return nil, nil, err
}

var task *AgentTask
resp, err := s.client.Do(req, &task)
if err != nil {
return nil, resp, err
}

return task, resp, nil
}

// List lists tasks for the authenticated user.
//
// Note: This endpoint is in public preview and is subject to change.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10#list-tasks
//
//meta:operation GET /agents/tasks
func (s *AgentTasksService) List(ctx context.Context, opts *AgentTaskListOptions) (*AgentTaskList, *Response, error) {
u := "agents/tasks"
u, err := addOptions(u, opts)
if err != nil {
return nil, nil, err
}

req, err := s.client.NewRequest(ctx, "GET", u, nil, WithVersion(api20260310))
if err != nil {
return nil, nil, err
}

var tasks *AgentTaskList
resp, err := s.client.Do(req, &tasks)
if err != nil {
return nil, resp, err
}

return tasks, resp, nil
}

// Get gets a task by ID for the authenticated user.
//
// Note: This endpoint is in public preview and is subject to change.
//
// GitHub API docs: https://docs.github.com/rest/agent-tasks/agent-tasks?apiVersion=2026-03-10#get-a-task-by-id
//
//meta:operation GET /agents/tasks/{task_id}
func (s *AgentTasksService) Get(ctx context.Context, taskID string) (*AgentTask, *Response, error) {
u := fmt.Sprintf("agents/tasks/%v", taskID)

req, err := s.client.NewRequest(ctx, "GET", u, nil, WithVersion(api20260310))
if err != nil {
return nil, nil, err
}

var task *AgentTask
resp, err := s.client.Do(req, &task)
if err != nil {
return nil, resp, err
}

return task, resp, nil
}
Loading
Loading