Moves call state off conversation.additional_attributes and
conversation.identifier onto first-class Call records, one per call.
- Call is the source of truth for status, direction, duration, started_at,
accepted_by_agent, and conference_sid (in meta).
- Conference names key off Call.id (conf_account_{aid}_call_{cid}), so
multiple calls on one conversation no longer collide. lock_to_single_conversation
inboxes append each call as a new voice_call bubble in the existing thread.
- Agent identity on conference join webhooks is parsed from the Twilio
ParticipantLabel (agent-{user_id}-account-{account_id}); stateless and
independent of the /conference#create API call order.
- ConversationCard.vue derives the call badge from the latest voice_call
message, not a denormalized cache on the conversation. Removes the stale
"Call ended" state that lingered after subsequent text messages.