1import { z } from "zod";
2
3export const CreateConversationDto = z.object({
4 title: z.string().max(200).optional(),
5 context: z
6 .object({
7 pageId: z.string().min(1).optional(),
8 databaseId: z.string().min(1).optional(),
9 recordId: z.string().min(1).optional(),
10 payload: z.record(z.unknown()).optional()
11 })
12 .default({})
13});
14export type CreateConversationInput = z.infer<typeof CreateConversationDto>;
15
16export const ChatDto = z.object({
17 conversationId: z.string().min(1).optional(),
18 message: z.string().min(1).max(32_000),
19 context: z
20 .object({
21 pageId: z.string().min(1).optional(),
22 databaseId: z.string().min(1).optional(),
23 recordId: z.string().min(1).optional(),
24 payload: z.record(z.unknown()).optional()
25 })
26 .optional()
27});
28export type ChatInput = z.infer<typeof ChatDto>;
29
30export const ListMessagesQuery = z.object({
31 cursor: z.string().optional(),
32 limit: z.string().optional()
33});
34export type ListMessagesInput = z.infer<typeof ListMessagesQuery>;
35
36export const RenameConversationDto = z.object({
37 title: z.string().min(1).max(200)
38});
39export type RenameConversationInput = z.infer<typeof RenameConversationDto>;
40
41
47export const AiContextDto = z
48 .object({
49 pageId: z.string().min(1).optional(),
50 blockId: z.string().min(1).optional(),
51 databaseId: z.string().min(1).optional()
52 })
53 .refine((c) => c.pageId || c.blockId || c.databaseId, { message: "context needs at least one of pageId/blockId/databaseId" });
54
55export const SendMessageDto = z.object({
56 content: z.string().min(1).max(32_000),
57 context: AiContextDto.optional(),
58 retryOf: z.string().min(1).optional()
59});
60export type SendMessageInput = z.infer<typeof SendMessageDto>;
61