Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 6 additions & 1 deletion extensions/copilot/src/extension/xtab/node/xtabProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1758,10 +1758,15 @@ export function mapChatFetcherErrorToNoNextEditReason(fetchError: ChatFetchError
case ChatFetchResponseType.AgentUnauthorized:
case ChatFetchResponseType.AgentFailedDependency:
case ChatFetchResponseType.InvalidStatefulMarker:
// Transient server-side failures (HTTP 5xx, e.g. "Server error: 500") are not client
// defects. They are already logged at the fetch layer and tracked via NES telemetry, so
// treat them like the other server-side conditions above (rate limiting, quota) rather
// than throwing: a background next-edit fetch must not escalate a transient 5xx into an
// unhandled error.
case ChatFetchResponseType.Failed:
return new NoNextEditReason.Uncategorized(ErrorUtils.fromUnknown(fetchError));
case ChatFetchResponseType.BadRequest:
case ChatFetchResponseType.NotFound:
case ChatFetchResponseType.Failed:
case ChatFetchResponseType.NetworkError:
case ChatFetchResponseType.Unknown:
return new NoNextEditReason.FetchFailure(ErrorUtils.fromUnknown(fetchError));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ describe('mapChatFetcherErrorToNoNextEditReason', () => {
{ type: ChatFetchResponseType.AgentUnauthorized, ...baseRequestFields, authorizationUrl: '' },
{ type: ChatFetchResponseType.AgentFailedDependency, ...baseRequestFields },
{ type: ChatFetchResponseType.InvalidStatefulMarker, ...baseRequestFields },
{ type: ChatFetchResponseType.Failed, ...baseRequestFields },
] satisfies ReadonlyArray<Parameters<typeof mapChatFetcherErrorToNoNextEditReason>[0]>)('maps $type to Uncategorized', (error) => {
const result = mapChatFetcherErrorToNoNextEditReason(error);
expect(result).toBeInstanceOf(NoNextEditReason.Uncategorized);
Expand All @@ -225,7 +226,6 @@ describe('mapChatFetcherErrorToNoNextEditReason', () => {
it.each([
{ type: ChatFetchResponseType.BadRequest, ...baseRequestFields },
{ type: ChatFetchResponseType.NotFound, ...baseRequestFields },
{ type: ChatFetchResponseType.Failed, ...baseRequestFields },
{ type: ChatFetchResponseType.NetworkError, ...baseRequestFields },
{ type: ChatFetchResponseType.Unknown, ...baseRequestFields },
] satisfies ReadonlyArray<Parameters<typeof mapChatFetcherErrorToNoNextEditReason>[0]>)('maps $type to FetchFailure', (error) => {
Expand Down
Loading