private async startLocalBuildExecution()

in packages/core/src/amazonqTest/chat/controller/controller.ts [1093:1243]


    private async startLocalBuildExecution(data: any) {
        const session: Session = this.sessionStorage.getSession()
        // const installationDependencies = session.shortAnswer?.installationDependencies ?? []
        // MOCK: ignoring the installation case until backend send response
        const installationDependencies: string[] = []
        const buildCommands = session.updatedBuildCommands
        if (!buildCommands) {
            throw new Error('Build command not found')
            return
        }

        this.messenger.sendBuildProgressMessage({
            tabID: data.tabID,
            messageType: 'answer-part',
            codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            message: testGenBuildProgressMessage(TestGenerationBuildStep.START_STEP),
            canBeVoted: false,
            messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
        })

        this.messenger.sendUpdatePromptProgress(data.tabID, buildProgressField)

        if (installationDependencies.length > 0 && session.listOfTestGenerationJobId.length < 2) {
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.INSTALL_DEPENDENCIES, 'current'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })

            const status = await runBuildCommand(installationDependencies)
            // TODO: Add separate status for installation dependencies
            session.buildStatus = status
            if (status === BuildStatus.FAILURE) {
                this.messenger.sendBuildProgressMessage({
                    tabID: data.tabID,
                    messageType: 'answer-part',
                    codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                    message: testGenBuildProgressMessage(TestGenerationBuildStep.INSTALL_DEPENDENCIES, 'error'),
                    canBeVoted: false,
                    messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                })
            }
            if (status === BuildStatus.CANCELLED) {
                this.messenger.sendBuildProgressMessage({
                    tabID: data.tabID,
                    messageType: 'answer-part',
                    codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                    message: testGenBuildProgressMessage(TestGenerationBuildStep.INSTALL_DEPENDENCIES, 'error'),
                    canBeVoted: false,
                    messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                })
                this.messenger.sendMessage('Installation dependencies Cancelled', data.tabID, 'prompt')
                this.messenger.sendMessage(
                    'Unit test generation workflow is complete. You have 25 out of 30 Amazon Q Developer Agent invocations left this month.',
                    data.tabID,
                    'answer'
                )
                return
            }
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.INSTALL_DEPENDENCIES, 'done'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })
        }

        this.messenger.sendBuildProgressMessage({
            tabID: data.tabID,
            messageType: 'answer-part',
            codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_BUILD, 'current'),
            canBeVoted: false,
            messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
        })

        const buildStatus = await runBuildCommand(buildCommands)
        session.buildStatus = buildStatus

        if (buildStatus === BuildStatus.FAILURE) {
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_BUILD, 'error'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })
        } else if (buildStatus === BuildStatus.CANCELLED) {
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_BUILD, 'error'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })
            this.messenger.sendMessage('Build Cancelled', data.tabID, 'prompt')
            this.messenger.sendMessage('Unit test generation workflow is complete.', data.tabID, 'answer')
            return
        } else {
            // Build successful
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_BUILD, 'done'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })
        }

        // Running execution tests
        this.messenger.sendBuildProgressMessage({
            tabID: data.tabID,
            messageType: 'answer-part',
            codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_EXECUTION_TESTS, 'current'),
            canBeVoted: false,
            messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
        })
        // After running tests
        this.messenger.sendBuildProgressMessage({
            tabID: data.tabID,
            messageType: 'answer-part',
            codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            message: testGenBuildProgressMessage(TestGenerationBuildStep.RUN_EXECUTION_TESTS, 'done'),
            canBeVoted: false,
            messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
        })
        if (session.buildStatus !== BuildStatus.SUCCESS) {
            this.messenger.sendBuildProgressMessage({
                tabID: data.tabID,
                messageType: 'answer-part',
                codeGenerationId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
                message: testGenBuildProgressMessage(TestGenerationBuildStep.FIXING_TEST_CASES, 'current'),
                canBeVoted: false,
                messageId: TestNamedMessages.TEST_GENERATION_BUILD_STATUS_MESSAGE,
            })
            await startTestGenerationProcess(session.sourceFilePath, '', data.tabID, false)
        }
        // TODO: Skip this if startTestGenerationProcess timeouts
        if (session.generatedFilePath) {
            await this.showTestCaseSummary(data)
        }
    }