Skip to content

Commit 944c4dd

Browse files
authored
Include more details in error messages and handle permission errors (#7932)
1 parent 46258c8 commit 944c4dd

2 files changed

Lines changed: 38 additions & 7 deletions

File tree

src/github/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export function mergeQuerySchemaWithShared(sharedSchema: Schema, schema: Schema)
100100
}
101101

102102
type RemoteAgentSuccessResult = { link: string; state: 'success'; number: number; webviewUri: Uri; llmDetails: string; sessionId: string };
103-
type RemoteAgentErrorResult = { error: string; state: 'error' };
103+
type RemoteAgentErrorResult = { error: string; innerError?: string; state: 'error' };
104104
export type RemoteAgentResult = RemoteAgentSuccessResult | RemoteAgentErrorResult;
105105

106106
export interface IAPISessionLogs {

src/github/copilotRemoteAgent.ts

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ export class CopilotRemoteAgentManager extends Disposable {
105105
stream,
106106
);
107107
if (result.state !== 'success') {
108-
Logger.error(`Failed to provide new chat session item: ${result.error}`, CopilotRemoteAgentManager.ID);
109-
stream.warning('Failed delegating to coding agent. Please try again later.');
108+
Logger.error(`Failed to provide new chat session item: ${result.error}${result.innerError ? `\nInner Error: ${result.innerError}` : ''}`, CopilotRemoteAgentManager.ID);
109+
stream.warning(result.error);
110110
return;
111111
}
112112
return result.number;
@@ -708,7 +708,7 @@ export class CopilotRemoteAgentManager extends Disposable {
708708
async invokeRemoteAgent(prompt: string, problemContext?: string, token?: vscode.CancellationToken, autoPushAndCommit = true, chatStream?: vscode.ChatResponseStream): Promise<RemoteAgentResult> {
709709
const capiClient = await this.copilotApi;
710710
if (!capiClient) {
711-
return { error: vscode.l10n.t('Failed to initialize Copilot API'), state: 'error' };
711+
return { error: vscode.l10n.t('Failed to initialize Copilot API. Please try again later.'), state: 'error' };
712712
}
713713

714714
await this.promptAndUpdatePreferredGitHubRemote(true);
@@ -719,6 +719,37 @@ export class CopilotRemoteAgentManager extends Disposable {
719719
}
720720
const { owner, repo, remote, repository, ghRepository, baseRef } = repoInfo;
721721

722+
// Check if user has permission to access the repository
723+
try {
724+
await ghRepository.octokit.api.repos.get({ owner, repo });
725+
} catch (error) {
726+
if (error.status === 404 || error.status === 403) {
727+
const currentUser = await this.credentialStore.getCurrentUser(remote.authProviderId);
728+
return {
729+
error: vscode.l10n.t(
730+
'Unable to access {0} as user {1}. Please check your permissions and try again.',
731+
`\`${owner}/${repo}\``,
732+
`\`${currentUser.login}\``,
733+
),
734+
state: 'error',
735+
};
736+
}
737+
738+
// Re-throw other errors to be handled by the outer catch block
739+
throw error;
740+
}
741+
742+
// Check if user has permission to assign Copilot in repository
743+
if (!(await this.isAssignable())) {
744+
return {
745+
error: vscode.l10n.t(
746+
'Unable to assign GitHub Copilot coding agent in {0}. Please check your permissions and try again.',
747+
`\`${owner}/${repo}\``
748+
),
749+
state: 'error',
750+
};
751+
}
752+
722753
// NOTE: This is as unobtrusive as possible with the current high-level APIs.
723754
// We only create a new branch and commit if there are staged or working changes.
724755
// This could be improved if we add lower-level APIs to our git extension (e.g. in-memory temp git index).
@@ -734,7 +765,7 @@ export class CopilotRemoteAgentManager extends Disposable {
734765
chatStream?.progress(vscode.l10n.t('Waiting for local changes'));
735766
head_ref = await this.gitOperationsManager.commitAndPushChanges(repoInfo);
736767
} catch (error) {
737-
return { error: error.message, state: 'error' };
768+
return { error: vscode.l10n.t('Failed to commit and push changes. Please try again later.'), innerError: error.message, state: 'error' };
738769
}
739770
}
740771

@@ -769,7 +800,7 @@ export class CopilotRemoteAgentManager extends Disposable {
769800
isCancelled: String(userCancelled),
770801
});
771802
if (userCancelled) {
772-
return { error: vscode.l10n.t('User cancelled due to truncation'), state: 'error' };
803+
return { error: vscode.l10n.t('User cancelled due to truncation.'), state: 'error' };
773804
}
774805
}
775806

@@ -818,7 +849,7 @@ export class CopilotRemoteAgentManager extends Disposable {
818849
sessionId: response.session_id
819850
};
820851
} catch (error) {
821-
return { error: error.message, state: 'error' };
852+
return { error: vscode.l10n.t('Failed delegating to coding agent. Please try again later.'), innerError: error.message, state: 'error' };
822853
}
823854
}
824855

0 commit comments

Comments
 (0)