"use server"; import { generateText, type UIMessage } from "ai"; import { cookies } from "next/headers"; import { auth } from "@/app/(auth)/auth"; import type { VisibilityType } from "@/components/chat/visibility-selector"; import { titlePrompt } from "@/lib/ai/prompts"; import { getTitleModel } from "@/lib/ai/providers"; import { deleteMessagesByChatIdAfterTimestamp, getChatById, getMessageById, updateChatVisibilityById, } from "@/lib/db/queries"; import { getTextFromMessage } from "@/lib/utils"; export async function saveChatModelAsCookie(model: string) { const cookieStore = await cookies(); cookieStore.set("chat-model", model); } export async function generateTitleFromUserMessage({ message, }: { message: UIMessage; }) { const { text } = await generateText({ model: getTitleModel(), system: titlePrompt, prompt: getTextFromMessage(message), }); return text .replace(/^[#*"\s]+/, "") .replace(/["]+$/, "") .trim(); } export async function deleteTrailingMessages({ id }: { id: string }) { const session = await auth(); if (!session?.user?.id) { throw new Error("Unauthorized"); } const [message] = await getMessageById({ id }); if (!message) { throw new Error("Message not found"); } const chat = await getChatById({ id: message.chatId }); if (!chat || chat.userId !== session.user.id) { throw new Error("Unauthorized"); } await deleteMessagesByChatIdAfterTimestamp({ chatId: message.chatId, timestamp: message.createdAt, }); } export async function updateChatVisibility({ chatId, visibility, }: { chatId: string; visibility: VisibilityType; }) { const session = await auth(); if (!session?.user?.id) { throw new Error("Unauthorized"); } const chat = await getChatById({ id: chatId }); if (!chat || chat.userId !== session.user.id) { throw new Error("Unauthorized"); } await updateChatVisibilityById({ chatId, visibility }); }