import { BubbleBlockType } from '@typebot.io/schemas/features/blocks/bubbles/constants' import { Message } from '@typebot.io/schemas' import { computeCurrentProgress } from '../computeCurrentProgress' import { filterPotentiallySensitiveLogs } from '../logs/filterPotentiallySensitiveLogs' import { restartSession } from '../queries/restartSession' import { saveStateToDatabase } from '../saveStateToDatabase' import { startSession } from '../startSession' type Props = { origin: string | undefined message?: Message isOnlyRegistering: boolean publicId: string isStreamEnabled: boolean prefilledVariables?: Record resultId?: string textBubbleContentFormat: 'richText' | 'markdown' } export const startChat = async ({ origin, message, isOnlyRegistering, publicId, isStreamEnabled, prefilledVariables, resultId: startResultId, textBubbleContentFormat, }: Props) => { const { typebot, messages, input, resultId, dynamicTheme, logs, clientSideActions, newSessionState, visitedEdges, setVariableHistory, } = await startSession({ version: 2, startParams: { type: 'live', isOnlyRegistering, isStreamEnabled, publicId, prefilledVariables, resultId: startResultId, textBubbleContentFormat, message, }, }) let corsOrigin if ( newSessionState.allowedOrigins && newSessionState.allowedOrigins.length > 0 ) { if (origin && newSessionState.allowedOrigins.includes(origin)) corsOrigin = origin else corsOrigin = newSessionState.allowedOrigins[0] } const session = isOnlyRegistering ? await restartSession({ state: newSessionState, }) : await saveStateToDatabase({ session: { state: newSessionState, }, input, logs, clientSideActions, visitedEdges, setVariableHistory, hasEmbedBubbleWithWaitEvent: messages.some( (message) => message.type === 'custom-embed' || (message.type === BubbleBlockType.EMBED && message.content.waitForEvent?.isEnabled) ), }) const isEnded = newSessionState.progressMetadata && !input?.id && (clientSideActions?.filter((c) => c.expectsDedicatedReply).length ?? 0) === 0 return { sessionId: session.id, typebot: { id: typebot.id, theme: typebot.theme, settings: typebot.settings, }, messages, input, resultId, dynamicTheme, logs: logs?.filter(filterPotentiallySensitiveLogs), clientSideActions, corsOrigin, progress: newSessionState.progressMetadata ? isEnded ? 100 : computeCurrentProgress({ typebotsQueue: newSessionState.typebotsQueue, progressMetadata: newSessionState.progressMetadata, currentInputBlockId: input?.id, }) : undefined, } }