import * as yup from "yup"; import { yupArray, yupBoolean, yupMixed, yupObject, yupString } from "../schema-fields"; export const conversationStatusValues = ["open", "pending", "closed"] as const; export type ConversationStatus = (typeof conversationStatusValues)[number]; export const conversationPriorityValues = ["low", "normal", "high", "urgent"] as const; export type ConversationPriority = (typeof conversationPriorityValues)[number]; export const conversationSourceValues = ["manual", "chat", "email", "api"] as const; export type ConversationSource = (typeof conversationSourceValues)[number]; export const conversationSenderTypeValues = ["user", "agent", "system"] as const; export type ConversationSenderType = (typeof conversationSenderTypeValues)[number]; export const conversationMessageTypeValues = ["message", "internal-note", "status-change"] as const; export type ConversationMessageType = (typeof conversationMessageTypeValues)[number]; export const conversationMetadataSchema = yupObject({ assignedToUserId: yupString().nullable().defined(), assignedToDisplayName: yupString().nullable().defined(), tags: yupArray(yupString().defined()).defined(), firstResponseDueAt: yupString().nullable().defined(), firstResponseAt: yupString().nullable().defined(), nextResponseDueAt: yupString().nullable().defined(), lastCustomerReplyAt: yupString().nullable().defined(), lastAgentReplyAt: yupString().nullable().defined(), }); export const conversationSenderSchema = yupObject({ type: yupString().oneOf(conversationSenderTypeValues).defined(), id: yupString().nullable().defined(), displayName: yupString().nullable().defined(), primaryEmail: yupString().nullable().defined(), }); export const conversationSummarySchema = yupObject({ conversationId: yupString().uuid().defined(), userId: yupString().uuid().nullable().defined(), teamId: yupString().uuid().nullable().defined(), userDisplayName: yupString().nullable().defined(), userPrimaryEmail: yupString().nullable().defined(), userProfileImageUrl: yupString().nullable().defined(), subject: yupString().defined(), status: yupString().oneOf(conversationStatusValues).defined(), priority: yupString().oneOf(conversationPriorityValues).defined(), source: yupString().oneOf(conversationSourceValues).defined(), lastMessageType: yupString().oneOf(conversationMessageTypeValues).defined(), preview: yupString().nullable().defined(), lastActivityAt: yupString().defined(), metadata: conversationMetadataSchema.defined(), createdAt: yupString().optional(), updatedAt: yupString().optional(), lastMessageAt: yupString().optional(), lastInboundAt: yupString().nullable().optional(), lastOutboundAt: yupString().nullable().optional(), closedAt: yupString().nullable().optional(), recordMetadata: yupMixed().nullable().optional(), }); export const conversationEntryPointSchema = yupObject({ id: yupString().uuid().defined(), channelType: yupString().defined(), adapterKey: yupString().defined(), externalChannelId: yupString().nullable().defined(), isEntryPoint: yupBoolean().defined(), metadata: yupMixed().nullable().defined(), createdAt: yupString().defined(), updatedAt: yupString().defined(), }); // Message detail responses include parent conversation context for clients. // `subject`, `status`, `priority`, and `source` are populated from the parent // Conversation by the backend mapper; they are not stored on ConversationMessage. export const conversationMessageSchema = yupObject({ id: yupString().uuid().defined(), conversationId: yupString().uuid().defined(), userId: yupString().uuid().nullable().defined(), teamId: yupString().uuid().nullable().defined(), subject: yupString().defined(), status: yupString().oneOf(conversationStatusValues).defined(), priority: yupString().oneOf(conversationPriorityValues).defined(), source: yupString().oneOf(conversationSourceValues).defined(), messageType: yupString().oneOf(conversationMessageTypeValues).defined(), body: yupString().nullable().defined(), attachments: yupArray(yupMixed().defined()).defined(), metadata: yupMixed().nullable().defined(), createdAt: yupString().defined(), sender: conversationSenderSchema.defined(), }); export const conversationListResponseSchema = yupObject({ conversations: yupArray(conversationSummarySchema.defined()).defined(), hasMore: yupBoolean().defined(), }); export const conversationDetailResponseSchema = yupObject({ conversation: conversationSummarySchema.defined(), messages: yupArray(conversationMessageSchema.defined()).defined(), entryPoints: yupArray(conversationEntryPointSchema.defined()).defined(), }); export type ConversationMetadata = yup.InferType; export type ConversationSender = yup.InferType; export type ConversationSummary = yup.InferType; export type ConversationMessage = yup.InferType; export type ConversationListResponse = yup.InferType; export type ConversationEntryPoint = yup.InferType; export type ConversationDetailResponse = yup.InferType;