import { CoreMessage, CoreToolMessage, Message, ToolInvocation } from "ai"; import { notFound } from "next/navigation"; import { auth } from "@/app/(auth)/auth"; import { Chat as PreviewChat } from "@/components/custom/chat"; import { getChatById } from "@/db/queries"; import { Chat } from "@/db/schema"; import { generateUUID } from "@/lib/utils"; function addToolMessageToChat({ toolMessage, messages, }: { toolMessage: CoreToolMessage; messages: Array; }): Array { return messages.map((message) => { if (message.toolInvocations) { return { ...message, toolInvocations: message.toolInvocations.map((toolInvocation) => { const toolResult = toolMessage.content.find( (tool) => tool.toolCallId === toolInvocation.toolCallId, ); if (toolResult) { return { ...toolInvocation, state: "result", result: toolResult.result, }; } return toolInvocation; }), }; } return message; }); } function convertToUIMessages(messages: Array): Array { return messages.reduce((chatMessages: Array, message) => { if (message.role === "tool") { return addToolMessageToChat({ toolMessage: message as CoreToolMessage, messages: chatMessages, }); } let textContent = ""; let toolInvocations: Array = []; if (typeof message.content === "string") { textContent = message.content; } else if (Array.isArray(message.content)) { for (const content of message.content) { if (content.type === "text") { textContent += content.text; } else if (content.type === "tool-call") { toolInvocations.push({ state: "call", toolCallId: content.toolCallId, toolName: content.toolName, args: content.args, }); } } } chatMessages.push({ id: generateUUID(), role: message.role, content: textContent, toolInvocations, }); return chatMessages; }, []); } export default async function Page({ params }: { params: any }) { const { id } = params; const chatFromDb = await getChatById({ id }); if (!chatFromDb) { notFound(); } // type casting const chat: Chat = { ...chatFromDb, messages: convertToUIMessages(chatFromDb.messages as Array), }; const session = await auth(); if (!session || !session.user) { return notFound(); } if (session.user.id !== chat.userId) { return notFound(); } return ; }