private initializeFollowUps()

in packages/core/src/amazonqDoc/controllers/chat/controller.ts [223:342]


    private initializeFollowUps(): void {
        this.chatControllerMessageListeners.followUpClicked.event(async (data) => {
            const session: Session = await this.sessionStorage.getSession(data.tabID)
            const docGenerationTask = this.docGenerationTasks.getTask(data.tabID)

            const workspaceFolders = vscode.workspace.workspaceFolders
            if (workspaceFolders === undefined || workspaceFolders.length === 0) {
                return
            }

            const workspaceFolderName = vscode.workspace.workspaceFolders?.[0].name || ''

            const authState = await AuthUtil.instance.getChatAuthState()

            if (authState.amazonQ !== 'connected') {
                await this.messenger.sendAuthNeededExceptionMessage(authState, data.tabID)
                session.isAuthenticating = true
                return
            }

            const sendFolderConfirmationMessage = (message: string) => {
                this.messenger.sendFolderConfirmationMessage(
                    data.tabID,
                    message,
                    workspaceFolderName,
                    FolderSelectorFollowUps
                )
            }

            switch (data.followUp.type) {
                case FollowUpTypes.Retry:
                    if (docGenerationTask.mode === Mode.EDIT) {
                        this.enableUserInput(data?.tabID)
                    } else {
                        await this.tabOpened(data)
                    }
                    break
                case FollowUpTypes.NewTask:
                    this.messenger.sendAnswer({
                        type: 'answer',
                        tabID: data?.tabID,
                        message: i18n('AWS.amazonq.featureDev.answer.newTaskChanges'),
                        disableChatInput: true,
                    })
                    return this.newTask(data)
                case FollowUpTypes.CloseSession:
                    return this.closeSession(data)
                case FollowUpTypes.CreateDocumentation:
                    docGenerationTask.interactionType = 'GENERATE_README'
                    docGenerationTask.mode = Mode.CREATE
                    sendFolderConfirmationMessage(i18n('AWS.amazonq.doc.answer.createReadme'))
                    break
                case FollowUpTypes.ChooseFolder:
                    await this.folderSelector(data)
                    break
                case FollowUpTypes.SynchronizeDocumentation:
                    docGenerationTask.mode = Mode.SYNC
                    sendFolderConfirmationMessage(i18n('AWS.amazonq.doc.answer.updateReadme'))
                    break
                case FollowUpTypes.UpdateDocumentation:
                    docGenerationTask.interactionType = 'UPDATE_README'
                    this.messenger.sendAnswer({
                        type: 'answer',
                        tabID: data?.tabID,
                        followUps: [SynchronizeDocumentation, EditDocumentation],
                        disableChatInput: true,
                    })
                    break
                case FollowUpTypes.EditDocumentation:
                    docGenerationTask.interactionType = 'EDIT_README'
                    docGenerationTask.mode = Mode.EDIT
                    sendFolderConfirmationMessage(i18n('AWS.amazonq.doc.answer.updateReadme'))
                    break
                case FollowUpTypes.MakeChanges:
                    docGenerationTask.mode = Mode.EDIT
                    this.enableUserInput(data.tabID)
                    break
                case FollowUpTypes.AcceptChanges:
                    docGenerationTask.userDecision = 'ACCEPT'
                    await this.sendDocAcceptanceEvent(data)
                    await this.insertCode(data)
                    return
                case FollowUpTypes.RejectChanges:
                    docGenerationTask.userDecision = 'REJECT'
                    await this.sendDocAcceptanceEvent(data)
                    this.messenger.sendAnswer({
                        type: 'answer',
                        tabID: data?.tabID,
                        disableChatInput: true,
                        message: 'Your changes have been discarded.',
                        followUps: NewSessionFollowUps,
                    })
                    break
                case FollowUpTypes.ProceedFolderSelection:
                    // If a user did not change the folder in a multi-root workspace, default to the first workspace folder
                    if (docGenerationTask.folderPath === '' && isMultiRootWorkspace()) {
                        docGenerationTask.folderPath = workspaceFolderName
                    }
                    if (docGenerationTask.mode === Mode.EDIT) {
                        this.enableUserInput(data.tabID)
                    } else {
                        await this.generateDocumentation(
                            {
                                ...data,
                                message:
                                    docGenerationTask.mode === Mode.CREATE
                                        ? 'Create documentation for a specific folder'
                                        : 'Sync documentation',
                            },
                            session,
                            docGenerationTask
                        )
                    }
                    break
                case FollowUpTypes.CancelFolderSelection:
                    docGenerationTask.reset()
                    return this.tabOpened(data)
            }
        })
    }