diff --git a/packages/amazonq/.changes/next-release/Bug Fix-55ef93ff-1589-41bc-a482-ed09002f1fd9.json b/packages/amazonq/.changes/next-release/Bug Fix-55ef93ff-1589-41bc-a482-ed09002f1fd9.json new file mode 100644 index 00000000000..4b0dc2b599d --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-55ef93ff-1589-41bc-a482-ed09002f1fd9.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Amazon Q Feature Dev: Add error messages when the upload URL expires" +} diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index b945d221b5b..94dcd9c8832 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -280,6 +280,7 @@ "AWS.amazonq.featureDev.error.codeGen.denyListedError": "I'm sorry, I'm having trouble generating your code and can't continue at the moment. Please try again later, and share feedback to help me improve.", "AWS.amazonq.featureDev.error.codeGen.default": "I'm sorry, I ran into an issue while trying to generate your code. Please try again.", "AWS.amazonq.featureDev.error.codeGen.timeout": "Code generation did not finish within the expected time", + "AWS.amazonq.featureDev.error.uploadURLExpired": "I’m sorry, I wasn’t able to generate code. A connection timed out or became unavailable. Please try again or check the following:\n\n- Exclude non-essential files in your workspace’s `.gitignore.`\n\n- Check that your network connection is stable.", "AWS.amazonq.featureDev.error.workspaceFolderNotFoundError": "I couldn't find a workspace folder. Open a workspace, and then open a new chat tab and enter /dev to start discussing your code task with me.", "AWS.amazonq.featureDev.error.selectedFolderNotInWorkspaceFolderError": "The folder you chose isn't in your open workspace folder. You can add this folder to your workspace, or choose a folder in your open workspace.", "AWS.amazonq.featureDev.error.userMessageNotFoundError": "It looks like you didn't provide an input. Please enter your message in the text bar.", diff --git a/packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts b/packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts index 292bc2cc848..398e4de80a5 100644 --- a/packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts +++ b/packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts @@ -20,6 +20,7 @@ import { SelectedFolderNotInWorkspaceFolderError, TabIdNotFoundError, UploadCodeError, + UploadURLExpired, UserMessageNotFoundError, WorkspaceFolderNotFoundError, ZipFileError, @@ -280,6 +281,14 @@ export class FeatureDevController { ], }) break + case UploadURLExpired.errorName: + this.messenger.sendAnswer({ + type: 'answer', + tabID: message.tabID, + message: err.message, + canBeVoted: true, + }) + break default: if (isDenyListedError || this.retriesRemaining(session) === 0) { defaultMessage = i18n('AWS.amazonq.featureDev.error.codeGen.denyListedError') diff --git a/packages/core/src/amazonqFeatureDev/errors.ts b/packages/core/src/amazonqFeatureDev/errors.ts index 3462963ca9f..b2152e73863 100644 --- a/packages/core/src/amazonqFeatureDev/errors.ts +++ b/packages/core/src/amazonqFeatureDev/errors.ts @@ -98,6 +98,13 @@ export class UploadCodeError extends ToolkitError { } } +export class UploadURLExpired extends ToolkitError { + static errorName = 'UploadURLExpired' + constructor() { + super(i18n('AWS.amazonq.featureDev.error.uploadURLExpired'), { code: 'UploadURLExpired' }) + } +} + export class IllegalStateTransition extends ToolkitError { constructor() { super(i18n('AWS.amazonq.featureDev.error.illegalStateTransition'), { code: 'IllegalStateTransition' }) diff --git a/packages/core/src/amazonqFeatureDev/util/upload.ts b/packages/core/src/amazonqFeatureDev/util/upload.ts index 1b7b6a4404b..f9324cfacb8 100644 --- a/packages/core/src/amazonqFeatureDev/util/upload.ts +++ b/packages/core/src/amazonqFeatureDev/util/upload.ts @@ -7,7 +7,9 @@ import request, { RequestError } from '../../shared/request' import { getLogger } from '../../shared/logger/logger' import { featureName } from '../constants' -import { UploadCodeError } from '../errors' +import { UploadCodeError, UploadURLExpired } from '../errors' +import { ToolkitError } from '../../shared' +import { i18n } from '../../shared/i18n-helper' /** * uploadCode @@ -30,8 +32,16 @@ export async function uploadCode(url: string, buffer: Buffer, checksumSha256: st }).response } catch (e: any) { getLogger().error(`${featureName}: failed to upload code to s3: ${(e as Error).message}`) - throw new UploadCodeError( - e instanceof RequestError ? `${e.response.status}: ${e.response.statusText}` : 'Unknown' - ) + if (e instanceof RequestError) { + switch (e.response.status) { + case 403: + throw new UploadURLExpired() + default: + throw new UploadCodeError( + e instanceof RequestError ? `${e.response.status}: ${e.response.statusText}` : 'Unknown' + ) + } + } + throw ToolkitError.chain(e, i18n('AWS.amazonq.featureDev.error.codeGen.default')) } }