From a559cc8b2e068eacfa853f4c910cca694dfa94c9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Jun 2026 01:04:33 +0000 Subject: [PATCH 1/3] chore: start assign-to-agent JS fix plan Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup-cli/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/setup-cli/install.sh b/actions/setup-cli/install.sh index 5635319fd84..c7a5ed2ffed 100755 --- a/actions/setup-cli/install.sh +++ b/actions/setup-cli/install.sh @@ -1,7 +1,7 @@ #!/bin/bash set +o histexpand -# Kept in sync with install-gh-aw.sh — edit that file, then copy to this path. +# Kept in sync with actions/setup-cli/install.sh — edit this file, then copy to that path. # Script to download and install gh-aw binary for the current OS and architecture # Supports: Linux, macOS (Darwin), FreeBSD, Windows (Git Bash/MSYS/Cygwin) From 7bddb21b44fabb91af98d336cc5837790f1e8ab2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Jun 2026 01:13:38 +0000 Subject: [PATCH 2/3] fix: correct assign-to-agent GraphQL per official docs - Use array notation `[CAN_BE_ASSIGNED]` for `capabilities` param in both `getAvailableAgentLogins` and `findAgent` queries - Add `agentAssignment` to fallback `addAssigneesToAssignable` mutation so agent task context is included when primary mutation is forbidden - Update stale test mocks from `addAssigneesToAssignable` to `replaceActorsForAssignable` (the actual primary mutation) Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/assign_agent_helpers.cjs | 61 +++++++++++++++++++++-- actions/setup/js/assign_to_agent.test.cjs | 52 ++++++++----------- 2 files changed, 78 insertions(+), 35 deletions(-) diff --git a/actions/setup/js/assign_agent_helpers.cjs b/actions/setup/js/assign_agent_helpers.cjs index 81fa1563941..2620aa2d903 100644 --- a/actions/setup/js/assign_agent_helpers.cjs +++ b/actions/setup/js/assign_agent_helpers.cjs @@ -49,7 +49,7 @@ async function getAvailableAgentLogins(owner, repo, githubClient = github) { const query = ` query($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { - suggestedActors(first: 100, capabilities: CAN_BE_ASSIGNED) { + suggestedActors(first: 100, capabilities: [CAN_BE_ASSIGNED]) { nodes { ... on Bot { login __typename } } } } @@ -80,13 +80,18 @@ async function findAgent(owner, repo, agentName, githubClient = github) { const query = ` query($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { - suggestedActors(first: 100, capabilities: CAN_BE_ASSIGNED) { + suggestedActors(first: 100, capabilities: [CAN_BE_ASSIGNED]) { nodes { ... on Bot { id login __typename } + ... on User { + id + login + __typename + } } } } @@ -467,7 +472,54 @@ async function assignAgentToIssue(assignableId, agentId, currentAssignees, agent // Attempt fallback mutation addAssigneesToAssignable when replaceActorsForAssignable is forbidden core.info("Primary mutation replaceActorsForAssignable forbidden. Attempting fallback addAssigneesToAssignable..."); try { - const fallbackMutation = ` + // Build agentAssignment for fallback mutation (same parameters as primary) + const fallbackAgentAssignmentFields = []; + const fallbackAgentAssignmentParams = []; + const fallbackVariables = { assignableId, assigneeIds: [agentId] }; + + if (pullRequestRepoId) { + fallbackAgentAssignmentFields.push("targetRepositoryId: $targetRepoId"); + fallbackAgentAssignmentParams.push("$targetRepoId: ID!"); + fallbackVariables.targetRepoId = pullRequestRepoId; + } + if (model) { + fallbackAgentAssignmentFields.push("model: $model"); + fallbackAgentAssignmentParams.push("$model: String!"); + fallbackVariables.model = model; + } + if (customAgent) { + fallbackAgentAssignmentFields.push("customAgent: $customAgent"); + fallbackAgentAssignmentParams.push("$customAgent: String!"); + fallbackVariables.customAgent = customAgent; + } + if (customInstructions) { + fallbackAgentAssignmentFields.push("customInstructions: $customInstructions"); + fallbackAgentAssignmentParams.push("$customInstructions: String!"); + fallbackVariables.customInstructions = customInstructions; + } + if (baseBranch) { + fallbackAgentAssignmentFields.push("baseRef: $baseRef"); + fallbackAgentAssignmentParams.push("$baseRef: String!"); + fallbackVariables.baseRef = baseBranch; + } + + const hasFallbackAgentAssignment = fallbackAgentAssignmentFields.length > 0; + const fallbackBaseParams = ["$assignableId: ID!", "$assigneeIds: [ID!]!", ...fallbackAgentAssignmentParams].join(", "); + const fallbackMutation = hasFallbackAgentAssignment + ? ` + mutation(${fallbackBaseParams}) { + addAssigneesToAssignable(input: { + assignableId: $assignableId, + assigneeIds: $assigneeIds, + agentAssignment: { + ${fallbackAgentAssignmentFields.join("\n ")} + } + }) { + clientMutationId + } + } + ` + : ` mutation($assignableId: ID!, $assigneeIds: [ID!]!) { addAssigneesToAssignable(input: { assignableId: $assignableId, @@ -480,8 +532,7 @@ async function assignAgentToIssue(assignableId, agentId, currentAssignees, agent core.info("Executing fallback agent assignment GraphQL mutation"); core.debug(`Fallback GraphQL mutation with variables: assignableId=${assignableId}, assigneeIds=[${agentId}]`); const fallbackResp = await githubClient.graphql(fallbackMutation, { - assignableId, - assigneeIds: [agentId], + ...fallbackVariables, headers: { "GraphQL-Features": "issues_copilot_assignment_api_support,coding_agent_model_selection", }, diff --git a/actions/setup/js/assign_to_agent.test.cjs b/actions/setup/js/assign_to_agent.test.cjs index f531b577bbd..a2abe043e6a 100644 --- a/actions/setup/js/assign_to_agent.test.cjs +++ b/actions/setup/js/assign_to_agent.test.cjs @@ -211,12 +211,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { - assignees: { - nodes: [{ login: "copilot-swe-agent" }], - }, - }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -251,8 +247,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }) .mockResolvedValueOnce({ @@ -261,8 +257,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -305,8 +301,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -354,8 +350,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -947,8 +943,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }) .mockResolvedValueOnce({ @@ -957,8 +953,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -1098,12 +1094,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { - assignees: { - nodes: [{ login: "copilot-swe-agent" }], - }, - }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); @@ -1631,8 +1623,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }) .mockResolvedValueOnce({ @@ -1641,8 +1633,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }) .mockResolvedValueOnce({ @@ -1651,8 +1643,8 @@ describe("assign_to_agent", () => { }, }) .mockResolvedValueOnce({ - addAssigneesToAssignable: { - assignable: { assignees: { nodes: [{ login: "copilot-swe-agent" }] } }, + replaceActorsForAssignable: { + __typename: "ReplaceActorsForAssignablePayload", }, }); From 77fa5136812d23fe21ae460a0b9dd36454e9eb91 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Jun 2026 01:17:41 +0000 Subject: [PATCH 3/3] fix: remove unintended User fragment from findAgent query Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/assign_agent_helpers.cjs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/actions/setup/js/assign_agent_helpers.cjs b/actions/setup/js/assign_agent_helpers.cjs index 2620aa2d903..808a88120b0 100644 --- a/actions/setup/js/assign_agent_helpers.cjs +++ b/actions/setup/js/assign_agent_helpers.cjs @@ -87,11 +87,6 @@ async function findAgent(owner, repo, agentName, githubClient = github) { login __typename } - ... on User { - id - login - __typename - } } } }