feat: migrate SMS/voice to Telnyx (TeXML), keep browser dial pad on Twilio

Twilio now handles only the in-browser dial pad (Access Token + browser-Device
outbound TwiML); Telnyx takes over SMS, inbound voicemail, the AI voice
conversation loop, and staff-triggered outbound calls via TeXML. Adds
TelnyxSettings model, Communication.provider discriminator, new comms/routes
modules, and a real Telnyx Settings page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 15:39:43 -04:00
co-authored by Claude Sonnet 5
parent b899659e13
commit 79ac6aaa31
463 changed files with 7823 additions and 3397 deletions
@@ -413,6 +413,7 @@ exports.Prisma.CommunicationScalarFieldEnum = {
channel: 'channel',
direction: 'direction',
status: 'status',
provider: 'provider',
body: 'body',
callDuration: 'callDuration',
twilioSid: 'twilioSid',
@@ -441,6 +442,18 @@ exports.Prisma.TwilioSettingsScalarFieldEnum = {
templates: 'templates'
};
exports.Prisma.TelnyxSettingsScalarFieldEnum = {
id: 'id',
userId: 'userId',
apiKey: 'apiKey',
accountSid: 'accountSid',
phoneNumber: 'phoneNumber',
texmlApplicationId: 'texmlApplicationId',
messagingProfileId: 'messagingProfileId',
webhookPublicKey: 'webhookPublicKey',
greetingMessage: 'greetingMessage'
};
exports.Prisma.AiSettingsScalarFieldEnum = {
id: 'id',
userId: 'userId',
@@ -660,6 +673,11 @@ exports.CommunicationStatus = exports.$Enums.CommunicationStatus = {
no_answer: 'no_answer'
};
exports.CommunicationProvider = exports.$Enums.CommunicationProvider = {
twilio: 'twilio',
telnyx: 'telnyx'
};
exports.Prisma.ModelName = {
User: 'User',
Patient: 'Patient',
@@ -687,6 +705,7 @@ exports.Prisma.ModelName = {
Communication: 'Communication',
PatientDocument: 'PatientDocument',
TwilioSettings: 'TwilioSettings',
TelnyxSettings: 'TelnyxSettings',
AiSettings: 'AiSettings',
OfficeHours: 'OfficeHours',
OfficeContact: 'OfficeContact',