@@ -26,7 +26,7 @@ import { PullRequestReviewCommon, ReviewContext } from './pullRequestReviewCommo
2626import { pickEmail , reviewersQuickPick } from './quickPicks' ;
2727import { parseReviewers } from './utils' ;
2828import { CancelCodingAgentReply , DeleteReviewResult , MergeArguments , MergeResult , PullRequest , ReviewType } from './views' ;
29- import { IComment } from '../common/comment' ;
29+ import { COPILOT_ACCOUNTS , IComment } from '../common/comment' ;
3030import { COPILOT_SWE_AGENT , copilotEventToStatus , CopilotPRStatus , mostRecentCopilotEvent } from '../common/copilot' ;
3131import { commands , contexts } from '../common/executeCommands' ;
3232import { disposeAll } from '../common/lifecycle' ;
@@ -257,7 +257,8 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
257257 mergeability ,
258258 emailForCommit ,
259259 coAuthors ,
260- hasReviewDraft
260+ hasReviewDraft ,
261+ assignableUsers
261262 ] = await Promise . all ( [
262263 this . _folderRepositoryManager . resolvePullRequest (
263264 pullRequestModel . remote . owner ,
@@ -279,6 +280,7 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
279280 this . _folderRepositoryManager . getPreferredEmail ( pullRequestModel ) ,
280281 pullRequestModel . getCoAuthors ( ) ,
281282 pullRequestModel . validateDraftMode ( ) ,
283+ this . _folderRepositoryManager . getAssignableUsers ( )
282284 ] ) ;
283285 if ( ! pullRequest ) {
284286 throw new Error (
@@ -302,12 +304,16 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
302304 const reviewState = this . getCurrentUserReviewState ( this . _existingReviewers , currentUser ) ;
303305
304306 Logger . debug ( 'pr.initialize' , PullRequestOverviewPanel . ID ) ;
305- const baseContext = this . getInitializeContext ( currentUser , pullRequest , timelineEvents , repositoryAccess , viewerCanEdit , [ ] ) ;
307+ const users = assignableUsers [ pullRequestModel . remote . remoteName ] ?? [ ] ;
308+ const copilotUser = users . find ( user => COPILOT_ACCOUNTS [ user . login ] ) ;
309+ const isCopilotAlreadyReviewer = this . _existingReviewers . some ( reviewer => ! isITeam ( reviewer . reviewer ) && COPILOT_ACCOUNTS [ reviewer . reviewer . login ] ) ;
310+ const baseContext = this . getInitializeContext ( currentUser , pullRequest , timelineEvents , repositoryAccess , viewerCanEdit , users ) ;
306311
307312 this . preLoadInfoNotRequiredForOverview ( pullRequest ) ;
308313
309314 const context : Partial < PullRequest > = {
310315 ...baseContext ,
316+ canRequestCopilotReview : copilotUser !== undefined && ! isCopilotAlreadyReviewer ,
311317 isCurrentlyCheckedOut : isCurrentlyCheckedOut ,
312318 isRemoteBaseDeleted : pullRequest . isRemoteBaseDeleted ,
313319 base : pullRequest . base . label ,
@@ -415,6 +421,8 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
415421 return this . gotoChangesSinceReview ( message ) ;
416422 case 'pr.re-request-review' :
417423 return this . reRequestReview ( message ) ;
424+ case 'pr.add-reviewer-copilot' :
425+ return this . addReviewerCopilot ( message ) ;
418426 case 'pr.revert' :
419427 return this . revert ( message ) ;
420428 case 'pr.open-session-log' :
@@ -743,6 +751,26 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
743751 return PullRequestReviewCommon . reRequestReview ( this . getReviewContext ( ) , message ) ;
744752 }
745753
754+ private async addReviewerCopilot ( message : IRequestMessage < void > ) : Promise < void > {
755+ try {
756+ const copilotUser = ( await this . _folderRepositoryManager . getAssignableUsers ( ) ) [ this . _item . remote . remoteName ] . find ( user => COPILOT_ACCOUNTS [ user . login ] ) ;
757+ if ( copilotUser ) {
758+ await this . _item . requestReview ( [ copilotUser ] , [ ] ) ;
759+ const newReviewers = await this . _item . getReviewRequests ( ) ;
760+ this . _existingReviewers = parseReviewers ( newReviewers ! , await this . _item . getTimelineEvents ( ) , this . _item . author ) ;
761+ const reply = {
762+ reviewers : this . _existingReviewers
763+ } ;
764+ this . _replyMessage ( message , reply ) ;
765+ } else {
766+ this . _throwError ( message , 'Copilot reviewer not found.' ) ;
767+ }
768+ } catch ( e ) {
769+ vscode . window . showErrorMessage ( formatError ( e ) ) ;
770+ this . _throwError ( message , formatError ( e ) ) ;
771+ }
772+ }
773+
746774 private async revert ( message : IRequestMessage < string > ) : Promise < void > {
747775 await this . _folderRepositoryManager . createPullRequestHelper . revert ( this . _telemetry , this . _extensionUri , this . _folderRepositoryManager , this . _item , async ( pullRequest ) => {
748776 const result : Partial < PullRequest > = { revertable : ! pullRequest } ;
0 commit comments