classDiagram class OptionSelectPayload { +string conversation_id +string option_label +string option_value +string selected_from_message_id +UUID client_msg_id +string question_id +string option_id +validate() bool } class Message { +string id +string conversation_id +string sender_type +string sender_id +string content +string msg_type +dict extra_data +datetime created_at +__init__(...) } class OptionSelectHandler { +__init__(session_factory, ws_manager) +handle(payload, employee_id) Message -acquire_advisory_lock(db, key) void -find_duplicate(db, payload) Message -persist(db, payload, employee_id) Message -to_message_dict(message, masked) dict } class SensitiveMask { +mask_sensitive_text(text) string +mask_sensitive_value(value) string } class DifyFeedbackContext { +string feedback_type +string question_id +string option_id +string option_value +string option_label +to_inputs() dict } class SelectedOptionsSnapshotBuilder { +__init__(db) +build(conversation_id) list } class ConnectionManager { +dict active_connections +dict employee_connections +__init__() +broadcast(data) void +broadcast_to_employees(ids, data) void } class ConversationStore { +Message[] messages +sendOptionSelect(selection) void +handleNewMessage(data) void +latestSelection(question_id) Message } class MessageBubble { +Message message +isLatestSelection() bool +maskedContent() string } OptionSelectHandler --> OptionSelectPayload : validates OptionSelectHandler --> Message : creates/returns OptionSelectHandler --> SensitiveMask : masks outbound data OptionSelectHandler --> ConnectionManager : broadcasts OptionSelectHandler --> DifyFeedbackContext : creates after commit SelectedOptionsSnapshotBuilder --> Message : queries latest per question ConversationStore o-- Message : stores MessageBubble --> ConversationStore : derives latest MessageBubble --> Message : renders