import { BubbleBlockType } from "indite-js/schemas/features/blocks/bubbles/constants"; import { Message } from "indite-js/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 { bot, 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, bot: { id: bot.id, theme: bot.theme, settings: bot.settings, publishedAt: bot.publishedAt, }, messages, input, resultId, dynamicTheme, logs: logs?.filter(filterPotentiallySensitiveLogs), clientSideActions, corsOrigin, progress: newSessionState.progressMetadata ? isEnded ? 100 : computeCurrentProgress({ botsQueue: newSessionState.botsQueue, progressMetadata: newSessionState.progressMetadata, currentInputBlockId: input?.id, }) : undefined, }; };