From ee876b31975dbb9402f103225a7e188d2cb337fe Mon Sep 17 00:00:00 2001 From: Karthik Rajanna Date: Mon, 27 Apr 2026 21:40:01 +0000 Subject: [PATCH] fix: surface startTransform errors instead of swallowing them Return error object from catch block in atxNetTransformServer.ts instead of implicitly returning undefined. Add console.log in TEST 2 to log the raw startTransform response for debugging. --- .../src/tests/atxTransformInteg.test.ts | 2 ++ .../src/tests/lspClient.ts | 16 ++++++++++++ .../netTransform/atxNetTransformServer.ts | 2 ++ .../netTransform/atxTransformHandler.ts | 25 ++++++++++++++++--- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/integration-tests/atx-transform-server/src/tests/atxTransformInteg.test.ts b/integration-tests/atx-transform-server/src/tests/atxTransformInteg.test.ts index b4d3346650..58a1cc90e8 100644 --- a/integration-tests/atx-transform-server/src/tests/atxTransformInteg.test.ts +++ b/integration-tests/atx-transform-server/src/tests/atxTransformInteg.test.ts @@ -191,6 +191,8 @@ describe('ATX .NET Transform Integration Tests', () => { buildStartTransformRequest('IntegTest-BobsBookstore-' + Date.now(), sourceFiles) ) + console.log('StartTransform raw response:', JSON.stringify(result)) + transformationJobId = result?.TransformationJobId expect(transformationJobId).to.exist console.log('TransformationJobId:', transformationJobId) diff --git a/integration-tests/atx-transform-server/src/tests/lspClient.ts b/integration-tests/atx-transform-server/src/tests/lspClient.ts index 158f82fd73..990085e681 100644 --- a/integration-tests/atx-transform-server/src/tests/lspClient.ts +++ b/integration-tests/atx-transform-server/src/tests/lspClient.ts @@ -28,6 +28,22 @@ export class LspClient { this.process.stderr.on('data', (data: Buffer) => { console.error(`[LSP stderr] ${data.toString()}`) }) + + this.process.on('exit', (code, signal) => { + console.error(`[LSP] Process exited with code ${code}, signal ${signal}`) + for (const [id, { reject }] of this.pendingRequests) { + reject(new Error(`LSP server exited unexpectedly (code: ${code}, signal: ${signal})`)) + } + this.pendingRequests.clear() + }) + + this.process.on('error', (err) => { + console.error(`[LSP] Process error: ${err.message}`) + for (const [id, { reject }] of this.pendingRequests) { + reject(new Error(`LSP server error: ${err.message}`)) + } + this.pendingRequests.clear() + }) } private processBuffer(): void { diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxNetTransformServer.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxNetTransformServer.ts index d2075b4512..3382239b6b 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxNetTransformServer.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxNetTransformServer.ts @@ -91,6 +91,7 @@ export const AtxNetTransformServerToken = } } catch (e: any) { logging.error(`ATXTransformServer: Error executing command: ${String(e)}`) + return { error: String(e) } } } @@ -98,6 +99,7 @@ export const AtxNetTransformServerToken = params: ExecuteCommandParams, _token: CancellationToken ): Promise => { + console.error(`[DIAG] onExecuteCommandHandler: ${params.command}`) logging.info(`Received ATX FES command: ${params.command}`) return runAtxTransformCommand(params, _token) } diff --git a/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxTransformHandler.ts b/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxTransformHandler.ts index 5aa61ac26a..e694b5b608 100644 --- a/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxTransformHandler.ts +++ b/server/aws-lsp-codewhisperer/src/language-server/netTransform/atxTransformHandler.ts @@ -376,8 +376,9 @@ export class ATXTransformHandler { this.logging.error('ATX: CreateJob failed - no jobId or status in response') return null - } catch (error) { - this.logging.error(`ATX: CreateJob error: ${String(error)}`) + } catch (error: any) { + const metadata = error?.$metadata || {} + this.logging.error(`ATX: CreateJob error: ${String(error)} | requestId: ${metadata.requestId || 'N/A'} | httpStatus: ${metadata.httpStatusCode || 'N/A'}`) return null } } @@ -874,8 +875,11 @@ export class ATXTransformHandler { async getTransformInfo(request: AtxGetTransformInfoRequest): Promise { try { this.logging.log(`ATX: Getting transform info for job: ${request.TransformationJobId}`) + console.error(`[DIAG] getTransformInfo START for job: ${request.TransformationJobId}`) + console.error(`[DIAG] getTransformInfo: calling getJob...`) const job = await this.getJob(request.WorkspaceId, request.TransformationJobId) + console.error(`[DIAG] getTransformInfo: getJob returned, status=${job?.statusDetails?.status}`) if (!job) { this.logging.error(`ATX: Job not found: ${request.TransformationJobId}`) @@ -885,16 +889,20 @@ export class ATXTransformHandler { const jobStatus = job.statusDetails?.status if (jobStatus === 'COMPLETED') { + console.error(`[DIAG] getTransformInfo: COMPLETED branch - calling downloadFinalArtifact...`) const pathToArtifact = await this.downloadFinalArtifact( request.WorkspaceId, request.TransformationJobId, request.SolutionRootPath ) + console.error(`[DIAG] getTransformInfo: downloadFinalArtifact returned`) + console.error(`[DIAG] getTransformInfo: calling getTransformationPlan...`) const plan = await this.getTransformationPlan( request.WorkspaceId, request.TransformationJobId, request.SolutionRootPath ) + console.error(`[DIAG] getTransformInfo: getTransformationPlan returned`) return { TransformationJob: { @@ -926,6 +934,7 @@ export class ATXTransformHandler { ErrorString: 'Transformation job stopped', } as AtxGetTransformInfoResponse } else if (jobStatus === 'PLANNED') { + console.error(`[DIAG] getTransformInfo: PLANNED branch - calling getTransformationPlan...`) const plan = await this.getTransformationPlan( request.WorkspaceId, request.TransformationJobId, @@ -964,7 +973,9 @@ export class ATXTransformHandler { HitlTag: response?.HitlTag, } as AtxGetTransformInfoResponse } else { + console.error(`[DIAG] getTransformInfo: else branch (status=${jobStatus}) - calling listWorklogs...`) await this.listWorklogs(request.WorkspaceId, request.TransformationJobId, request.SolutionRootPath) + console.error(`[DIAG] getTransformInfo: listWorklogs returned`) return { TransformationJob: { @@ -975,22 +986,27 @@ export class ATXTransformHandler { } as AtxGetTransformInfoResponse } } catch (error) { + console.error(`[DIAG] getTransformInfo: CAUGHT ERROR: ${String(error)}`) this.logging.error(`ATX: GetTransformInfo error: ${String(error)}`) return null } } async uploadPlan(request: AtxUploadPlanRequest): Promise { + console.error('[DIAG] uploadPlan: START') this.logging.log('ATX: Starting upload plan') if (!this.cachedHitl) { + console.error('[DIAG] uploadPlan: No cached hitl') this.logging.error('ATX: UploadPlan error: No cached hitl') return null } try { + console.error('[DIAG] uploadPlan: zipping file...') const pathToZip = path.join(path.dirname(request.PlanPath), 'transformation-plan-upload.zip') await Utils.zipFile(request.PlanPath, pathToZip) + console.error('[DIAG] uploadPlan: zip done, creating upload URL...') const uploadInfo = await this.createArtifactUploadUrl( request.WorkspaceId, @@ -1039,13 +1055,14 @@ export class ATXTransformHandler { throw new Error('Failed to submit hitl') } - this.logging.log('ATX: Hitl submitted, polling for status') + console.error('[DIAG] uploadPlan: submitHitl done, polling hitl task...') const validation = await this.pollHitlTask( request.WorkspaceId, request.TransformationJobId, this.cachedHitl ) + console.error(`[DIAG] uploadPlan: pollHitlTask returned: ${validation}`) if (!validation) { throw new Error('Failed to poll hitl task') @@ -1065,12 +1082,14 @@ export class ATXTransformHandler { ReportPath: response?.ReportPath, } as AtxUploadPlanResponse } else { + console.error('[DIAG] uploadPlan: returning VerificationStatus=true') return { VerificationStatus: true, Message: validation, } as AtxUploadPlanResponse } } catch (error) { + console.error(`[DIAG] uploadPlan: CAUGHT ERROR: ${String(error)}`) this.logging.error(`ATX: UploadPlan error: ${String(error)}`) return null }