in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts [186:247]
async onButtonClick(params: ButtonClickParams): Promise<ButtonClickResult> {
this.#log(`onButtonClick event with params: ${JSON.stringify(params)}`)
const session = this.#chatSessionManagementService.getSession(params.tabId)
if (
params.buttonId === 'run-shell-command' ||
params.buttonId === 'reject-shell-command' ||
params.buttonId === 'allow-tools'
) {
if (!session.data) {
return { success: false, failureReason: `could not find chat session for tab: ${params.tabId} ` }
}
// For 'allow-tools', remove suffix as permission card needs to be seperate from file list card
const messageId =
params.buttonId === 'allow-tools' && params.messageId.endsWith('_permission')
? params.messageId.replace('_permission', '')
: params.messageId
const handler = session.data.getDeferredToolExecution(messageId)
if (!handler?.reject || !handler.resolve) {
return {
success: false,
failureReason: `could not find deferred tool execution for message: ${messageId} `,
}
}
params.buttonId === 'reject-shell-command'
? (() => {
handler.reject(new ToolApprovalException('Command was rejected.', true))
this.#stoppedToolUses.add(messageId)
})()
: handler.resolve()
return {
success: true,
}
} else if (params.buttonId === 'undo-changes') {
const toolUseId = params.messageId
try {
await this.#undoFileChange(toolUseId, session.data)
this.#updateUndoButtonAfterClick(params.tabId, toolUseId, session.data)
this.#telemetryController.emitInteractWithAgenticChat('RejectDiff', params.tabId)
} catch (err: any) {
return { success: false, failureReason: err.message }
}
return {
success: true,
}
} else if (params.buttonId === 'undo-all-changes') {
const toolUseId = params.messageId.replace('_undoall', '')
await this.#undoAllFileChanges(params.tabId, toolUseId, session.data)
return {
success: true,
}
} else if (params.buttonId === 'stop-shell-command') {
this.#stoppedToolUses.add(params.messageId)
await this.#renderStoppedShellCommand(params.tabId, params.messageId)
return { success: true }
} else {
return {
success: false,
failureReason: 'not implemented',
}
}
}