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:
@@ -2,6 +2,7 @@ import * as z from 'zod';
|
||||
import { CommunicationChannelSchema } from '../../enums/CommunicationChannel.schema';
|
||||
import { CommunicationDirectionSchema } from '../../enums/CommunicationDirection.schema';
|
||||
import { CommunicationStatusSchema } from '../../enums/CommunicationStatus.schema';
|
||||
import { CommunicationProviderSchema } from '../../enums/CommunicationProvider.schema';
|
||||
// prettier-ignore
|
||||
export const CommunicationInputSchema = z.object({
|
||||
id: z.number().int(),
|
||||
@@ -10,6 +11,7 @@ export const CommunicationInputSchema = z.object({
|
||||
channel: CommunicationChannelSchema,
|
||||
direction: CommunicationDirectionSchema,
|
||||
status: CommunicationStatusSchema,
|
||||
provider: CommunicationProviderSchema,
|
||||
body: z.string().optional().nullable(),
|
||||
callDuration: z.number().int().optional().nullable(),
|
||||
twilioSid: z.string().optional().nullable(),
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import * as z from 'zod';
|
||||
// prettier-ignore
|
||||
export const TelnyxSettingsInputSchema = z.object({
|
||||
id: z.number().int(),
|
||||
userId: z.number().int(),
|
||||
apiKey: z.string(),
|
||||
accountSid: z.string().optional().nullable(),
|
||||
phoneNumber: z.string(),
|
||||
texmlApplicationId: z.string().optional().nullable(),
|
||||
messagingProfileId: z.string().optional().nullable(),
|
||||
webhookPublicKey: z.string().optional().nullable(),
|
||||
greetingMessage: z.string().optional().nullable(),
|
||||
user: z.unknown()
|
||||
}).strict();
|
||||
|
||||
export type TelnyxSettingsInputType = z.infer<typeof TelnyxSettingsInputSchema>;
|
||||
@@ -26,6 +26,7 @@ export const UserInputSchema = z.object({
|
||||
cloudFiles: z.array(z.unknown()),
|
||||
communications: z.array(z.unknown()),
|
||||
twilioSettings: z.unknown().optional().nullable(),
|
||||
telnyxSettings: z.unknown().optional().nullable(),
|
||||
aiSettings: z.unknown().optional().nullable(),
|
||||
officeHours: z.unknown().optional().nullable(),
|
||||
officeContact: z.unknown().optional().nullable(),
|
||||
|
||||
@@ -29,6 +29,7 @@ export { CloudFileChunkInputSchema } from './CloudFileChunk.input';
|
||||
export { CommunicationInputSchema } from './Communication.input';
|
||||
export { PatientDocumentInputSchema } from './PatientDocument.input';
|
||||
export { TwilioSettingsInputSchema } from './TwilioSettings.input';
|
||||
export { TelnyxSettingsInputSchema } from './TelnyxSettings.input';
|
||||
export { AiSettingsInputSchema } from './AiSettings.input';
|
||||
export { OfficeHoursInputSchema } from './OfficeHours.input';
|
||||
export { OfficeContactInputSchema } from './OfficeContact.input';
|
||||
|
||||
Reference in New Issue
Block a user