From 40d00d895d4a01869294097e19bd652d912c3dd4 Mon Sep 17 00:00:00 2001 From: Muhsin Date: Thu, 2 Apr 2026 10:52:33 +0400 Subject: [PATCH] fix(agent-bot): dispatch webhook event on agent bot assignment When an AgentBot is assigned to a conversation after the first message, the bot receives no event and cannot respond. This adds ASSIGNEE_CHANGED event dispatch for agent bot assignment changes and handles it in the AgentBotListener to notify the bot via webhook. Co-Authored-By: Claude Opus 4.6 (1M context) --- app/listeners/agent_bot_listener.rb | 9 +++++++++ app/models/concerns/assignment_handler.rb | 2 +- spec/listeners/agent_bot_listener_spec.rb | 24 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/listeners/agent_bot_listener.rb b/app/listeners/agent_bot_listener.rb index ccac8005f..bf05eaad4 100644 --- a/app/listeners/agent_bot_listener.rb +++ b/app/listeners/agent_bot_listener.rb @@ -15,6 +15,15 @@ class AgentBotListener < BaseListener agent_bots_for(inbox, conversation).each { |agent_bot| process_webhook_bot_event(agent_bot, payload) } end + def assignee_changed(event) + conversation = extract_conversation_and_account(event)[0] + return unless conversation.assignee_agent_bot.present? + + conversation.inbox + payload = conversation.webhook_data.merge(event: __method__.to_s) + process_webhook_bot_event(conversation.assignee_agent_bot, payload) + end + def message_created(event) message = extract_message_and_account(event)[0] inbox = message.inbox diff --git a/app/models/concerns/assignment_handler.rb b/app/models/concerns/assignment_handler.rb index a9f529f65..ec7c62ec1 100644 --- a/app/models/concerns/assignment_handler.rb +++ b/app/models/concerns/assignment_handler.rb @@ -29,7 +29,7 @@ module AssignmentHandler def notify_assignment_change { - ASSIGNEE_CHANGED => -> { saved_change_to_assignee_id? }, + ASSIGNEE_CHANGED => -> { saved_change_to_assignee_id? || saved_change_to_assignee_agent_bot_id? }, TEAM_CHANGED => -> { saved_change_to_team_id? } }.each do |event, condition| condition.call && dispatcher_dispatch(event, previous_changes) diff --git a/spec/listeners/agent_bot_listener_spec.rb b/spec/listeners/agent_bot_listener_spec.rb index 56c478a1b..66732bcf8 100644 --- a/spec/listeners/agent_bot_listener_spec.rb +++ b/spec/listeners/agent_bot_listener_spec.rb @@ -57,6 +57,30 @@ describe AgentBotListener do end end + describe '#assignee_changed' do + let(:event_name) { 'assignee.changed' } + let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation) } + + context 'when conversation is assigned to an agent bot' do + before do + conversation.update!(assignee_agent_bot: agent_bot, assignee: nil) + end + + it 'sends webhook to the assigned agent bot' do + expect(AgentBots::WebhookJob).to receive(:perform_later).with(agent_bot.outgoing_url, + conversation.webhook_data.merge(event: 'assignee_changed')).once + listener.assignee_changed(event) + end + end + + context 'when conversation is not assigned to an agent bot' do + it 'does not send webhook' do + expect(AgentBots::WebhookJob).not_to receive(:perform_later) + listener.assignee_changed(event) + end + end + end + describe '#webwidget_triggered' do let(:event_name) { 'webwidget.triggered' }