@@ -9,12 +9,13 @@ import { AuthProvider } from '../common/authentication';
99import { COPILOT_LOGINS } from '../common/copilot' ;
1010import { commands } from '../common/executeCommands' ;
1111import { Disposable } from '../common/lifecycle' ;
12- import { Remote } from '../common/remote' ;
12+ import { GitHubRemote , Remote } from '../common/remote' ;
1313import { CODING_AGENT , CODING_AGENT_AUTO_COMMIT_AND_PUSH , CODING_AGENT_ENABLED } from '../common/settingKeys' ;
1414import { toOpenPullRequestWebviewUri } from '../common/uri' ;
1515import { CopilotApi , RemoteAgentJobPayload } from './copilotApi' ;
1616import { CopilotPRWatcher , CopilotStateModel } from './copilotPrWatcher' ;
1717import { CredentialStore } from './credentials' ;
18+ import { FolderRepositoryManager } from './folderRepositoryManager' ;
1819import { RepositoriesManager } from './repositoriesManager' ;
1920
2021type RemoteAgentSuccessResult = { link : string ; state : 'success' ; number : number ; webviewUri : vscode . Uri ; llmDetails : string } ;
@@ -115,13 +116,12 @@ export class CopilotRemoteAgentManager extends Disposable {
115116 return false ;
116117 }
117118
118- const { owner, repo } = repoInfo ;
119- const folderManager = this . getFolderManagerForRepo ( owner , repo ) ;
119+ const { fm } = repoInfo ;
120120
121121 try {
122122 // Ensure assignable users are loaded
123- await folderManager . getAssignableUsers ( ) ;
124- const allAssignableUsers = folderManager . getAllAssignableUsers ( ) ;
123+ await fm . getAssignableUsers ( ) ;
124+ const allAssignableUsers = fm . getAllAssignableUsers ( ) ;
125125
126126 if ( ! allAssignableUsers ) {
127127 return false ;
@@ -169,33 +169,32 @@ export class CopilotRemoteAgentManager extends Disposable {
169169 . getConfiguration ( CODING_AGENT ) . get ( CODING_AGENT_AUTO_COMMIT_AND_PUSH , false ) ;
170170 }
171171
172- private getFolderManagerForRepo ( owner ?: string , repo ?: string ) {
173- let folderManager = ( owner && repo )
174- ? this . repositoriesManager . getManagerForRepository ( owner , repo )
175- : undefined ;
176- if ( ! folderManager && this . repositoriesManager . folderManagers . length > 0 ) {
177- folderManager = this . repositoriesManager . folderManagers [ 0 ] ;
178- }
179- if ( ! folderManager ) {
180- throw new Error ( 'No folder manager found for the repository. Open a workspace with a Git repository.' ) ;
172+ async repoInfo ( ) : Promise < { owner : string ; repo : string ; baseRef : string ; remote : GitHubRemote ; repository : Repository ; fm : FolderRepositoryManager } | undefined > {
173+ if ( ! this . repositoriesManager . folderManagers . length ) {
174+ return ;
181175 }
182- return folderManager ;
183- }
184-
185- async repoInfo ( ) : Promise < { owner : string ; repo : string ; remote : string ; baseRef : string ; repository : Repository } | undefined > {
186- const fm = this . getFolderManagerForRepo ( ) ;
176+ const fm = this . repositoriesManager . folderManagers [ 0 ] ;
187177 const repository = fm ?. repository ;
188- if ( ! fm || ! repository ) {
178+ if ( ! repository ) {
189179 return ;
190180 }
191- const { owner, repo } = await fm . getPullRequestDefaults ( ) ;
192- const remotes = repository . state . remotes ;
181+
193182 const baseRef = repository . state . HEAD ?. name ; // TODO: Consider edge cases
194- const remote = remotes . find ( r => r . name === 'origin' ) ?. name || remotes . find ( r => r . pushUrl ) ?. name ;
195- if ( ! owner || ! repo || ! remote || ! baseRef || ! repository ) {
183+ const ghRemotes = await fm . getGitHubRemotes ( ) ;
184+ if ( ! ghRemotes || ghRemotes . length === 0 ) {
196185 return ;
197186 }
198- return { owner, repo, remote, baseRef, repository } ;
187+
188+ const remote =
189+ ghRemotes . find ( remote => remote . remoteName === 'origin' )
190+ || ghRemotes [ 0 ] ; // Fallback to the first remote
191+
192+ // Extract repo data from target remote
193+ const { owner, repositoryName : repo } = remote ;
194+ if ( ! owner || ! repo || ! baseRef || ! repository ) {
195+ return ;
196+ }
197+ return { owner, repo, baseRef, remote, repository, fm } ;
199198 }
200199
201200 async commandImpl ( args ?: ICopilotRemoteAgentCommandArgs ) : Promise < string | undefined > {
@@ -214,9 +213,7 @@ export class CopilotRemoteAgentManager extends Disposable {
214213 }
215214 const { repository, owner, repo } = repoInfo ;
216215 const repoName = `${ owner } /${ repo } ` ; // TODO: Make sure this is where we'll push to
217-
218216 const hasChanges = repository . state . workingTreeChanges . length > 0 || repository . state . indexChanges . length > 0 ;
219-
220217 const learnMoreCb = async ( ) => {
221218 vscode . env . openExternal ( vscode . Uri . parse ( 'https://docs.github.com/copilot/using-github-copilot/coding-agent' ) ) ;
222219 } ;
@@ -301,7 +298,7 @@ export class CopilotRemoteAgentManager extends Disposable {
301298
302299 const repoInfo = await this . repoInfo ( ) ;
303300 if ( ! repoInfo ) {
304- return { error : vscode . l10n . t ( 'No repository information found. Please open a workspace with a Git repository.' ) , state : 'error' } ;
301+ return { error : vscode . l10n . t ( 'No repository information found. Please open a workspace with a GitHub repository.' ) , state : 'error' } ;
305302 }
306303 const { owner, repo, remote, repository, baseRef } = repoInfo ;
307304
@@ -327,7 +324,7 @@ export class CopilotRemoteAgentManager extends Disposable {
327324 return { error : vscode . l10n . t ( 'Could not \'git commit\' pending changes. If GPG signing or git hooks are enabled, please first commit or stash your changes and try again. ({0})' , e . message ) , state : 'error' } ;
328325 }
329326 }
330- await repository . push ( remote , asyncBranch , true ) ;
327+ await repository . push ( remote . remoteName , asyncBranch , true ) ;
331328 ref = asyncBranch ;
332329 } catch ( e ) {
333330 return { error : vscode . l10n . t ( 'Could not auto-push pending changes. Manually commit or stash your changes and try again. ({0})' , e . message ) , state : 'error' } ;
0 commit comments